首页 文章

将RGB值转换为ColorMatrix

提问于
浏览
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,

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

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 回答

  • 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 代表"scale", 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 来为图像着色 .

相关问题