Преобразование значения RGB в ColorMatrix - PullRequest
0 голосов
/ 28 мая 2018

Я хотел бы раскрасить черно-белое изображение.

Для этого я использую 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 над цветом Red, я бы получил

R: 255
G: 0
B: 0

Как я могу превратить значение Red 255 в значение ColorMatrix?Это было бы 1.0.Если бы значение Красного было 127, значение было бы 0,5

Должен ли я просто использовать «правило трех», чтобы определить значение 1,0, или как это обрабатывать?

1 Ответ

0 голосов
/ 28 мая 2018

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

...