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


Масштабирование цветов с применением преобразований

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

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

Масштабируемый компонент

Элемент матрицы

Красный

[0][0]

Зеленый

[1][1]

Синий

[2][2]

Альфа

[3][3]

Масштабирование одного цвета

В следующем примере создается объект Image на основе файла ColorBars2.bmp. Затем код масштабирует синий компонент каждой точки в изображении с коэффициентом масштабирования, равным 2. Исходное изображение отображается вместе с преобразованным изображением.

Dim image As New Bitmap("ColorBars2.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, 2, 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)

' 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)

Image image = new Bitmap("ColorBars2.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,  2,  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);

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

Масштабировать цвета

В следующей таблице приводятся цветовые векторы четырех полос до и после масштабирования. Обратите внимание, что синий компонент цвета четвертой полосы изменился с 0,8 на 0,6. Это связано с тем, что интерфейс GDI+ сохраняет только дробную частью результата. Например, (2)(0,8) = 1,6, а дробная часть числа 1,6 равна 0,6. Сохранение только дробной части гарантирует, что результат всегда попадает в интервал [0, 1].

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

Масштабированный цвет

(0.4, 0.4, 0.4, 1)

(0.4, 0.4, 0.8, 1)

(0.4, 0.2, 0.2, 1)

(0.4, 0.2, 0.4, 1)

(0.2, 0.4, 0.2, 1)

(0.2, 0.4, 0.4, 1)

(0.4, 0.4, 0.8, 1)

(0.4, 0.4, 0.6, 1)

Масштабирование нескольких цветов

В следующем примере создается объект Image на основе файла ColorBars2.bmp. Затем код масштабирует красный, зеленый и синий компоненты цвета каждой точки изображения. Красные компоненты уменьшаются на 25%, зеленые компоненты — на 35%, а синие — на 50%.

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() {0.75F, 0, 0, 0, 0}, _
   New Single() {0, 0.65F, 0, 0, 0}, _
   New Single() {0, 0, 0.5F, 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)

' Pass in the destination rectangle, and the upper-left corner, width, 
' and height of the source rectangle as in the previous example.
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[] {.75F,  0,  0,  0, 0},
   new float[] {0,  .65F,  0,  0, 0},
   new float[] {0,  0,  .5F,  0, 0},
   new float[] {0,  0,  0,  1F, 0},
   new float[] {0, 0, 0, 0, 1F}};

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);

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

Масштабировать цвета

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

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

Масштабированный цвет

(0.6, 0.6, 0.6, 1)

(0.45, 0.39, 0.3, 1)

(0, 1, 1, 1)

(0, 0.65, 0.5, 1)

(1, 1, 0, 1)

(0.75, 0.65, 0, 1)

(1, 0, 1, 1)

(0.75, 0, 0.5, 1)

См. также

Ссылки

ColorMatrix

ImageAttributes

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

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

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