7

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

输入图像

色调偏移输出图像*

所需的输出图像**

*这可以用颜色矩阵来完成

** 我可以用迭代像素做到这一点,但不能用 ColorMatrix

PS:我正在尝试在 Android 上执行此操作,但我相信这个问题与 android 没有直接关系,因为 ColorMatrix 方法在 Flash、C# 等其他平台上很常见。

4

5 回答 5

3

查看QColorMatrix,它有一个名为RotateHue. 源代码是 C++,但可以移植到其他语言(过去我已经将它的一部分移植到 .NET 并且效果很好)。

于 2011-03-26T00:14:47.080 回答
3

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

Hue Rotation While Preserving Luminance

这似乎是您正在寻找的。

于 2011-03-23T15:17:22.517 回答
2

我认为没有办法完全按照您的要求使用 ColorMatrix。听起来您想要做的是从 RGB 转换为 HSL 颜色空间,在所有像素上设置 H 常数,然后从 HSL 转换回 RGB。这些色彩空间转换不是线性的,不能用矩阵表示。由于这些空间参数化颜色的方式不同,我还怀疑在执行 RGB->HSL->RGB 时可能会发生一些退化。

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

于 2011-03-26T00:24:43.187 回答
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}});
}
于 2011-03-30T07:12:46.547 回答
1

这是一个快速的方法,如果你想将色调设置为,比如说,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];

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

于 2011-03-23T15:25:08.303 回答