如何绘制50%不透明度的位图?

时间:2009-09-04 04:39:34

标签: .net gdi+

我有一个带有alpha通道的.png文件,我在Panel控件上用作BackgroundImage。在某些情况下,控件被禁用。当它被禁用时,我希望背景图像是50%透明的,这样用户就可以获得关于控件状态的某种可视指示。

有谁知道如何使Bitmap图像透明50%?

此阶段唯一可行的解​​决方案是将位图图像绘制到新的位图,然后使用面板的背景颜色在其顶部绘制。虽然这是有效的,但这不是我喜欢的解决方案,因此这个问题。

3 个答案:

答案 0 :(得分:1)

你不能把它换成另一张实际上有50%透明度的图像吗?

答案 1 :(得分: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;
    }

答案 2 :(得分:0)

您可以使用.LockBits获取指向图像像素值的指针,然后更改每个像素的alpa值。看到这个问题: Gdiplus mask image from another image