首先,我认为您应该阅读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 为您的图像着色。