如何在 .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 更改亮度、颜色、饱和度、色调的主要内容,如果未能解决你的问题,请参考以下文章

Android Matrix矩阵详解

怎样才能得到ffmpeg的colorchannelmixer的colormatrix

了解使用 ColorMatrix 和 ColorMatrixColorFilter 修改 Drawable 的色调

Android图片色彩处理ColorMatrix

如何使用 GPUImageLibrary“减去”滤色器?

浅谈android中图片处理之色彩特效处理ColorMatrix