21

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

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);
}

src除非从带有透明胶片(如 GIF)或 alpha 通道(如 PNG)的图像加载,否则这似乎工作得很好。

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

4

2 回答 2

29

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

在此处输入图像描述

使用此代码

        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);
        }

生成此图像:

在此处输入图像描述

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

于 2012-05-19T00:28:04.227 回答
0

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

于 2019-01-10T13:03:28.260 回答