2009-09-04 3 views
0

Panel 컨트롤에서 BackgroundImage로 사용하는 .png 파일 (알파 채널 있음)이 있습니다. 특정 상황에서는 컨트롤이 비활성화됩니다. 이 기능을 비활성화하면 배경 이미지가 50 % 투명하여 사용자가 컨트롤 상태에 대한 시각적 표시를 얻을 수 있기를 원합니다.50 % 불투명도의 비트 맵을 그리는 방법은 무엇입니까?

아무도 내가 50 % 투명하게 비트 맵 이미지를 만들 수있는 방법을 알고 있습니까?

이 단계에서 유일하게 사용할 수있는 해결책은 비트 맵 이미지를 새 비트 맵으로 그려서 패널의 배경색을 사용하여 그 위에 그립니다. 이것이 작동하는 동안 그것은 나의 선호하는 해결책이 아닙니다. 그러므로이 질문입니다.

답변

1

다음은 이미지에 알파 채널을 추가하는 코드입니다. 50 % 알파를 원할 경우 알파 인수로 128을 설정합니다. 참고 비트 맵 복사본을 만듭니다 ...

public static Bitmap AddAlpha(Bitmap currentImage, byte alpha) 
    { 
     Bitmap alphaImage; 
     if (currentImage.PixelFormat != PixelFormat.Format32bppArgb) 
     { 
      alphaImage = new Bitmap(currentImage.Width, currentImage.Height, PixelFormat.Format32bppArgb); 
      using (Graphics gr = Graphics.FromImage(tmpImage)) 
      { 
       gr.DrawImage(currentImage, 0, 0, currentImage.Width, currentImage.Height); 
      } 
     } 
     else 
     { 
      alphaImage = new Bitmap(currentImage); 
     } 

     BitmapData bmData = alphaImage.LockBits(new Rectangle(0, 0, alphaImage.Width, alphaImage.Height), 
      ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); 

     const int bytesPerPixel = 4; 
     const int alphaPixel = 3; 
     int stride = bmData.Stride; 

     unsafe 
     { 
      byte* pixel = (byte*)(void*)bmData.Scan0; 


      for (int y = 0; y < currentImage.Height; y++) 
      { 
       int yPos = y * stride; 
       for (int x = 0; x < currentImage.Width; x++) 
       { 
        int pos = yPos + (x * bytesPerPixel); 
        pixel[pos + alphaPixel] = alphaByte; 
       } 
      } 
     } 

     alphaImage.UnlockBits(bmData); 

     return alphaImage; 
    } 
+0

감사합니다. 크리스, 마샬을 사용하여 약간 변경했습니다. 복사하여 안전하지 않은 블록이 필요 없도록합니다. 그렇지 않으면 치료가 필요합니다. – Kepboy

1

실제로 투명도가 50 % 인 다른 이미지로 바꿀 수 없습니까?

+0

그래, 그런 생각을 했어. – Kepboy

0

.LockBits를 사용하여 이미지의 픽셀 값에 대한 포인터를 가져온 다음 각 픽셀의 알파 값을 변경할 수 있습니다. 이 질문보기 : Gdiplus mask image from another image

관련 문제