我想给一张黑白图像上色。
为此,我使用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。如果Red值为127,则该值将为0.5
我是否应该简单地使用“三的规则”来确定1.0的值,或者应该如何处理?
发布于 2018-05-28 09:57:30
首先,我认为您应该阅读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该矩阵将按1缩放红色、绿色、蓝色和alpha分量,然后将红色分量加1,绿色、蓝色和alpha分量加0。
我不认为这真的是你想要的。为了给图像上色,我认为最好是将图像的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, 1S代表"scale“,T代表translate。红色分量将与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为您的图像着色。
https://stackoverflow.com/questions/50557802
复制相似问题