Image.Save(..)抛出一个GDI +exception,因为内存stream已closures
我有一些我想保存为图像的二进制数据。 当我尝试保存图像时,如果用于创build图像的内存stream在保存之前closures,则会引发exception。 我这样做的原因是因为我dynamic创build图像,因此我需要使用内存stream。
这是代码:
[TestMethod] public void TestMethod1() { // Grab the binary data. byte[] data = File.ReadAllBytes("Chick.jpg"); // Read in the data but do not close, before using the stream. Stream originalBinaryDataStream = new MemoryStream(data); Bitmap image = new Bitmap(originalBinaryDataStream); image.Save(@"c:\test.jpg"); originalBinaryDataStream.Dispose(); // Now lets use a nice dispose, etc... Bitmap2 image2; using (Stream originalBinaryDataStream2 = new MemoryStream(data)) { image2 = new Bitmap(originalBinaryDataStream2); } image2.Save(@"C:\temp\pewpew.jpg"); // This throws the GDI+ exception. }
有没有人有任何build议,我怎么可以保存与closuresstream的图像? 保存图像后,我不能依靠开发人员记得closuresstream。 实际上,开发人员没有IDEA认为图像是使用内存stream生成的(因为它发生在其他地方的其他代码中)。
我真的很困惑:(
因为它是一个MemoryStream,所以你真的不需要closures这个stream – 如果你不这样做,没有什么不好的,尽pipe显然这是一个很好的习惯。 (有关这方面的更多信息,请参阅此问题 。)
但是,您应该放置位图 – 这将为您closuresstream。 基本上,一旦你给位图的构造函数一个stream,它“拥有”stream,你不应该closures它。 作为该构造函数的文档说:
您必须保持该stream在Bitmap的生命周期中处于打开状态。
我找不到任何文件承诺closuresstream当你处置位图,但你应该能够相当容易地validation。
在GDI +中发生了一个通用错误。 也可能导致不正确的保存path ! 花了我半天的时间来注意到这一点。 因此,请确保您已经双击检查path以保存图像。
也许值得一提的是,如果C:\ Temp目录不存在,即使你的stream仍然存在,它也会抛出这个exception。
我有同样的问题,但实际上原因是应用程序没有权限保存在C上的文件。当我更改为“D:\ ..”图片已保存。
当我从Citrix尝试时,发生了这个错误。 映像文件夹被设置为C:\在服务器中,我没有特权。 一旦图像文件夹被移动到共享驱动器,错误消失了。
复制位图。 您必须保持该stream在位图的整个生命周期中打开。
绘制图像时:System.Runtime.InteropServices.ExternalException:在GDI中发生一般性错误
public static Image ToImage(this byte[] bytes) { using (var stream = new MemoryStream(bytes)) using (var image = Image.FromStream(stream, false, true)) { return new Bitmap(image); } } [Test] public void ShouldCreateImageThatCanBeSavedWithoutOpenStream() { var imageBytes = File.ReadAllBytes("bitmap.bmp"); var image = imageBytes.ToImage(); image.Save("output.bmp"); }
在GDI +中发生了一个通用错误。 这可能是由于图像存储path问题,我得到这个错误,因为我的存储path太长,我解决这个问题,首先存储图像在最短的path,并将其移动到正确的位置与长path处理技术。
您可以尝试创build另一个位图副本:
using (var memoryStream = new MemoryStream()) { // write to memory stream here memoryStream.Position = 0; using (var bitmap = new Bitmap(memoryStream)) { var bitmap2 = new Bitmap(bitmap); return bitmap2; } }
一个奇怪的解决scheme,使我的代码工作。 在油漆中打开图像并将其保存为具有相同格式(.jpg)的新文件。 现在尝试这个新的文件,它的工作原理。 它清楚地解释了这个文件可能被破坏了。 这只有在你的代码修复了其他错误的时候才有帮助
我得到这个错误,因为我正在执行的自动化testing,试图将快照存储到一个不存在的文件夹中。 在我创build文件夹后,错误解决了
当我试图将图像保存到path中时,它也出现在我的面前
C:\Program Files (x86)\some_directory
和.exe
没有执行以pipe理员身份运行,我希望这可以帮助有同样问题的人也。