返回由Image.FromStream(Stream stream)方法创建的图像

我有这个函数在函数中返回一个Image,使用Image.FromStream方法创建图像根据MSDN :

您必须在图像的生命周期内保持流打开

所以我没有关闭流(如果我关闭了蒸汽,则从返回的图像对象中抛出GDI +exception)。 我的问题是当在返回的Image上的其他地方调用Image.Dispose()时是否关闭/处理

public static Image GetImage(byte[] buffer, int offset, int count) { var memoryStream = new MemoryStream(buffer, offset, count); return Image.FromStream(memoryStream); } 

正如其中一个答案中所建议的那样, 使用不是可行的方法,因为它会引发exception:

 public static Image GetImage(byte[] buffer, int offset, int count) { using(var memoryStream = new MemoryStream(buffer, offset, count)) { return Image.FromStream(memoryStream); } } public static void Main() { var image = GetImage(args); image.Save(path); <-- Throws exception } 
  1. 根据一些人明确处理/关闭 MemoryStream是没有必要的,因为它不使用任何非托管资源,其他人说相反的事情,所以它是一种两难的问题。
  2. Image.Dispose方法不会处理创建Image的流ftom
  3. Image类不保存对传递给Image.FromStream方法的Stream的任何引用,因此GC最终将收集流…? 因此Image.Save方法中的exception
  4. 返回一个包装类,其中包含对流的引用和由它创建的Image,从而使我们能够同时处理它们……? 或者只是使用Tag属性来保持对父流的引用……?
  5. 使用MemoryStream时似乎只会出现此问题。 如果从ConnectStream创建映像,即使处理了父流,也不会发生任何不良情况。

尽管其他人建议做什么,但在图像处理之前,不应关闭或处理流。

MSDN声明:

您必须在图像的生命周期内保持流打开。

对于某些流,如MemoryStream ,处理没有太大用处,因为它不分配非托管资源。 另一方面,文件流也是如此,因此除非您非常确定流是安全的,否则在完成图像后应始终处理流。

处理图像不会影响内存流,如下例所示:

 static void Main(string[] args) { byte[] contents = File.ReadAllBytes(DESKTOP_PATH + "asample.tif"); MemoryStream ms = new MemoryStream(contents); Image img = Image.FromStream(ms); img.Dispose(); Image img2 = Image.FromStream(ms); Console.WriteLine(img2.PixelFormat); Console.ReadKey(); } 

这将输出“Format32bppPargb”。 我建议将它包装成一个使用语句,如下所示:

 using (MemoryStream ms = new MemoryStream(contents){ // code here } 

由于您只构建一个Image然后保存它,请考虑使用此实现:

  public static void GetAndSaveImage(byte[] buffer, int offset, int count,string path) { using(var memoryStream = new MemoryStream(buffer, offset, count)) using(var img = Image.FromStream(memoryStream)) { img.Save(path); } }