【问题标题】:Using Graphics.DrawImage() to Draw Image with Transparency/Alpha Channel使用 Graphics.DrawImage() 绘制具有透明度/Alpha 通道的图像
【发布时间】:2012-05-18 20:02:20
【问题描述】:

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

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 通道传输到新图像,然后在保存文件时保留它们?

【问题讨论】:

  • 问题是saveFormat变量的值是多少?它应该是PixelFormat.Format32bppArgb(或处理 Alpha 通道的其他格式)。也可以试试:using (Image dest = new Bitmap(width, height, PixelFormat.Format32bppArgb)).
  • 这似乎适用于 Alpha 通道,但不适用于 GIF 透明胶片。 saveFormat 将根据输入文件的格式而有所不同。如果输入文件不支持 alpha 通道,则可以安全地假设图像不包含 alpha 通道像素。
  • 那么,saveFormat 对于 GIF 文件的价值是什么:)?
  • 在这种情况下,它是ImageFormat.Gif
  • 感谢您的快速回复。与此同时,我发现了一篇关于 GIF 透明度的文章。看看吧:support.microsoft.com/kb/319061。我想基本上你只需要获取图像的调色板并将第一个索引中保存的颜色设置为透明的。

标签: c# .net drawimage alpha-transparency


【解决方案1】:

这很不清楚,有很多你没有说。透明度最大的问题是你看不到它。您跳过了几个步骤,没有明确指定新位图的像素格式,根本没有初始化它,也没有说明使用的输出格式。有些不支持透明度。因此,让我们制作一个清晰的版本。来自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);
        }

生成此图像:

您可以清楚地看到蓝色背景,因此透明度起作用了。

【讨论】:

  • 嗯,我的意图是支持与输入文件匹配的任何格式。我以为我很具体。只是代码并不意味着只支持一种文件类型。也许我需要一堆代码来处理每种文件类型——我不知道。我确实尝试过像您一样指定 PixelFormat,但是当文件类型是具有透明度的 GIF 时,这似乎会导致错误。而且,事实上,在不指定 PixelFormat 的情况下,某些变体似乎也适用于 PNG。
  • @JonathanWood 使用旧位图的宽度和高度以及您想要的新格式创建一个新位图。最好在using 语句中创建一个图形对象FromImage(your new bitmap)DrawImage(your old bitmap)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2010-11-16
    • 1970-01-01
    • 2019-05-18
    • 2010-10-25
    • 2023-04-02
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    相关资源
    最近更新 更多