使用Graphics.DrawImage()以透明度/ Alpha通道绘制图像

时间:2012-05-18 20:02:20

标签: c# .net drawimage alpha-transparency

我正在复制一张图片。 (我的实际代码是调整图像大小,但这与我的问题无关。)我的代码看起来像这样。

Image src = ...

using (Image dest = new Bitmap(width, height))
{
    Graphics graph = Graphics.FromImage(dest);
    graph.InterpolationMode = InterpolationMode.HighQualityBicubic;
    graph.DrawImage(src, 0, 0, width, height);
    dest.Save(filename, saveFormat);
}

除非从具有透明度(例如GIF)或Alpha通道(例如PNG)的图像加载src,否则这似乎很有效。

如何让DrawImage()将透明胶片/ Alpha通道传输到新图像,然后在保存文件时保留它们?

2 个答案:

答案 0 :(得分:28)

目前还不清楚,有很多你没说。透明度最大的问题是你看不到它。您跳过了几个步骤,没有明确指定新位图的像素格式,您根本没有初始化它,也没有说明您使用的输出格式。有些人不支持透明度。所以让我们制作一个让它变得清晰的版本。从paint.net中的PNG图像看起来像这样:

enter image description here

使用此代码

        using (var src = new Bitmap("c:/temp/trans.png"))
        using (var bmp = new Bitmap(100, 100, PixelFormat.Format32bppPArgb)) 
        using (var gr = Graphics.FromImage(bmp)) {
            gr.Clear(Color.Blue);
            gr.DrawImage(src, new Rectangle(0, 0, bmp.Width, bmp.Height));
            bmp.Save("c:/temp/result.png", ImageFormat.Png);
        }

制作此图片:

enter image description here

您可以清楚地看到蓝色背景,因此透明度有效。

答案 1 :(得分:1)

我发现此线程的原因是我遇到了同样的问题(即DrawImage没有复制alpha通道),但就我而言,这仅仅是因为我忽略了我使用PixelFormat.Format32bppRgb而不是PixelFormat.Format32bppArgb 。 Lukasz M在评论中说的差不多。