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


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

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

Классы Bitmap (наследующий у класса Image) и ImageAttributes предоставляют функции для чтения и записи значений точек. Для изменения альфа-компонентов во всем изображении можно использовать класс ImageAttributes, либо можно вызывать метод SetPixel класса Bitmap для изменения значений отдельных точек.

Пример

Класс ImageAttributes содержит множество свойств, которые можно использовать для модификаций изображений при их визуализации. В следующем примере объект ImageAttributes используется для установки значений всех альфа-компонентов равными 80 процентам от их первоначальных значений. Для этого выполняется инициализация матрицы цветов и установка в этой матрице масштабирующего коэффициента для альфа-компонента равным 0,8. Адрес матрицы цветов передается методу SetColorMatrix объекта ImageAttributes, а объект ImageAttributes передается методу DrawString объекта Graphics.

В процессе визуализации значения альфа-компонентов растрового изображения преобразуются и становятся равными 80% от их первоначальных значений. Это приводит к смешиванию изображения и фона. Как показано на следующем рисунке, растровое изображение выглядит прозрачным, и сквозь него можно видеть сплошную черную линию.

Альфа-сглаживание с использованием матрицы

В местах, где изображение покрывает белые участки фона, оно смешивается с белым цветом. Там, где изображение пересекает черную линию, оно смешивается с черным цветом.

' Create the Bitmap object and load it with the texture image.
Dim bitmap As New Bitmap("Texture.jpg")

' Initialize the color matrix.
' Note the value 0.8 in row 4, column 4.
Dim matrixItems 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, 0.8F, 0}, _
   New Single() {0, 0, 0, 0, 1}}

Dim colorMatrix As New ColorMatrix(matrixItems)

' Create an ImageAttributes object and set its color matrix.
Dim imageAtt As New ImageAttributes()
imageAtt.SetColorMatrix( _
   colorMatrix, _
   ColorMatrixFlag.Default, _
   ColorAdjustType.Bitmap)

' First draw a wide black line.
e.Graphics.DrawLine( _
   New Pen(Color.Black, 25), _
   New Point(10, 35), _
   New Point(200, 35))

' Now draw the semitransparent bitmap image.
Dim iWidth As Integer = bitmap.Width
Dim iHeight As Integer = bitmap.Height

' Pass in the destination rectangle (2nd argument) and the x _
' coordinate (3rd argument), x coordinate (4th argument), width _
' (5th argument), and height (6th argument) of the source rectangle.
e.Graphics.DrawImage( _
   bitmap, _
   New Rectangle(30, 0, iWidth, iHeight), _
   0.0F, _
   0.0F, _
   iWidth, _
   iHeight, _
   GraphicsUnit.Pixel, _
   imageAtt)

// Create the Bitmap object and load it with the texture image.
Bitmap bitmap = new Bitmap("Texture.jpg");

// Initialize the color matrix.
// Note the value 0.8 in row 4, column 4.
float[][] matrixItems ={ 
   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, 0.8f, 0}, 
   new float[] {0, 0, 0, 0, 1}};
ColorMatrix colorMatrix = new ColorMatrix(matrixItems);

// Create an ImageAttributes object and set its color matrix.
ImageAttributes imageAtt = new ImageAttributes();
imageAtt.SetColorMatrix(
   colorMatrix,
   ColorMatrixFlag.Default,
   ColorAdjustType.Bitmap);

// First draw a wide black line.
e.Graphics.DrawLine(
   new Pen(Color.Black, 25),
   new Point(10, 35),
   new Point(200, 35));

// Now draw the semitransparent bitmap image.
int iWidth = bitmap.Width;
int iHeight = bitmap.Height;
e.Graphics.DrawImage(
   bitmap,
   new Rectangle(30, 0, iWidth, iHeight),  // destination rectangle
   0.0f,                          // source rectangle x 
   0.0f,                          // source rectangle y
   iWidth,                        // source rectangle width
   iHeight,                       // source rectangle height
   GraphicsUnit.Pixel,
   imageAtt);

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

Предыдущий пример предназначен для работы с Windows Forms, для него необходим объект PaintEventArgse, передаваемый в качестве параметра обработчику событий PaintEventHandler.

См. также

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

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

Альфа-смешение цвета для линий и заливок