Во-первых, я думаю, что вы должны прочитать о классе 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
для окрашивания вашего изображения.