Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不使用MemoryStream将字节[]转换为图像_C# - Fatal编程技术网

C# 不使用MemoryStream将字节[]转换为图像

C# 不使用MemoryStream将字节[]转换为图像,c#,C#,将SQL图像导出到文件时遇到问题。我首先初始化一个列表。MyRecord是一个具有GraphicName和Graphic属性的类。当我尝试遍历列表并将MyRecord.Graphic保存到磁盘时,我第一次遇到类型为“System.ObjectDisposedException”的异常。我意识到这是因为,当我将数据库中的字节转换为图像时,我在MemoryStream中使用了using语句。我不能使用using语句,它可以正常工作,但我担心多达6000条记录的内存使用/内存泄漏。是否有其他方法将字节

将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方法。然后调用方负责处理图像。