返回由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 }
- 根据一些人明确处理/关闭 MemoryStream是没有必要的,因为它不使用任何非托管资源,其他人说相反的事情,所以它是一种两难的问题。
- Image.Dispose方法不会处理创建Image的流ftom
- Image类不保存对传递给Image.FromStream方法的Stream的任何引用,因此GC最终将收集流…? 因此Image.Save方法中的exception
- 返回一个包装类,其中包含对流的引用和由它创建的Image,从而使我们能够同时处理它们……? 或者只是使用Tag属性来保持对父流的引用……?
- 使用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); } }
- 如何在不使用foreach的情况下将ArrayList转换为强类型通用列表?
- 使用RoutedEventArgs传递变量?
- 如何在vNext Web应用程序中进行服务器端状态管理
- 如何防止WebClient类自动跟踪标题中的位置?
- 由Windows.Security.Cryptography.CryptographicBuffer中的方法生成的IBuffer对象是否具有安全function?
- 为什么Microsoft Visual C#2008 Express Edition调试器会随机退出?
- C#Clipboard.GetText()
- 第一次外部登录尝试重定向回登录操作,第二次登录操作
- NHibernate:选择带有元素包中条目的项目