我有一个灰度图像,需要用5种颜色的渐变值绘制。光像素应该从渐变中获得较浅的颜色,较暗的像素应该变得更暗。
如果渐变以黄色开始并以红色结束,则白色像素将为黄色,黑色像素为红色,其中一切都位于渐变之间。
可以用ColorMatrix完成吗?
答案 0 :(得分:2)
您提到了“五种颜色”,但也提到了从红色到黄色的渐变。
为了说明基本思想,我们可以从字节数组生成一个Color数组,其中字节数组表示原始图像的8位灰度值。
要在给定灰度值(8位)的情况下找到新的渐变颜色(r,g,b),请执行以下操作:
将字节数组转换为Color数组的示例代码:
byte[] bytes = getImageBytes();
Color[] colors = new Color[bytes.Length];
for(int i = 0; i < bytes.Length; i++)
{
colors[i] = Color.FromArgb(255, bytes[i], 0);
}
要快速执行此操作,请使用“锁定/解锁位”代码并直接操作字节值。
答案 1 :(得分:2)
你想要的是在最简单的情况下在3d中的5个点之间的线性插值。两种颜色{r1,g1,b1}和{r2,g2,b2}之间的直接颜色渐变,就像你将走到3d中连接点{r1,g1,b1}和{r2,g2, B2}。 当您的灰度值在区间[0,1]中时,如果您有灰度级0,则需要颜色为{r1,g1,b1},如果有灰度值,则需要{r2,g2,b2}灰度级1.问题是如何计算两者之间的颜色:
想想简单的学校矢量分析。 c1是点{r1,g1,b1},c2是{r2,g2,b2}。从c1开始,沿向量c2-c1的方向前进:outColor = c1 + gray *(c2-c1)
或等效
outColor =(1-grey) c1 + grey c2
Remenber,灰色必须位于区间[0,1]。否则你必须重新缩放它。这是两点之间的简单线性插值,当然可以根据需要扩展为多种颜色。
对于五种颜色,方法基本相同。这里有5种随机选择的颜色:
{{0.273372, 0.112407, 0.0415183},
{0.79436, 0.696305, 0.167884},
{0.235083, 0.999163, 0.848291},
{0.295492, 0.780062, 0.246481},
{0.584883, 0.460118, 0.940826}}
你必须知道的两件重要事情:
如果您想获得给定灰度值的颜色,首先需要提取两个周围的rgb点。例如,如果你想得到灰色= 0.1的颜色,它将是第一个和第二个rgb点。
您必须根据您在渐变中使用的颜色数量重新缩放灰度值。看看图像,有5种颜色,你有4个不同的两点插值间隔。如果要使上述颜色公式有效,则必须将每个颜色间隔的灰度值重新调整为[0,1]。
备注:这当然不是C#中实现的解决方案,但您的问题建议,创建相同大小的彩色图像不是您的问题。计算每个灰度值的颜色值是着色的关键。
答案 2 :(得分:0)
您可以简单地迭代灰度图像的所有像素并获取它的亮度和Alpha值(使用LINQ最简单)。然后你采用你想要的颜色,并使用它的色相和饱和度和亮度。
现在,您可以通过获取Gray.Alpha,Color.Hue,Color.Saturation以及Gray.Brightness和Color.Brightness的组合来创建新颜色,并将此颜色应用于灰度图像中的像素。
第一个棘手的部分是从Alpha,Hue,Saturation和Brigthness创建一种颜色,但你只需要this function ;-)。
最后一个棘手的部分是将灰色和颜色的亮度结合起来,并留给读者练习。 ; - )