C# 不使用MemoryStream将字节[]转换为图像
将SQL图像导出到文件时遇到问题。我首先初始化一个列表。MyRecord是一个具有GraphicName和Graphic属性的类。当我尝试遍历列表并将MyRecord.Graphic保存到磁盘时,我第一次遇到类型为“System.ObjectDisposedException”的异常。我意识到这是因为,当我将数据库中的字节转换为图像时,我在MemoryStream中使用了using语句。我不能使用using语句,它可以正常工作,但我担心多达6000条记录的内存使用/内存泄漏。是否有其他方法将字节转换为图像,或者是否有更好的设计C# 不使用MemoryStream将字节[]转换为图像,c#,C#,将SQL图像导出到文件时遇到问题。我首先初始化一个列表。MyRecord是一个具有GraphicName和Graphic属性的类。当我尝试遍历列表并将MyRecord.Graphic保存到磁盘时,我第一次遇到类型为“System.ObjectDisposedException”的异常。我意识到这是因为,当我将数据库中的字节转换为图像时,我在MemoryStream中使用了using语句。我不能使用using语句,它可以正常工作,但我担心多达6000条记录的内存使用/内存泄漏。是否有其他方法将字节
... prior code
using (SqlDataReader reader = sqlCommand.ExecuteReader())
{
while (reader.Read())
{
MyRecord record = new MyRecord();
record.GraphicId = reader["GRAPHIC_ID"].ToString();
record.Graphic = !reader.IsDBNull(reader.GetOrdinal("IMAGE")) ? GetImage((byte[])reader["IMAGE"]) : null;
records.Add(record);
}
... more code
private Image GetImage(byte[] rawImage)
{
using (System.IO.MemoryStream ms = new System.IO.MemoryStream(rawImage))
{
Image image = Image.FromStream(ms);
return image;
}
}
您不应该将using
语句与将传递到Image.FromStream
的流一起使用,因为Image
类从那时起基本上负责流。从:
您必须在映像的生命周期内保持流打开
只需将代码更改为:
private Image GetImage(byte[] rawImage)
{
var stream = new MemoryStream(rawImage);
return Image.FromStream(stream);
}
。。。但是,请确保稍后处理图像
对象。这将处理流,允许对内存进行垃圾收集。这样就不会有任何内存泄漏,但您需要确定是否可以一次将所有6000个图像加载到内存中
(如果您不处理图像
对象,它们可能在某个时刻最终确定-但最好是确定地处理它们。)您不应该将using
语句与将传递给图像的流一起使用,因为从那时起,Image
类基本上负责流。从:
您必须在映像的生命周期内保持流打开
只需将代码更改为:
private Image GetImage(byte[] rawImage)
{
var stream = new MemoryStream(rawImage);
return Image.FromStream(stream);
}
。。。但是,请确保稍后处理图像
对象。这将处理流,允许对内存进行垃圾收集。这样就不会有任何内存泄漏,但您需要确定是否可以一次将所有6000个图像加载到内存中
(如果你不处理图像
对象,它们可能会在某个时候最终确定-但最好是确定地处理它们。)为什么你不能直接将字节[]
保存到文件中?@Oded我可以,但图像会在某个时候显示,所以我也需要图像。你的是重新设计的可能解决方案。为什么你不能将字节[]
直接保存到文件中?@Oded我可以,但是图像会显示出来,所以在某个时候我也需要图像。你的是一个重新设计的可能解决方案。我知道我不能使用using语句,但我希望得到一个答案,让我在列表中保留一个图像。我更改了设计以保存字节[],并在类中添加了一个GetAsImage方法。然后调用方负责处理图像。我知道我不能使用using语句,但我希望得到一个答案,使我能够在列表中保留图像。我更改了设计以保存字节[],并在类中添加了一个GetAsImage方法。然后调用方负责处理图像。