Прочитать образ из varbinary case sql server c #

1

У меня проблема, когда я пытаюсь преобразовать поток в изображение. Это показывает мне ошибку: Image returnImage = Image.FromStream(ms);

if (reader[12] != System.DBNull.Value)
{
    Byte[] image = (Byte[])reader[12];
    c.image = byteArrayToImage(image);
}

public Image byteArrayToImage(byte[] byteArrayIn)
{
    MemoryStream ms = new MemoryStream();
    ms.Write(byteArrayIn, 0, byteArrayIn.Length);
    ms.Seek(0, SeekOrigin.Begin);
    ms.Close();
    Image returnImage = Image.FromStream(ms);
    return returnImage;
}
Теги:
sql-server
image

2 ответа

3

Вы не должны закрывать поток так скоро:

   ms.Close();  // <- That wrong:
   // You can't create an image from a disposed stream
   Image returnImage = Image.FromStream(ms); 

Сделайте это так:

  ...
  using (MemoryStream ms = new MemoryStream()) {
    ms.Write(byteArrayIn, 0, byteArrayIn.Length);
    ms.Seek(0, SeekOrigin.Begin);

    return Image.FromStream(ms);
  }
3
MemoryStream ms = new MemoryStream();
ms.Write(byteArrayIn, 0, byteArrayIn.Length);
ms.Seek(0, SeekOrigin.Begin);
ms.Close();  // <-- Remove this line

Image returnImage = Image.FromStream(ms);
return returnImage;

В этом коде вы закрываете поток перед созданием изображения. Вы не можете читать из закрытого потока. Измените свой код на это:

using (MemoryStream ms = new MemoryStream(byteArrayIn))
{
    Image returnImage = Image.FromStream(ms);
    return returnImage;
}

Этот код может генерировать ошибки GDI+. Таким образом, вам не нужно бояться вообще не избавляться от потока. Сборщик мусора будет делать это в любом случае, поэтому, если вы получите ошибки в GDI+, используйте это:

MemoryStream ms = new MemoryStream(byteArrayIn);
Image returnImage = Image.FromStream(ms);
return returnImage;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню