大图像的图像亮度 c#
Image brightness for big images c#
我使用这个 link 来为我的程序添加调整图像亮度的功能。这段代码没问题,但调整亮度需要时间(图像文件大小 1.8mb)。当我尝试较低质量的图像时,它会立即调整图像(图像文件大小 100KB)。有什么有效的方法可以调整图片的亮度吗
该代码似乎在常规 Bitmaps
上使用了 GetPixel
和 SetPixel
。这是个坏主意,因为它太慢了。
要操作 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 或其他,特别是那些需要处理相邻像素的东西,例如用于模糊..
但如果你只想改变亮度,这就是我推荐的!
我使用这个 link 来为我的程序添加调整图像亮度的功能。这段代码没问题,但调整亮度需要时间(图像文件大小 1.8mb)。当我尝试较低质量的图像时,它会立即调整图像(图像文件大小 100KB)。有什么有效的方法可以调整图片的亮度吗
该代码似乎在常规 Bitmaps
上使用了 GetPixel
和 SetPixel
。这是个坏主意,因为它太慢了。
要操作 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 或其他,特别是那些需要处理相邻像素的东西,例如用于模糊..
但如果你只想改变亮度,这就是我推荐的!