2009-09-04 65 views
0

我有一个.png文件,带有alpha通道,我在Panel控件上用作BackgroundImage。在某些情况下,控制被禁用。当它被禁用时,我希望背景图像为50%透明,以便用户获得某种关于控件状态的视觉指示。如何绘制50%不透明度的位图?

有谁知道我怎样才能使一个位图图像50%透明?

我现阶段唯一可能的解决方案是将位图图像绘制到一个新的位图上,然后使用面板的背景色绘制它的顶部。虽然这起作用,但它不是我的首选解决方案,因此这个问题。

回答

1

下面是一些代码,将Alpha通道添加到图像。如果你想要50%的alpha,你可以设置128作为alpha参数。注意这会创建一个位图的副本...

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

谢谢克里斯,我做了一个小改动,使用了Mashal.Copy,这样我就不需要一个不安全的块,但是除此之外,它是一种享受。 – Kepboy 2009-09-09 23:22:53

1

你不能只是换掉另一张图像,实际上有50%的透明度?

+0

是的,没想到这一点。 – Kepboy 2009-09-04 05:13:13