Преобразование изображения JPEG в байтовый массив - исключение COM
Используя С#, я пытаюсь загрузить файл 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. Можете ли вы сказать, что не так с вышеуказанным кодом?
Ответы
Ответ 1
Проверьте примеры из этой статьи: 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();
}
Ответ 2
Другое предложение:
byte[] image = System.IO.File.ReadAllBytes ( Server.MapPath ( "noimage.png" ) );
Должен работать не только с изображениями.
Ответ 3
public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
return ms.ToArray();
}
Ответ 4
Причина, по которой эта ошибка возникает, заключается в том, что метод BitmapFrame.Create(), используемый вами по умолчанию, зависит от нагрузки OnDemand. BitmapFrame не пытается прочитать связанный с ним поток до вызова кодера. Сохраните, по какой точке поток уже расположен.
Вы можете либо обернуть всю функцию в блоке {}, либо использовать альтернативный BitmapFrame.Create(), например:
BitmapFrame.Create(fs, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);