Во-первых, я думаю, вам следует прочитать 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
Эта матрица масштабирует красный, зеленый, синий и альфа-компоненты на 1, а затем добавляет 1 к красному компоненту и 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
, и ваш альфа-компонент будет умножен на 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
, чтобы раскрасить изображение.
person
Sam
schedule
28.05.2018