Поделиться через


Практическое руководство. Сдвиг цветов

Обновлен: Ноябрь 2007

Пропорциональное изменение увеличивает или уменьшает компонент цвета на величину, пропорциональную другому компоненту цвета. Например, рассмотрим преобразование, при котором красный компонент увеличивается на половину значения синего компонента. При таком преобразовании цвет (0,2; 0,5; 1) превратится в цвет (0,7; 0,5; 1). Новое значение красного компонента равняется 0,2 + (1/2)(1) = 0,7.

Пример

В следующем примере создается объект Image на основе файла ColorBars4.bmp. После этого к каждой точке изображения применяется пропорциональное цветовое преобразование, описанное выше.

На следующем рисунке показаны как исходное изображение (слева), так и преобразованное изображение (справа).

Сместить цвета

В следующей таблице приводятся цветовые векторы четырех полос до и после преобразования.

До преобразования

После преобразования

(0, 0, 1, 1)

(0.5, 0, 1, 1)

(0.5, 1, 0.5, 1)

(0.75, 1, 0.5, 1)

(1, 1, 0, 1)

(1, 1, 0, 1)

(0.4, 0.4, 0.4, 1)

(0.6, 0.4, 0.4, 1)

Dim image = 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.5F, 0, 1, 0, 0}, _
        New Single() {0, 0, 0, 1, 0}, _
        New Single() {0, 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)

e.Graphics.DrawImage(image, New Rectangle(150, 10, width, height), 0, 0, _
    width, height, GraphicsUnit.Pixel, imageAttributes)
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.5f,  0,  1,  0, 0},
        new float[] {0,  0,  0,  1, 0},
        new float[] {0, 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);

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

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

См. также

Ссылки

ColorMatrix

ImageAttributes

Другие ресурсы

Объекты Graphics и Drawing в Windows Forms

Перекрашивание изображений