如何在 .NET 中使用 ColorMatrix 更改亮度、颜色、饱和度、色调
Posted
技术标签:
【中文标题】如何在 .NET 中使用 ColorMatrix 更改亮度、颜色、饱和度、色调【英文标题】:How to use ColorMatrix in .NET to change Brightness, Color, Saturation, Hue 【发布时间】:2011-02-03 16:06:52 【问题描述】:我有一个包含一些随机位图数据的“位图”类型。我已经为亮度、颜色、饱和度和色相编写了自己的调整,这些调整分别作用于每一位,不出所料,它非常慢。
在我的研究中,我注意到使用矩阵可以非常快速地调整这些。此外,.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) 【参考方案1】:http://www.graficaobscura.com/matrix/index.html 有一些详细信息,但您可能想发布您的其他代码。按像素进行操作非常常见,通常不会遇到此类操作的性能问题。 .NET 的 Bitmap.SetPixel 是出了名的慢。 codeproject 上有一个很好的C# image processing series,它显示了一种更快的方法。我没有使用 c++-cli 的经验,但我会看看。
【讨论】:
感谢您的参考。我设法做的比我想象的要多得多。我唯一不能做到的(必需的)是“对比”,但 C# 示例解决了这个问题。我做了一些测试,是的,主要是“SetPixel”速度很慢。这样做几千次真的会减慢代码速度!【参考方案2】:使用颜色矩阵可以做的事情是有限制的。
基本上,您提供的矩阵实际上是同质的 4 维变换。这是一个大词,意味着您可以旋转、缩放、转换颜色的不同通道 (R G B A)。
更多详情请见Transformation Matrix。
【讨论】:
亮度对应缩放,色相变化对应旋转。我相信,饱和度对应于相对于远离原点的点的缩放,也可以表示为缩放后平移。以上是关于如何在 .NET 中使用 ColorMatrix 更改亮度、颜色、饱和度、色调的主要内容,如果未能解决你的问题,请参考以下文章
怎样才能得到ffmpeg的colorchannelmixer的colormatrix