c#Bitmap.Save transparancy不保存在png中

时间:2010-02-05 08:00:36

标签: c# image png bitmap save

我正在尝试将具有透明性的Bitmap类保存为具有透明度的png文件。 我没有运气。

位图具有透明度,它只是不保存透明度。

这就是我正在做的事情

位图设置

Bitmap ret = new Bitmap(bWidth, bHeight, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

saveing

ret.Save(filename, ImageFormat.Png);

我也尝试用文件流保存文件,这没什么区别。

当图像在图片框中时,透明度存在,但是当我保存时,我只是得到黑色背景。

我真的不想使用任何第三方代码,他们找到了办法,我也愿意。

感谢。

10 个答案:

答案 0 :(得分:7)

你确定Bitmap的像素格式是 System.Drawing.Imaging.PixelFormat.Format32bppArgb 吗?我只是偶然发现了这个问题,因为我遇到了同样的问题,但这是因为我正在加载一个没有像素格式的alpha分量的图像。我做了

    Bitmap output = original.Clone(rect, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

并正确保存了带有alpha分量的PNG。

此外,如果您使用的是 MakeTransparent(),请确保您的图片中存在透明的颜色。

答案 1 :(得分:2)

我已经完成图像编辑/保存了一段时间但是如果我记得正确的PNG与大多数人不同。我认为你必须使用一个实际的FileStream。

编辑:啊,找到了一个例子here

FileStream imageStream= new FileStream( filename, FileMode.Create );
myBitmap.Save( imageStream, ImageFormat.Png );
imageStream.Close();

EDIT2:经过对此的更多研究后,我认为只有在某些情况下才需要中间步骤。

也有可能因为你正在使用“MakeTransparent”它捕获一个索引的alpha,但是试图根据每个像素的实际alpha值进行保存。您可以尝试实际设置图像的Alpha值。

答案 2 :(得分:2)

原因是Bitmap类不适用于透明度。

您需要将Bitmap投射到Image

Bitmap ret = new Bitmap(bWidth, bHeight, 
                        System.Drawing.Imaging.PixelFormat.Format32bppArgb);    

ret.MakeTransparent(Color.White);     // Change a color to be transparent
Image img = (Image) ret;
img.Save(filename, ImageFormat.Png);  // Correct PNG save

答案 3 :(得分:1)

ret.MakeTransparent(...);

答案 4 :(得分:1)

您是否尝试过使用Bitmap.MakeTransparent()方法?

答案 5 :(得分:1)

我只是想提醒大家MakeTransparent,正如我在这里建议的那样,只使特定颜色透明。它没有考虑argb图像的Alpha通道。因此,alpha值为100的像素,如果与MakeTransparent提供的颜色不匹配,则不会具有部分透明度。

答案 6 :(得分:0)

保存为PNG需要可搜索的流,如FileStream或MemoryStream。如果你保存到其中一个并从那里开始将有没有GDI +例外或类似。希望这会有所帮助。

答案 7 :(得分:0)

我假设对话框的FilterIndex从0开始...但它实际上从1开始,所以我的图像使用alpha透明度保存为Gifs,而gif不支持alpha透明度。所以我的问题实际上是对话框。

答案 8 :(得分:0)

Portable Network Graphhics(.png)格式支持transpareny,因此将图像集图像格式保存到ImageFormat.Png。

        //update image to database
        MemoryStream msImage = new MemoryStream();
        imgPhoto.Save(msImage, System.Drawing.Imaging.ImageFormat.Png);
        byte[] Img = (byte[])msImage.ToArray();

因此,如果以Jpeg等任何其他格式保存,将会失去透明度。希望它有所帮助。

答案 9 :(得分:0)

虽然问题已经很久了,但仍然是代码在我这里工作。

decltype