Практическое руководство. Использование режима комбинирования для управления альфа-смешением
Возможны ситуации, когда необходимо создать не отображаемый на экране точечный рисунок, который имеет следующие характеристики:
Цвета имеют альфа-фактор менее 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.
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);
' 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)
Компиляция кода
Приведенный выше пример предназначен для использования с Windows Forms и требуется PaintEventArgs e
, который является параметром PaintEventHandler.
См. также
.NET Desktop feedback