tmi*_*hty 0 c# vb.net math system.drawing colormatrix
我想对黑白图像进行着色。
为此,我使用 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,
Run Code Online (Sandbox Code Playgroud)
现在我想从比色图表中选择一种颜色,例如从这样的比色图表中选择:
我的计划是使用 GetPixel 检索光标下的颜色并将该 RGB 值转换为 ColorMatrix。
当我在红色上使用 GetPixel 时,我会得到
R: 255
G: 0
B: 0
Run Code Online (Sandbox Code Playgroud)
如何将 255 的红色值转换为 ColorMatrix 值?它将是1.0。如果红色值为 127,则该值为 0.5
我应该简单地使用“三规则”来确定 1.0 的值,还是应该如何处理?
首先,我认为您应该阅读该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
Run Code Online (Sandbox Code Playgroud)
该矩阵会将红色、绿色、蓝色和 alpha 分量缩放 1,然后将红色分量加 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, 1
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
您现在可以使用ColorMatrix为图像着色。