如何在.NET中使用ColorMatrix来改变亮度、颜色、饱和度、色调

3
我有一个包含一些随机位图数据的“位图”类型。我已经自己编写了亮度、颜色、饱和度和色调的调整,它们分别作用于每个位,但是很慢。
在我的研究中,我注意到使用矩阵可以非常快速地进行这些调整。此外,.NET有一个ColorMatrix,您可以在DrawImage()时应用矩阵效果。
我们设置的矩阵如下(来自MSDN网站):
float[][] colorMatrixElements = { 
new float[] {2,  0,  0,  0, 0},        // red scaling factor of 2
new float[] {0,  1,  0,  0, 0},        // green scaling factor of 1
new float[] {0,  0,  1,  0, 0},        // blue scaling factor of 1
new float[] {0,  0,  0,  1, 0},        // alpha scaling factor of 1
new float[] {.2f, .2f, .2f, 0, 1}};    // three translations of 0.2

但是我一直没有找到合适的范围或者这些数字具体是做什么用的。我不知道如何调整亮度、颜色、饱和度和色调。

有人能帮忙吗?我是不是错过了一些好的文档资料?

谢谢!


最后一行是“亮度”。目前,我只是将所有内容设置为亮度。(范围为0->1) - DanTheMan
2个回答

4

这里有一些详细信息,位于http://www.graficaobscura.com/matrix/index.html 但您可能需要发布其他代码。对每个像素进行操作非常普遍,对于此类操作,通常不会遇到性能问题。然而,.NET的Bitmap.SetPixel很慢。在codeproject上有一系列很好的C#图像处理文章展示了更快的方法。我没有使用c++-cli的经验,但我会去看一下。


感谢提供的参考资料。使用矩阵,我完成了比预期更多的工作。唯一无法完成的是“对比度”,但是C#示例解决了这个问题。经过测试,主要是“SetPixel”导致速度变慢。执行几千次会严重拖慢代码! - DanTheMan

1

颜色矩阵有其限制。

基本上,您提供的矩阵实际上是一个同次4维变换。这意味着您可以旋转、缩放、平移颜色的不同通道(R G B A)。

有关更多详细信息,请参见变换矩阵


亮度对应于缩放,色调变化对应于旋转。饱和度对应于相对于远离原点的点的缩放,我认为这也可以表示为缩放后跟随平移。 - Ben Voigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接