大图像的图像亮度 c#

Image brightness for big images c#

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

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

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

方法一

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

关于此方法的两个注意事项:

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

  • 要遍历物理位图像素行,我们还需要添加一些 stride to each row, which pads the rows to a multiple of 4 bytes. Also see here

对于某些示例,您可能需要浏览 some of these posts. Note especially ,它使用委托来允许灵活的操作!

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

方法二

另一种解决逐个锁定像素开销的方法是现成的位图 类,它有助于将自身作为一个整体锁定。 Here and here 是我自己没有尝试过的例子。

方法三

终于有一个非常优雅的图像处理方法,既简单又快速;还经过专业制作以获得最佳效果:您可以设置 ColorMatrix.

它可以让您更改亮度、伽马、色调等等。 Here is a very nice introduction.

唯一的缺点是,它仅限于一些固定的操作,所以你不能为其他花哨的东西创建自定义过滤器,比如 photoshop-type layer modes 或其他,特别是那些需要处理相邻像素的东西,例如用于模糊..

但如果你只想改变亮度,这就是我推荐的!