Использование матрицы цветов для настройки альфа-компонентов в изображениях
Класс 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 % от их первоначальных значений. Это приводит к смешиванию изображения и фона. Как показано на рисунке ниже, растровое изображение выглядит прозрачным, и сквозь него можно видеть сплошную черную линию.
В местах, где изображение покрывает белые участки фона, оно смешивается с белым цветом. Там, где изображение пересекает черную линию, оно смешивается с черным цветом.