2011-02-03 218 views
3

我有一个包含一些随机位图数据的“位图”类型。我已经针对亮度,颜色,饱和度和色调自己编写了自己的调整,这些调整分别针对每一位进行,而且毫不奇怪,这种调整非常缓慢。如何在.NET中使用ColorMatrix来更改亮度,颜色,饱和度,色调

在我的研究中,我发现使用矩阵可以非常快地调整这些。另外,.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

最后一行是'亮度'。目前,我只是将它全部设置为亮度。 (范围0-> 1) – DanTheMan 2011-02-03 17:12:16

回答

4

http://www.graficaobscura.com/matrix/index.html有一些细节,但你可能想发布你的其他代码。每像素执行操作非常普遍,您通常不会遇到此类操作的性能问题。 .NET的Bitmap.SetPixel非常慢。代码项目中有一个很好的C# image processing series,显示了更快的方法。我没有使用C++ -cli的经验,但我会看看。

+0

感谢您的参考。我设法做了比我想象的更多的使用矩阵。唯一(必不可少的)是'对比',但C#示例解决了这个问题。我做了一些测试,是的,它主要是'SetPixel',速度很慢。几千次这样做_really_减慢了代码! – DanTheMan 2011-02-13 18:18:42

1

对颜色矩阵可以做什么有限制。

基本上,您提供的矩阵实际上是一个同质四维变换。这是一个很大的词,这意味着你可以旋转,缩放,翻译你的颜色的不同频道(R G B A)。

查看Transformation Matrix了解更多详情。

+0

亮度对应于缩放,而色调的改变对应于旋转。饱和度对应于相对于远离原点的缩放,我相信,这也可以表示为缩放,然后是平移。 – 2011-02-03 23:52:22

相关问题