我正在改变基于计算的图像中每个像素的颜色值。问题在于,我的机器需要5秒钟才能完成1000x1333图像,我正在寻找一种方法来优化它,使其更快。如何使用ColorMatrix计算颜色值?
我认为ColorMatrix
可能是一个选项,但我很难弄清楚如何获得一组像素RGB值,然后使用它来计算并设置新的像素值。如果我只是用ColorMatrix修改(乘,减等)原始值,我可以看到如何做到这一点,但现在如何使用像素返回值来使用它来计算和新值。
例如:
Sub DarkenPicture()
Dim clrTestFolderPath = "C:\Users\Me\Desktop\ColorTest\"
Dim originalPicture = "original.jpg"
Dim Luminance As Single
Dim bitmapOriginal As Bitmap = Image.FromFile(clrTestFolderPath + originalPicture)
Dim Clr As Color
Dim newR As Byte
Dim newG As Byte
Dim newB As Byte
For x = 0 To bitmapOriginal.Width - 1
For y = 0 To bitmapOriginal.Height - 1
Clr = bitmapOriginal.GetPixel(x, y)
Luminance = ((0.21 * (Clr.R) + (0.72 * (Clr.G)) + (0.07 * (Clr.B))/ 255
newR = Clr.R * Luminance
newG = Clr.G * Luminance
newB = Clr.B * Luminance
bitmapOriginal.SetPixel(x, y, Color.FromArgb(newR, newG, newB))
Next
Next
bitmapOriginal.Save(clrTestFolderPath + "colorized.jpg", ImageFormat.Jpeg)
End Sub
Luminance
的值是所计算出的一个。我知道我可以分别将ColorMatrix
的M00,M11,M22设置为0,0,0,然后在M40,M41,M42中设置一个新值,但是该新值是基于该像素分量的值乘法和相加计算的(((0.21 * (Clr.R) + (0.72 * (Clr.G)) + (0.07 * (Clr.B))
,结果是 - Luminance
- 乘以颜色分量)。
这是甚至可能与ColorMatrix
?
谢谢,我会检查了这一点。我正在使用VB.NET,所以我明白编组并不像VB中的不安全锁/解锁位在C#中那样快。尽管如此,我会试着让这个运行。 – 2010-06-16 06:36:35
您可以将一个C#项目添加到您的VB.Net解决方案中,并将其添加到该项目中,然后从您的VB代码中调用该项目。我猜你会得到大约30倍速度提升的地方。 – 2010-06-16 09:28:05