2015-12-03 75 views
2

我对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); 

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

  1. 如果第二种方法是“正确”的方式,第一种方法怎么办?
  2. 我是否需要为每个我希望支持的单个扩展程序自定义保存属性,还是第一个足够用于任何扩展名的方法?
+0

您没有在Save()调用中指定图像格式。所以它被保存为PNG。毫无疑问,文件扩展名错误。这并不会引发太多的程序,它们会查看文件以了解真实的图像格式,它们的头文件标识真正的格式。 PNG是一个非常好的格式,你应该赞成。没有任何方法可以保存.ico或.dds文件,gdiplus没有这种格式的编码器。 ImageFormat.Icon已定义但未实现。 –

+0

真的,我认为.ico是一个.ico文件只是一个PNG(或其他类型,我所知道的)与.ico扩展。为了支持.dds文件(GDI +没有编码器),我必须实现我自己的编码器。这更有意义。谢谢回复! –

回答

0

的正确方法是使用原Bitmap.Save(Filename)但你缺少的imageformat变量,它基本上做的是actualy转换从图像obejct加时赛指定的格式。

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

最好的办法是使用:

Bitmap.Save(String, ImageFormat) 

例如,保存.ico文件:

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

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

+0

只需尝试先推荐自己的代码即可。很容易看到你的代码片段无法工作。 –

+0

我有,它的作品。在检查文档之前已经多次使用过它。 https://msdn.microsoft.com/en-us/library/system.drawing.imaging.imageformat(v=vs.110).aspx – Noxymon

+0

如果您尝试使用该文件作为图标,它将不起作用。我做了一个简单的测试,试图设置一个Windows文件夹图标,它表示它不包含任何图标文件。 –