我正在将一批.bmp转换为.png。这是代码的相关部分:
foreach (string path in files) {
using (fs = new FileStream(path, FileMode.Open)) bmp = new Bitmap(fs);
using (ms = new MemoryStream()) {
bmp.Save(ms, ImageFormat.Png);
bmp.Dispose();
png = Image.FromStream(ms);
}
png.Save(path);
}
在bmp.Save(ms, ImageFormat.Png);
行,抛出以下异常:
System.Runtime.InteropServices.ExternalException:“ GDI +中发生一般错误。”
根据MSDN,这意味着图像以错误的格式保存或保存到读取的位置。后者并非如此。但是,我看不出如何给它错误的格式:在同一MSDN页面上,给出了一个示例,其中.bmp以相同的方式转换为.gif。
与我保存到MemoryStream是否有关?这样做是为了使我可以用转换后的文件覆盖原始文件。 (请注意,.bmp后缀是有意保留的。这不应该是问题,因为在保存最终文件之前会出现异常。)
答案 0 :(得分:1)
在该Bitmap constructor的MSDN文档中说:
在位图的整个生命周期中,必须保持流打开。
,同样的评论可以在Image.FromStream
上找到。
因此,您的代码应仔细处理用于每个位图/图像的流的范围和生存期。
结合以下所有代码可以正确处理这些流:
col-md-2