我使用此link为我的程序添加调整图像亮度的功能。此代码没问题,但调整亮度需要一些时间(图像文件大小为1.8mb)。当我尝试较低质量的图像时,它会立即调整图像(图像文件大小为100KB)。有没有有效的方法来调整图像的亮度。
答案 0 :(得分:3)
代码似乎在常规GetPixel
上使用SetPixel
和Bitmaps
。这是一个坏主意,因为它太慢了。
要操纵Bitmap
的单个像素,必须将其锁定(Get / SetPixel在幕后执行)并逐个像素地执行此操作意味着对于1000x1000大小的图像,百万次锁定/解锁必须执行操作。这会产生巨大的开销。
方法一
避免这种情况的一种方法是使用LockBits
函数锁定整个位图。现在我们可以遍历像素并修改它们。
关于这种方法的两点说明:
我们现在访问的是每个像素的原始字节,即每个通道分别为:BGR或BGRA,具体取决于像素格式。这意味着通道与Color方法的常用RGB / ARGB格式物理反转。
对于某些示例,您可能希望浏览some of these posts。请特别注意this one使用委托以允许灵活操作!
(请注意,有些帖子使用2个甚至3个锁定的位图,因为它们的目的是组合图像..)
方法二
另一种绕过锁定像素的开销的方法是现成的位图类,它们通过将自身锁定为一个整体来提供帮助。 Here和here是我没有尝试过的例子。
方法三
最后有一种非常优雅的图像处理方法,它既简单又快速;专业制作以获得最佳效果:您可以设置ColorMatrix
。
它可以让你改变亮度,伽玛,色调,然后一些。 Here is a very nice introduction
唯一的缺点是,仅限于某些固定操作,因此您无法为其他奇特的内容创建自定义过滤器,例如photoshop-type layer modes或其他内容,尤其是那些需要处理相邻像素的内容,例如模糊..
但如果你想要的只是改变亮度,这就是我的建议!