将位图保存为任何格式

Posted

技术标签:

【中文标题】将位图保存为任何格式【英文标题】:Save bitmap to any format 【发布时间】:2015-12-03 14:05:46 【问题描述】:

我对 C# 保存位图的方式有点困惑。我目前使用此语句将位图保存到(实际上)任何扩展名(.ico、.dds 等)。

Bitmap.Save(FileName);

这实际上适用于我选择的任何扩展,但我怀疑它是否以正确的格式保存。之所以说疑问是因为我在这里找到了另一篇文章, How to save Bitmap as icon?,就是这样:

// Create a Bitmap object from an image file.
Bitmap bmp = new Bitmap(sFn);

// Get an Hicon for myBitmap. 
IntPtr Hicon = bmp.GetHicon();

// Create a new icon from the handle. 
 Icon newIcon = Icon.FromHandle(Hicon);

//Write Icon to File Stream
System.IO.FileStream fs = new System.IO.FileStream(destFileName, System.IO.FileMode.OpenOrCreate);
newIcon.Save(fs);

这显然是不同的。所以两个问题:

    如果第二种方法是“正确”的方法,第一种方法如何/如何工作? 是否需要为我希望支持的每个扩展自定义保存属性,或者第一种方法是否足以满足任何扩展?

【问题讨论】:

您没有在 Save() 调用中指定图像格式。所以它被保存为PNG。毫无疑问,使用错误的文件扩展名。这不会让太多程序出错,它们会查看文件以了解真实的图像格式,它们的标题标识真实格式。 PNG 是一种非常好的格式,您应该喜欢它。没有任何方法可以保存 .ico 或 .dds 文件,gdiplus 没有此类格式的编码器。 ImageFormat.Icon 已定义但未实现。 所以说真的,我认为是 .ico 的 .ico 只是带有 .ico 扩展名的 .png(或其他类型,据我所知)。为了支持 .dds 等文件(GDI+ 没有编码器),我必须实现自己的编码器。这更有意义。感谢您的回复! 【参考方案1】:

正确的方法是使用原始的Bitmap.Save(Filename),但您缺少 ImageFormat 变量,该变量基本上会从指定格式的图像对象进行实际转换。

目前您使用它的方式会生成一个名为“somefile.somextension”的文件,但没有图标对象的实际内容。

最好的方法是使用:

Bitmap.Save(String, ImageFormat)

例如,保存 .ico 文件:

Bitmap.Save(String, System.Drawing.Imaging.ImageFormat.Icon)

希望这会有所帮助,祝你好运。

【讨论】:

先试试你自己推荐的代码。很容易看出你的 sn-p 永远无法工作。 我有,它有效。在检查文档之前已经使用过几次。 msdn.microsoft.com/en-us/library/… 如果您尝试将文件用作图标,它将无法正常工作。我做了一个简单的测试,尝试为其设置一个 Windows 文件夹图标,它说它不包含任何图标文件。 这可能是由于不同版本的 Windows 支持 .ico 文件的不同像素比率。

以上是关于将位图保存为任何格式的主要内容,如果未能解决你的问题,请参考以下文章

位图保存 jpeg 失败但 png 可以,因为 comments 属性

ActionScript 3 将位图保存到AS3中的任何内容

将 ImageView 转换为具有本机分辨率的位图

将位图保存到AS3中的任何对象

保存位图时 Alpha 值不保留

如何在 c# 中的 iTextSharp pdf 中将位图显示为 jpeg 格式