大图像的图像亮度c#

时间:2017-09-04 07:09:07

标签: c# image brightness

我使用此link为我的程序添加调整图像亮度的功能。此代码没问题,但调整亮度需要一些时间(图像文件大小为1.8mb)。当我尝试较低质量的图像时,它会立即调整图像(图像文件大小为100KB)。有没有有效的方法来调整图像的亮度。

1 个答案:

答案 0 :(得分:3)

代码似乎在常规GetPixel上使用SetPixelBitmaps。这是一个坏主意,因为它太慢了。

要操纵Bitmap的单个像素,必须将其锁定(Get / SetPixel在幕后执行)并逐个像素地执行此操作意味着对于1000x1000大小的图像,百万次锁定/解锁必须执行操作。这会产生巨大的开销。

方法一

避免这种情况的一种方法是使用LockBits函数锁定整个位图。现在我们可以遍历像素并修改它们。

关于这种方法的两点说明:

  • 我们现在访问的是每个像素的原始字节,即每个通道分别为:BGR或BGRA,具体取决于像素格式。这意味着通道与Color方法的常用RGB / ARGB格式物理反转

  • 要遍历物理位图像素行,我们还需要为每一行添加一些stride,这会将行填充为4个字节的倍数。还see here

对于某些示例,您可能希望浏览some of these posts。请特别注意this one使用委托以允许灵活操作!

(请注意,有些帖子使用2个甚至3个锁定的位图,因为它们的目的是组合图像..)

方法二

另一种绕过锁定像素的开销的方法是现成的位图类,它们通过将自身锁定为一个整体来提供帮助。 Herehere是我没有尝试过的例子。

方法三

最后有一种非常优雅的图像处理方法,它既简单又快速;专业制作以获得最佳效果:您可以设置ColorMatrix

它可以让你改变亮度,伽玛,色调,然后一些。 Here is a very nice introduction

唯一的缺点是,仅限于某些固定操作,因此您无法为其他奇特的内容创建自定义过滤器,例如photoshop-type layer modes或其他内容,尤其是那些需要处理相邻像素的内容,例如模糊..

但如果你想要的只是改变亮度,这就是我的建议!