如何使用ColorMatrix为图像的每个像素设置相同(恒定)的色调值?

时间:2011-03-23 14:45:44

标签: c# android actionscript-3 hsl colormatrix

我正在尝试使用ColorMatrix为整个图像设置一个恒定的色调值。我的目标是使整个图像看起来具有相同的颜色,而不会失去任何区域的亮度。我找到了一种通过使用ColorMatrix来移动图像的色调值的方法,但我找不到任何方法来为所有像素设置相同的色调值。我可以通过迭代图像的每个像素来做到这一点,但这种方法太慢了。我不确定是否可以使用ColorMatrix进行此操作,并且我对除ColorMatrix方法之外的可能解决方案持开放态度。

Input Image

Hue shifting output Image*

Desired output Image**

*这可以使用颜色矩阵

完成

**我可以通过迭代像素来完成此操作,但不能使用ColorMatrix

PS:我试图在Android上做这个,但我认为问题与android没有直接关系,因为ColorMatrix方法在Flash,C#等其他平台上很常见。

5 个答案:

答案 0 :(得分:3)

这里不太熟悉,但我相信这个链接可以帮助: http://www.graficaobscura.com/matrix/index.html 它是c代码,所以你必须翻译C - > ColorMatrix,但在最后一段有操作

Hue Rotation While Preserving Luminance

这似乎正是你要找的。

答案 1 :(得分:3)

查看QColorMatrix,其中有一个名为RotateHue的ColorMatrix例程。 Source是使用C ++编写的,但是可以移植到其他语言中(过去我将其中的部分内容移植到了.NET中,并且效果很好)。

答案 2 :(得分:2)

我认为没有办法用ColorMatrix做完全你要求的东西。听起来你想做的是从RGB转换到HSL色彩空间,在所有像素上设置H常数,并从HSL转换回RGB。这些颜色空间变换不是线性的,不能用矩阵表示。由于这些空间以不同的方式参数化颜色,我还怀疑RGB-> HSL-> RGB会发生一些降级。

我认为使用ColorMatrix可以实现的最接近的方法是使用一个转换为灰度,另一个用于对RGB值进行加权(对它们进行着色)。这种东西经常被用来制作假棕褐色调的照片,但这不是你要求的。

答案 3 :(得分:2)

我在Flash中做了一个快速示例(此问题标记为ActionScript),不确定这是否是您要查找的内容:

http://megaswf.com/serve/1047061

代码:

import com.greensock.*; 
import com.greensock.easing.*;
import flash.events.MouseEvent;

colorButton.addEventListener(MouseEvent.CLICK, onColor);
resetButton.addEventListener(MouseEvent.CLICK, onReset);

function onColor(e:MouseEvent):void {
    TweenMax.to(mc, 1, {colorMatrixFilter:{colorize:0x0099ff, amount:1}});
}

function onReset(e:MouseEvent):void {
    TweenMax.to(mc, 1, {colorMatrixFilter:{colorize:0x0099ff, amount:0}});
}

答案 4 :(得分:1)

这是一个快速的方法,如果你想设置hue,比方说,h(0.5,0.2,0.3)。

var matrix:Array = new Array();
matrix = matrix.concat([.5, .5, .5, 0, 0]);
matrix = matrix.concat([.2, .2, .2, 0, 0]);
matrix = matrix.concat([.3, .3, .3, 0, 0]);
matrix = matrix.concat([0, 0, 0, 1, 0]);
var filter:ColorMatrixFilter = new ColorMatrixFilter(matrix);

image.filters = [filter];

我不确定它会完全尊重亮度,但它可能满足您的需求!