Porady: stosowanie trybu składania do sterowania przenikaniem alfa
Czasami warto utworzyć mapę bitową poza ekranem, która ma następujące cechy:
Kolory mają wartości alfa, które są mniejsze niż 255.
Kolory nie są ze sobą połączone alfa podczas tworzenia mapy bitowej.
Po wyświetleniu gotowej mapy bitowej kolory na mapie bitowej są alfa w połączeniu z kolorami tła na urządzeniu wyświetlania.
Aby utworzyć taką mapę bitową, skonstruuj pusty Bitmap obiekt, a następnie skonstruuj Graphics obiekt na podstawie tej mapy bitowej. Ustaw tryb Graphics komposiowania obiektu na CompositingMode.SourceCopy.
Przykład
Poniższy przykład tworzy Graphics obiekt na Bitmap podstawie obiektu. Kod używa Graphics obiektu wraz z dwoma półprzezroczystych pędzlami (alfa = 160) do malowania na mapie bitowej. Kod wypełnia czerwony wielokropek i zielony wielokropek za pomocą półprzezroczystych pędzli. Zielony wielokropek nakłada się na czerwony wielokropek, ale zielony nie jest mieszany z czerwonym, ponieważ tryb Graphics komponowania obiektu jest ustawiony na SourceCopywartość .
Kod rysuje mapę bitową na ekranie dwa razy: raz na białym tle, a raz na wielobarwnym tle. Piksele w mapie bitowej, które są częścią dwóch wielokropka mają składnik alfa 160, więc wielokropek jest mieszany z kolorami tła na ekranie.
Poniższa ilustracja przedstawia dane wyjściowe przykładu kodu. Należy pamiętać, że wielokropek jest mieszany z tłem, ale nie są one ze sobą połączone.
Przykładowy kod zawiera następującą instrukcję:
bitmapGraphics.CompositingMode = CompositingMode.SourceCopy;
bitmapGraphics.CompositingMode = CompositingMode.SourceCopy
Jeśli chcesz, aby wielokropek był ze sobą połączony, a także z tłem, zmień instrukcję na następującą:
bitmapGraphics.CompositingMode = CompositingMode.SourceOver;
bitmapGraphics.CompositingMode = CompositingMode.SourceOver
Poniższa ilustracja przedstawia dane wyjściowe poprawionego kodu.
// 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)
Kompilowanie kodu
Powyższy przykład jest przeznaczony do użycia z formularzami Systemu Windows i wymaga PaintEventArgse
parametru , który jest parametrem PaintEventHandler.
Zobacz też
.NET Desktop feedback