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


Практическое руководство. Использование режима комбинирования для управления альфа-смешением

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

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

  • Альфа-компоненты цветов меньше 255.

  • При создании растрового изображения не выполняется альфа-смешение цветов друг с другом.

  • При выводе окончательно сформированного растрового изображения на устройстве отображения выполняется альфа-смешение цветов точечного изображения с цветами фона.

Для формирования такого растрового изображения следует создать пустой объект Bitmap, а затем построить на его основе объект Graphics. Присвойте режиму комбинирования объекта Graphics значение CompositingMode.SourceCopy.

Пример

В приведенном ниже примере создается объект Graphics на основе объекта Bitmap. Объект Graphics используется в коде вместе с двумя полупрозрачными кистями (альфа-компонент равен 160) для рисования на фоне растрового изображения. В примере осуществляется заливка красного и зеленого эллипсов с помощью полупрозрачных кистей. Зеленый эллипс частично перекрывается с красным эллипсом, но зеленый и красный цвета не смешиваются, потому что режим комбинирования, принадлежащий объекту Graphics, установлен равным SourceCopy.

Растровое изображение рисуется на экране дважды: один раз на белом фоне, а другой раз на многоцветном фоне. Точки растрового изображения, являющиеся частями двух ранее нарисованных эллипсов, имеют альфа-компонент, равный 160, поэтому цвета эллипсов смешиваются с фоновыми цветами на экране.

На следующем рисунке показан результат выполнения примера кода. Обратите внимание, что цвета эллипсов смешиваются с фоном, но не смешиваются друг с другом.

Копия источника

Пример кода содержит следующую инструкцию:

bitmapGraphics.CompositingMode = CompositingMode.SourceCopy

bitmapGraphics.CompositingMode = CompositingMode.SourceCopy;

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

bitmapGraphics.CompositingMode = CompositingMode.SourceOver

bitmapGraphics.CompositingMode = CompositingMode.SourceOver;

На следующем рисунке показан результат выполнения измененного кода.

Источник над

' Create a blank bitmap.
Dim myBitmap As New Bitmap(180, 100)

' Create a Graphics object that we can use to draw on the bitmap.
Dim bitmapGraphics As Graphics = Graphics.FromImage(myBitmap)

' Create a red brush and a green brush, each with an alpha value of 160.
Dim redBrush As New SolidBrush(Color.FromArgb(160, 255, 0, 0))
Dim greenBrush As New SolidBrush(Color.FromArgb(160, 0, 255, 0))

' Set the compositing mode so that when we draw overlapping ellipses,
' the colors of the ellipses are not blended.
bitmapGraphics.CompositingMode = CompositingMode.SourceCopy

' Fill an ellipse using a red brush that has an alpha value of 160.
bitmapGraphics.FillEllipse(redBrush, 0, 0, 150, 70)

' Fill a second ellipse using a green brush that has an alpha value of 
' 160. The green ellipse overlaps the red ellipse, but the green is not 
' blended with the red.
bitmapGraphics.FillEllipse(greenBrush, 30, 30, 150, 70)

'Set the compositing quality of the form's Graphics object. 
e.Graphics.CompositingQuality = CompositingQuality.GammaCorrected

' Draw a multicolored background.
Dim colorBrush As New SolidBrush(Color.Aqua)
e.Graphics.FillRectangle(colorBrush, 200, 0, 60, 100)
colorBrush.Color = Color.Yellow
e.Graphics.FillRectangle(colorBrush, 260, 0, 60, 100)
colorBrush.Color = Color.Fuchsia
e.Graphics.FillRectangle(colorBrush, 320, 0, 60, 100)

'Display the bitmap on a white background.
e.Graphics.DrawImage(myBitmap, 0, 0)

' Display the bitmap on a multicolored background.
e.Graphics.DrawImage(myBitmap, 200, 0)

// Create a blank bitmap.
Bitmap myBitmap = new Bitmap(180, 100);

// Create a Graphics object that we can use to draw on the bitmap.
Graphics bitmapGraphics = Graphics.FromImage(myBitmap);

// Create a red brush and a green brush, each with an alpha value of 160.
SolidBrush redBrush = new SolidBrush(Color.FromArgb(160, 255, 0, 0));
SolidBrush greenBrush = new SolidBrush(Color.FromArgb(160, 0, 255, 0));

// Set the compositing mode so that when we draw overlapping ellipses,
// the colors of the ellipses are not blended.
bitmapGraphics.CompositingMode = CompositingMode.SourceCopy;

// Fill an ellipse using a red brush that has an alpha value of 160.
bitmapGraphics.FillEllipse(redBrush, 0, 0, 150, 70);

// Fill a second ellipse using a green brush that has an alpha value of 160. 
// The green ellipse overlaps the red ellipse, but the green is not 
// blended with the red.
bitmapGraphics.FillEllipse(greenBrush, 30, 30, 150, 70);

// Set the compositing quality of the form's Graphics object. 
e.Graphics.CompositingQuality = CompositingQuality.GammaCorrected;

// Draw a multicolored background.
SolidBrush colorBrush = new SolidBrush(Color.Aqua);
e.Graphics.FillRectangle(colorBrush, 200, 0, 60, 100);
colorBrush.Color = Color.Yellow;
e.Graphics.FillRectangle(colorBrush, 260, 0, 60, 100);
colorBrush.Color = Color.Fuchsia;
e.Graphics.FillRectangle(colorBrush, 320, 0, 60, 100);

// Display the bitmap on a white background.
e.Graphics.DrawImage(myBitmap, 0, 0);

// Display the bitmap on a multicolored background.
e.Graphics.DrawImage(myBitmap, 200, 0);

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

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

См. также

Ссылки

FromArgb

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

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