【发布时间】:2020-05-01 22:57:11
【问题描述】:
我正在开发一个简单的图形应用程序:上传图像,对其进行编辑并保存。我尝试了各种方法,但都以某种方式失败了。
我首先尝试像这样加载位图:
imageFromName = new Bitmap(FileName1);
并像这样保存它:
imageFromName.Save(FileName1);
但它引发了“GDI + 中的一般错误”。异常。另外,此时Windows资源管理器不允许我删除文件,所以我认为问题是对象“imageFromName”保持文件打开并且不允许覆盖它,所以我修改了这样的代码:
imageFromName = new Bitmap(FileName1);
imageCloned = (Bitmap)imageFromName.Clone();
imageFromName.Dispose();
imageCloned.Save(FileName1);
程序在imageCloned.Save (FileName1)中不断抛出同样的异常
因此,我在 Stackoverflow 上寻求帮助,并看到了几个类似的问题,这些问题的答案建议检查应用程序是否具有写入权限。所以我修改了代码来检查它:
imageFromName = new Bitmap(FileName1);
imageFromName.Save(FileName2);
在这种情况下,程序在保存文件时没有抛出任何异常,但我仍然无法修改原始文件,也无法使用Windows资源管理器将其删除。它只是为我创建了文件的副本。
所以我考虑以另一种方式加载位图并修改如下代码:
try
{
System.IO.FileStream fs = new System.IO.FileStream(FileName1, System.IO.FileMode.Open);
imageFromStream = new System.Drawing.Bitmap(fs);
fs.Close();
}
catch (Exception ex)
{
Console.WriteLine("Error loading Bitmap.", ex);
}
在这种情况下,应用程序没有抛出任何异常,并且可以在 PictureBox 中很好地看到位图。此外,资源管理器允许我删除该文件。但是,当使用 imageFromStream.Save (imageFromStream) 保存文件时,它一直为我生成异常。
这次的不同是Save ()方法尽管抛出了异常,但是会覆盖原始文件,而是生成一个带有头信息的54字节文件。
使用十六进制编辑器打开两个文件,原始文件和副本,我验证了标题信息除了图像大小和 BITMAPINFOHEADER 的偏移量之外是相同的。只是缺少图纸的信息。
我已阅读有关 System.Drawing.Bitmap.Save () 方法的官方 Microsoft 文档,但没有发现任何限制。但我会说它在某些像素格式上存在问题。
但是,我不想将我的应用程序限制为 32bpp 文件,然后:
1-将System.Drawing.Bitmap 对象的图像保存到 24bpp 文件的最佳方法是什么?
2-System.Drawing.Bitmap.Save()还有什么我应该知道的限制吗?
【问题讨论】:
-
你可以试试 save 的重载,它允许你指定一个ImageFormat
标签: c# file exception bitmap gdi+