我想将黑白图像着色。
为此,我使用ColorMatrix。 例如,当我想将图像着色为红色时,我使用此ColorMatrix:
1,0,0,0,0,
0,1,0,0,0,
0,0,1,0,0,
0,0,0,1,0,
1,0,0,0,0,
现在我想从颜色图表中选择颜色,例如从这样的颜色图表中选择:
我的计划是使用GetPixel检索光标下的颜色,并将此RGB值转换为ColorMatrix。
当我使用红色的GetPixel时,我会得到
R: 255
G: 0
B: 0
如何将Red值255转换为ColorMatrix值? 这将是1.0。 如果红色值为127,则值为0.5
我应该简单地使用"规则三"确定1.0的值,或者应该如何处理?
答案 0 :(得分:4)
首先,我认为您应该阅读ColorMatrix
类,并且可能会更新您对矩阵的理解(尽管ColorMatrix
文档为您提供了足够的信息,您无需了解矩阵数学)。
让我们看看你的矩阵:
1,0,0,0,0
0,1,0,0,0
0,0,1,0,0
0,0,0,1,0
1,0,0,0,0
此矩阵将红色,绿色,蓝色和alpha分量缩放1,然后将1添加到红色分量,将0添加到绿色,蓝色和alpha分量。
我认为这不是你想要的。为了使图像着色,我认为最好将图像RGB值相乘而不是添加它们。否则,如果您的黑白图像的像素为白色(即RGB 1,1,1),那么当您尝试对其进行着色时,它将保持白色,此时它应该真正采用您应用的颜色
让我们更一般地看看矩阵,看看它如何影响像素颜色:
Sr, 0, 0, 0, 0
0, Sg, 0, 0, 0
0, 0, Sb, 0, 0
0, 0, 0, Sa, 0
Tr, Tg, Tb, Ta, 1
S
代表“比例”,T
代表翻译。您的红色组件将乘以Sr
,然后添加Tr
,您的绿色组件将乘以Sg
,然后添加Tg
,您的蓝色组件将乘以Sb
,然后添加Tb
,您的alpha组件将乘以Sa
,然后添加Ta
。
因此,要构建一个矩阵来为您的图像着色,您可以这样做:
Color colour = colourDialog.Color; // Or wherever you get your Color instance from
float[][] colourMatrixElements =
{
new float[] { colour.R / 255.0f, 0, 0, 0, 0 },
new float[] { 0, colour.G / 255.0f, 0, 0, 0 },
new float[] { 0, 0, colour.B / 255.0f, 0, 0 },
new float[] { 0, 0, 0, 1, 0 },
new float[] { 0, 0, 0, 0, 1 }
};
var colourMatrix = new ColorMatrix(colorMatrixElements);
现在,您可以使用ColorMatrix
为图像着色。