C# Bitmap Save Generic GDI+ Error
Image.Save 方法 (String)
将该 Image 保存到指定的文件或流。
程序集: System.Drawing(在 System.Drawing.dll 中)
public void Save( string filename )
参数
- filename
- 类型:System.String
字符串,包含要将此 Image 保存到的文件的名称。
异常 | 条件 |
---|---|
ArgumentNullException |
filename 为 null.。 |
ExternalException |
该图像以错误的图像格式保存。 - 或 - 该图像被保存到创建该图像的文件。 |
如果图像的文件格式的编码器不存在,则使用可移植网络图形 (PNG) 编码器。 使用 Save 方法将图形图像保存为 Windows 图元文件格式 (WMF) 或增强型图元文件格式 (EMF) 文件时,结果文件将另存为可移植网络图形 (PNG) 文件。 发生此行为是由于 .NET Framework 的 GDI+ 组件没有可用来将文件另存为 .wmf 或 .emf 文件的编码器。
不允许将图像保存到构造该图像的文件,这样会引发异常。
Reference:http://www.codeproject.com/Questions/52709/C-Bitmap-Save-Generic-GDI-Error
这个网页里解释了为什么会出现这样的问题和怎么解决的。
Refernence:
GDI+中发生一般性错误
Bitmap构造函数
命名空间: System.Drawing
程序集: System.Drawing(在 System.Drawing.dll 中)
1.从指定的现有图像初始化 Bitmap 类的新实例。
public Bitmap( Image original )
参数
- original
- 类型:System.Drawing.Image
从中创建新 Bitmap 的 Image。
2.从指定的文件初始化 Bitmap 类的新实例。
public Bitmap( string filename )
参数
- filename
- 类型:System.String
位图文件的名称和路径。
异常 | 条件 |
---|---|
FileNotFoundException |
找不到指定文件。 |
文件名和路径可以是相对于应用程序的路径或者是绝对路径。 使用此构造函数打开以下文件格式的图像:BMP、GIF、EXIF、JPG、PNG 和 TIFF。 有关支持的格式的更多信息,请参见位图类型。 在释放 Bitmap 之前,此文件将一直保持锁定状态。
Image.FromFile 一旦使用后,对应的文件在一直调用 其生成的Image对象被Disponse前都不会被解除锁定,这就造成了一个问题,就是在这个图形被解锁前无法对图像进行操作(比如删除,修改等操作).
举例代码
第一段代码 Bitmap bmp = new Bitmap("1.bmp"); bmp.save("1.bmp"); //这里抛出异常“GDI+发生一般错误” 第二段代码 Image img = Image.FomFile("1.bmp"); 或 Bitmap img = new Bitmap("1.bmp"); Bitmap bmp = new Bitmap(img) img.Dispose(); bmp.save("1.bmp"); //而这里却不会 原因:第一段就不用多说了,图像被锁定,不能保存同一文件 第二段虽然1.bmp也被锁定了,但是new Bitmap(img)后是一个新的实例,相当于复制了一份图像。img.Dispose将1.bmp接触锁定释放了。
reference:Image.FromFile 方法会锁住文件的原因及可能的解决方法