Преобразование изображения JPEG в байтовый массив - исключение COM - PullRequest
20 голосов
/ 14 сентября 2011

Используя C #, я пытаюсь загрузить файл JPEG с диска и преобразовать его в байтовый массив.Пока у меня есть этот код:

static void Main(string[] args)
{
    System.Windows.Media.Imaging.BitmapFrame bitmapFrame;

    using (var fs = new System.IO.FileStream(@"C:\Lenna.jpg", FileMode.Open))
    {
        bitmapFrame = BitmapFrame.Create(fs);
    }

    System.Windows.Media.Imaging.BitmapEncoder encoder = 
        new System.Windows.Media.Imaging.JpegBitmapEncoder();
    encoder.Frames.Add(bitmapFrame);

    byte[] myBytes;
    using (var memoryStream = new System.IO.MemoryStream())
    {
        encoder.Save(memoryStream); // Line ARGH

        // mission accomplished if myBytes is populated
        myBytes = memoryStream.ToArray(); 
    }
}

Однако, выполнение строки ARGH дает мне сообщение:

COMException не обработано.Дескриптор недействителен.(Исключение из HRESULT: 0x80070006 (E_HANDLE))

Не думаю, что в файле есть что-то особенное Lenna.jpg - я скачал его с http://computervision.wikia.com/wiki/File:Lenna.jpg. Можете ли вы сказать, чточто-то не так с кодом выше?

Ответы [ 4 ]

45 голосов
/ 14 сентября 2011

Проверьте примеры из этой статьи: http://www.codeproject.com/KB/recipes/ImageConverter.aspx

Также лучше использовать классы от System.Drawing

Image img = Image.FromFile(@"C:\Lenna.jpg");
byte[] arr;
using (MemoryStream ms = new MemoryStream())
{
    img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
    arr =  ms.ToArray();
}
12 голосов
/ 06 марта 2014

Другое предложение:

byte[] image = System.IO.File.ReadAllBytes ( Server.MapPath ( "noimage.png" ) );

Должна работать не только с изображениями.

4 голосов
/ 04 апреля 2013
public byte[] imageToByteArray(System.Drawing.Image imageIn)  
{   
 MemoryStream ms = new MemoryStream();     

 imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);   
 return  ms.ToArray();   
}
3 голосов
/ 20 февраля 2013

Причина, по которой эта ошибка возникает, заключается в том, что метод BitmapFrame.Create (), который вы используете, по умолчанию загружается из OnDemand. BitmapFrame не пытается прочитать поток, с которым он связан, до вызова кодировщика. Сохранение, к которому точка уже удаляется.

Вы можете либо обернуть всю функцию в блоке using {}, либо использовать альтернативный BitmapFrame.Create (), например:

BitmapFrame.Create(fs, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...