将RGB值转换为ColorMatrix

时间:2018-05-28 00:42:54

标签: 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,

现在我想从颜色图表中选择颜色,例如从这样的颜色图表中选择:

enter image description here

我的计划是使用GetPixel检索光标下的颜色,并将此RGB值转换为ColorMatrix。

当我使用红色的GetPixel时,我会得到

R: 255
G: 0
B: 0

如何将Red值255转换为ColorMatrix值? 这将是1.0。 如果红色值为127,则值为0.5

我应该简单地使用"规则三"确定1.0的值,或者应该如何处理?

1 个答案:

答案 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为图像着色。

相关问题