다음을 통해 공유


방법: 합성 모드를 사용하여 알파 혼합 조절

다음과 같은 특징이 있는 오프 스크린 비트맵을 만드는 경우가 있습니다.

  • 색의 알파 값이 255보다 작습니다.

  • 비트맵을 만들 때 색 상호 간에 알파 혼합이 발생하지 않습니다.

  • 완성한 비트맵을 표시할 때 비트맵에 있는 색이 디스플레이 장치의 배경색과 알파 혼합됩니다.

이러한 비트맵을 만들려면 빈 Bitmap 개체를 만든 다음 이 비트맵을 기반으로 Graphics 개체를 만들고 Graphics 개체의 합성 모드를 CompositingMode.SourceCopy로 설정합니다.

예제

다음 예제에서는 Bitmap 개체를 기반으로 Graphics 개체를 만듭니다. 이 코드에서는 두 개의 반투명 브러시(알파 = 160)와 함께 Graphics 개체를 사용하여 비트맵에서 그리고 반투명 브러시를 사용하여 빨강 타원과 녹색 타원을 채웁니다. 녹색 타원은 빨강 타원과 겹치지만 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에서 사용해야 하며 PaintEventHandler의 매개 변수인 PaintEventArgs e를 필요로 합니다.

참고 항목

참조

FromArgb

기타 리소스

선 및 채우기 알파 혼합