Практическое руководство. Преобразование цветов изображения

При сдвиге к одному или нескольким из четырех компонентов цвета добавляется определенное значение. Элементы цветовой матрицы, представляющие сдвиг, приведены в таблице ниже.

Компонент для сдвига Элемент матрицы
Красный [4][0]
Зеленый [4][1]
Синий [4][2]
Коэффициент альфа [4][3]

Пример

В следующем примере из файла ColorBars.bmp создается объект Image. Затем код прибавляет значение 0,75 к красному компоненту каждого пикселя на изображении. Исходное изображение рисуется рядом с преобразованным.

На следующем рисунке показаны исходное изображение слева и преобразованное изображение справа:

Screenshot of the original and transformed image.

В приведенной ниже таблице перечислены цветовые векторы для четырех полос до и после сдвига красного компонента. Обратите внимание, что, поскольку максимальное значение компонента цвета равно 1, красный компонент во второй строке не меняется. (Аналогичным образом, минимальное значение компонента цвета равно 0.)

Исходная Переведенный текст
Черный (0, 0, 0, 1) (0.75, 0, 0, 1)
Красный (1, 0, 0, 1) (1, 0, 0, 1)
Зеленый (0, 1, 0, 1) (0.75, 1, 0, 1)
Синий (0, 0, 1, 1) (0.75, 0, 1, 1)
Image image = new Bitmap("ColorBars.bmp");
ImageAttributes imageAttributes = new ImageAttributes();
int width = image.Width;
int height = image.Height;

float[][] colorMatrixElements = {
   new float[] {1,  0,  0,  0, 0},
   new float[] {0,  1,  0,  0, 0},
   new float[] {0,  0,  1,  0, 0},
   new float[] {0,  0,  0,  1, 0},
   new float[] {.75f, 0, 0, 0, 1}};

ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);

imageAttributes.SetColorMatrix(
   colorMatrix,
   ColorMatrixFlag.Default,
   ColorAdjustType.Bitmap);

e.Graphics.DrawImage(image, 10, 10, width, height);

e.Graphics.DrawImage(
   image,
   new Rectangle(150, 10, width, height),  // destination rectangle
   0, 0,        // upper-left corner of source rectangle
   width,       // width of source rectangle
   height,      // height of source rectangle
   GraphicsUnit.Pixel,
   imageAttributes);
Dim image As New Bitmap("ColorBars.bmp")
Dim imageAttributes As New ImageAttributes()
Dim width As Integer = image.Width
Dim height As Integer = image.Height

Dim colorMatrixElements As Single()() = { _
   New Single() {1, 0, 0, 0, 0}, _
   New Single() {0, 1, 0, 0, 0}, _
   New Single() {0, 0, 1, 0, 0}, _
   New Single() {0, 0, 0, 1, 0}, _
   New Single() {0.75F, 0, 0, 0, 1}}

Dim colorMatrix As New ColorMatrix(colorMatrixElements)

imageAttributes.SetColorMatrix( _
   colorMatrix, _
   ColorMatrixFlag.Default, _
   ColorAdjustType.Bitmap)

e.Graphics.DrawImage(image, 10, 10, width, height)

' Pass in the destination rectangle (2nd argument), the upper-left corner 
' (3rd and 4th arguments), width (5th argument),  and height (6th 
' argument) of the source rectangle.
e.Graphics.DrawImage( _
   image, _
   New Rectangle(150, 10, width, height), _
   0, 0, _
   width, _
   height, _
   GraphicsUnit.Pixel, _
   imageAttributes)

Компиляция кода

Предыдущий пример предназначен для работы с Windows Forms, и для него необходим объект PaintEventArgse, передаваемый в качестве параметра обработчику событий Paint. Замените ColorBars.bmp на имя файла с изображением, имеющегося в системе, и путь к нему.

См. также