我正在尝试使用ColorMatrix为整个图像设置一个恒定的色调值。我的目标是使整个图像看起来具有相同的颜色,而不会失去任何区域的亮度。我找到了一种通过使用ColorMatrix来移动图像的色调值的方法,但我找不到任何方法来为所有像素设置相同的色调值。我可以通过迭代图像的每个像素来做到这一点,但这种方法太慢了。我不确定是否可以使用ColorMatrix进行此操作,并且我对除ColorMatrix方法之外的可能解决方案持开放态度。
*这可以使用颜色矩阵
完成**我可以通过迭代像素来完成此操作,但不能使用ColorMatrix
PS:我试图在Android上做这个,但我认为问题与android没有直接关系,因为ColorMatrix方法在Flash,C#等其他平台上很常见。答案 0 :(得分:3)
这里不太熟悉,但我相信这个链接可以帮助: http://www.graficaobscura.com/matrix/index.html 它是c代码,所以你必须翻译C - > ColorMatrix,但在最后一段有操作
Hue Rotation While Preserving Luminance
这似乎正是你要找的。 p>
答案 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];
我不确定它会完全尊重亮度,但它可能满足您的需求!