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

Abd*_*eem 11 c# dispose image stream

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

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

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

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

正如其中一个答案中所建议的,使用不是要走的路,因为它会引发异常:

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
}
Run Code Online (Sandbox Code Playgroud)
  1. 按照一些人的明确处置/关闭一个MemoryStream的,因为它不使用任何非托管资源,也有人说,相反的事情,所以它的那种进退两难的是没有必要的.
  2. Image.Dispose方法不会处理创建Image的流ftom
  3. Image类不保存对传递给Image.FromStream方法的Stream的任何引用,因此GC最终将收集流...?因此Image.Save方法中的异常
  4. 返回一个包装类,其中包含对流的引用和由它创建的Image,从而使我们能够同时处理它们......?或者只是使用Tag属性来保持对父流的引用......?
  5. 使用MemoryStream时似乎只会出现此问题.如果从ConnectStream创建映像,即使处理了父流,也不会发生任何不良情况.

Pat*_*man 5

尽管有其他建议,但在处理完图像之前,您不应关闭或处理流。

MSDN指出:

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

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


小智 1

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

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();


    }
Run Code Online (Sandbox Code Playgroud)

这将输出“Format32bppPargb”。我建议将其包装到 using 语句中,如下所示:

using (MemoryStream ms = new MemoryStream(contents){
            // code here
        }
Run Code Online (Sandbox Code Playgroud)