【问题标题】:Converting RGB value into ColorMatrix将 RGB 值转换为 ColorMatrix
【发布时间】:2018-11-06 12:59:58
【问题描述】:

我想给一张黑白图片上色。

为此,我使用了 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

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

我应该简单地使用“三规则”来确定 1.0 的值,还是应该如何处理?

【问题讨论】:

    标签: c# vb.net math system.drawing colormatrix


    【解决方案1】:

    首先,我认为您应该阅读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,将绿色、蓝色和 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
    

    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 为您的图像着色。

    【讨论】:

    • 如何获得问题中给出的反向 RGB 矩阵。 4x4
    猜你喜欢
    • 2012-10-29
    • 2011-01-24
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多