2017-09-04 163 views
0

我用这个link来增加我的程序调整图像亮度的能力。此代码是可以的,但需要时间调整亮度(图像文件大小1.8mb)。当我尝试较低质量的图像时,它会立即调整图像(图像文件大小为100KB)。是否有任何有效的方法来调整图像的亮度。大图像的图像亮度c#

+0

您可以使用更低级别的方法对其进行编辑。 http://www.vcskicks.com/fast-image-processing.php – leAthlon

+0

与大型图像(100 kB vs 1.8 MB)相比,您在处理非常小的图像时总会有所不同。那么你对这个问题的解决方案有什么期望? – Fildor

+1

该代码似乎在常规位图上使用SetPixel。这是一个糟糕的主意,因为它太慢了。而是使用a)LockBits或b)FastBitmap或c)ColorMatrix!大量的例子在这里和网络.. – TaW

回答

2

该代码似乎使用GetPixelSetPixel定期Bitmaps。这是一个坏主意,因为它太慢了。

要操纵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或其他,特别是那些需要处理相邻像素的过滤器。模糊..

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