65.9K
CodeProject 正在变化。 阅读更多。
Home

一个用于调整亮度和对比度的图像预览对话框

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.29/5 (21投票s)

2003 年 5 月 1 日

2分钟阅读

viewsIcon

117073

downloadIcon

4665

一个用于调整亮度和对比度的图像预览对话框

Sample Image - ImagePreview.jpg

引言

在我的一个项目中,我需要一个图像预览对话框来调整亮度和对比度。以下是我创建的一个示例。它不依赖于任何其他图形库。不需要 GDI+。

为什么要这样做?

刷新大型图像文件有时会占用大量的 RAM 和处理器资源。更有效的方法是从完整图像中取样,并在预览对话框中显示效果。

在我的示例中,我从资源文件加载位图。但是,您可以轻松地从您的完整图像加载一个 100x100 的样本,向用户显示调整效果。我见过一些程序实现了允许您在完整图像上拖动光标框来获取样本的功能。

通常,不建议将图像重新采样/调整大小为 100x100 的位图并将其放入预览窗口。用户将无法清楚地看到最终效果。

如何做到?

示例项目中有两个重要的文件

  • DialogBrightnessContrast.h
  • DialogBrightnessContrast.cpp

您应该查看 BrightnessAndContrast() 函数。它循环遍历位图中的每个像素并更改其 RGB 值。

   for (m_nY = 0; m_nY < m_bmp.bmHeight; m_nY++) {
        for (m_nX = 0; m_nX < m_bmp.bmWidth; m_nX++) {
            m_crC = m_dcSource.GetPixel(m_nX, m_nY);

            m_nC = GetRValue(m_crC) + nStepB;
            m_nC = floor((m_nC - GREY) * dStepC) + GREY;
            m_nR = (m_nC < 0x00) ? 0x00 : (m_nC > 0xff) ? 0xff : m_nC; 
           
            m_nC = GetGValue(m_crC) + nStepB;
            m_nC = floor((m_nC - GREY) * dStepC) + GREY;
            m_nG = (m_nC < 0x00) ? 0x00 : (m_nC > 0xff) ? 0xff : m_nC;
 
            m_nC = GetBValue(m_crC) + nStepB;           
            m_nC = floor((m_nC - GREY) * dStepC) + GREY;
            m_nB = (m_nC < 0x00) ? 0x00 : (m_nC > 0xff) ? 0xff : m_nC;
  
            m_crC = m_nR + (m_nG << 8) + (m_nB << 16);
            m_dcOffScreen.SetPixel(m_nX, m_nY, m_crC);
       }
   }

要调整亮度,您需要增加颜色的所有 RGB 值。要调整对比度,您需要夸大 RGB 值与 GREY(128, 128, 128) 的差异。

如果您有执行反转、色调和其他图形操作的库,您可以在此处使用它们并修改预览图像。

最后的寄语

这并不是将滤镜应用于整个图像的最有效方法。但是,对于预览对话框来说已经足够了。当您单击“确定”按钮时,您应该将亮度和对比度值传递给您的超级 JPG、GIF、PNG 引擎,以生成最佳优化的照片。

愿代码与你同在。

© . All rights reserved.