【问题标题】:Image brightness for big images c#大图像的图像亮度c#
【发布时间】:2017-09-04 07:09:06
【问题描述】:

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

【问题讨论】:

  • 您可以使用更底层的方法对其进行编辑。 vcskicks.com/fast-image-processing.php
  • 在处理非常小的图像与处理大图像(100 kB 与 1.8MB)时,您总是会有所不同。那么您对这个问题的解决方案有何期望?
  • 代码似乎在常规位图上使用了 SetPixel。这是一个坏主意,因为它太慢了。而是使用 a) LockBits 或 b) FastBitmap 或 c) ColorMatrix!这里和网络上有很多例子..
  • @TaW 好的,谢谢。目前正在寻找锁头。你能把你的评论移到回答,这样我就可以标记我们回答了

标签: c# image brightness


【解决方案1】:

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

要操作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 或其他,尤其是那些需要处理相邻像素的过滤器,例如用于模糊..

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

【讨论】:

    猜你喜欢
    • 2021-11-09
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多