我正在尝试过滤位图图像以增加或减少色相、饱和度和亮度值。我的代码运行得很好,但速度较慢。我在内存中锁定了两个位图,原始源和当前目标。用户可以移动各种滑动条控件来修改每个值,然后将其转换为HSL值。例如,滑动条上的值对应于-1.0到1.0的范围。每次触发滑动条值更改的事件时,我都会运行一个函数,该函数锁定目标位图并使用源位图应用HSL值,然后将结果存储在目标位图中。完成后,我解锁目标位图并在屏幕上绘制图像。之前,由于我进行的是按字节操作,所以我使用了查找表来进行其他过滤器。然而,我不知道如何使用HSL来应用它。这是我正在使用的代码:
byte red, green, blue;
for (int i = 0; i < sourceBytes.Length; i += 3)
{
blue = sourceBytes[i];
green = sourceBytes[i + 1];
red = sourceBytes[i + 2];
Color newColor = Color.FromArgb(red, green, blue);
if (ModifyHue)
newColor = HSL.ModifyHue(newColor, Hue);
if (ModifySaturation)
newColor = HSL.ModifySaturation(newColor, Saturation);
if (ModifyLightness)
newColor = HSL.ModifyBrightness(newColor, Lightness);
destBytes[i] = newColor.B;
destBytes[i + 1] = newColor.G;
destBytes[i + 2] = newColor.R;
}
这是我的修改亮度函数:
public static Color ModifyBrightness(Color color, double brightness)
{
HSL hsl = FromRGB(color);
hsl.L *= brightness;
return hsl.ToRGB();
}
简单来说,如果亮度滑块在正中间,其值为0,我在传递到函数中时将其转换为“1.0”,这样它将乘以1.0,这意味着它不会改变亮度。如果将滑块拖到最右边,它的值将为100,这将导致修饰符为2.0,所以我将光度值乘以2.0来使其加倍。
ImageAttributes
类可以轻松实现你提到的所有效果,只需一次调用DrawImage
即可。我不认为有必要重新发明轮子。以下是一些链接:http://www.graficaobscura.com/matrix/index.html http://www.codeproject.com/Articles/3772/ColorMatrix-Basics-Simple-Image-Color-Adjustment - Rotem