C# 如何为每个像素设置相同(恒定)的色调值';使用ColorMatrix对图像进行着色?

C# 如何为每个像素设置相同(恒定)的色调值';使用ColorMatrix对图像进行着色?,c#,android,actionscript-3,hsl,colormatrix,C#,Android,Actionscript 3,Hsl,Colormatrix,我试图使用ColorMatrix为整个图像设置一个恒定的色调值。我的目标是使整个图像看起来具有相同的颜色,而不丢失任何区域的亮度。我找到了一种通过使用ColorMatrix移动图像色调值的方法,但我找不到任何方法为所有像素设置相同的色调值。我可以迭代图像的每个像素,但这种方法太慢了。我不确定是否有可能用ColorMatrix实现,我愿意接受ColorMatrix方法以外的可能解决方案 *这可以通过颜色矩阵实现 **我可以用迭代像素来实现这一点,但不能用ColorMatrix PS:我正试图

我试图使用ColorMatrix为整个图像设置一个恒定的色调值。我的目标是使整个图像看起来具有相同的颜色,而不丢失任何区域的亮度。我找到了一种通过使用ColorMatrix移动图像色调值的方法,但我找不到任何方法为所有像素设置相同的色调值。我可以迭代图像的每个像素,但这种方法太慢了。我不确定是否有可能用ColorMatrix实现,我愿意接受ColorMatrix方法以外的可能解决方案

*这可以通过颜色矩阵实现

**我可以用迭代像素来实现这一点,但不能用ColorMatrix


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

这里不太熟悉,但我相信这个链接可以帮助: 这是c代码,所以您必须翻译c->ColorMatrix,但在最后一段中有一个操作

Hue Rotation While Preserving Luminance

这似乎就是你想要的。

如果你想将色调设置为h(0.5,0.2,0.3),这里有一个快速的方法


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

签出,它有一个名为
RotateHue
的ColorMatrix例程。源是C++,但它是可移植到其他语言的(我过去把它的一部分移植到.NET上,它工作得很好)。听起来你想做的是从RGB转换到HSL颜色空间,在所有像素上设置H常量,然后从HSL转换回RGB。这些颜色空间变换不是线性的,不能用矩阵表示。由于这些空间参数化颜色的方式不同,我还怀疑在使用RGB->HSL->RGB时可能会出现一些退化


我认为使用ColorMatrix最接近的方法是使用一个转换为灰度,另一个对RGB值进行加权(着色)。这类东西通常用于制作假乌贼墨色调的照片,但这不是你想要的。

我在Flash中制作了一个快速示例(这个问题被标记为ActionScript),不确定这是否是你想要的:

守则:

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}});
}

感谢您的回答,不幸的是,这只是更改rgb而不是色调值。好吧,使用此解决方案,每个像素都有相同的色调。如果速度是个问题,您是否考虑过使用OpenGL的片段着色器?
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}});
}