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


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

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

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

Bitmap bitmap(L"Texture1.jpg");
Pen pen(Color(255, 0, 0, 0), 25);
// First draw a wide black line.
graphics.DrawLine(&pen, Point(10, 35), Point(200, 35));
// Now draw an image that covers part of the black line.
graphics.DrawImage(&bitmap,
   Rect(30, 0, bitmap.GetWidth(), bitmap.GetHeight()));

На следующем рисунке показано полученное изображение, которое рисуется в (30, 0). Обратите внимание, что широкая черная линия не отображается на изображении.

Иллюстрация, показывающая непрозрачное изображение, перекрывающее тонкий широкий черный прямоугольник

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

// Create a Bitmap object and load it with the texture image.
Bitmap bitmap(L"Texture1.jpg");
Pen pen(Color(255, 0, 0, 0), 25);
// Initialize the color matrix.
// Notice the value 0.8 in row 4, column 4.
ColorMatrix colorMatrix = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
                           0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
                           0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
                           0.0f, 0.0f, 0.0f, 0.8f, 0.0f,
                           0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
// Create an ImageAttributes object and set its color matrix.
ImageAttributes imageAtt;
imageAtt.SetColorMatrix(&colorMatrix, ColorMatrixFlagsDefault,
   ColorAdjustTypeBitmap);
// First draw a wide black line.
graphics.DrawLine(&pen, Point(10, 35), Point(200, 35));
// Now draw the semitransparent bitmap image.
INT iWidth = bitmap.GetWidth();
INT iHeight = bitmap.GetHeight();
graphics.DrawImage(
   &bitmap, 
   Rect(30, 0, iWidth, iHeight),  // Destination rectangle
   0,                             // Source rectangle X 
   0,                             // Source rectangle Y
   iWidth,                        // Source rectangle width
   iHeight,                       // Source rectangle height
   UnitPixel, 
   &imageAtt);

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

иллюстрация похожа на предыдущую, но изображение является sem-transparent

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