将位图保存为任何格式
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 属性