2016-10-19 2 views
0

Теперь я пытаюсь получить Image Image из jpg Image. Я уже пытался использовать BitmapSource, связанный по адресу here.Как я могу получить класс изображений из MemoryStream jpg Image?

Ошибка не английская, но смысл в том, что «заголовок изображения сломан, поэтому его невозможно декодировать». Другие форматы, такие как gif, png, bmp, не имеют проблем. только формат jpg, столкнувшийся с этой проблемой.

< Sequence> Zip архивный файл (JPG-файл находится в этом файле.) -> распаковать библиотека -> MemoryStream (JPG-файл) -> BitmapSource

imageSource.BeginInit(); 
imageSource.StreamSource = memoryStream; 
imageSource.EndInit(); 

этот код делает ошибку.

Я думаю, что причина в том, что поток памяти имеет двоичный двоичный файл jpg, и это не формат Bitmap. Таким образом, BitmapSource не может распознать данные потока данных в виде растрового изображения.

Как я могу решить эту проблему? Моя цель в том, что Input: «ZIP-файл (в jpg)» -> Выход: Image Class.

Спасибо!

< Мой код>

using (MemoryStream _reader = new MemoryStream()) 
{ 
    reader.WriteEntryTo(_reader);    // <- input jpg_data to _reader 
    var bitmap = new BitmapImage(); 
    bitmap.BeginInit(); 
    bitmap.CacheOption = BitmapCacheOption.OnLoad; 
    bitmap.StreamSource = _reader; 
    bitmap.EndInit(); 
    bitmap.Freeze(); 

    Image tmpImg = new Image(); 
    tmpImg.Source = bitmap; 
} 
+0

BitmapImage может, конечно, декодировать буфер JPG. Вероятно, вы забыли перемотать поток где-то, например, например. 'stream.Position = 0;' Вы должны показать нам больше вашего кода. – Clemens

+0

Спасибо! Я прикрепил свой код. –

ответ

0

Rewind поток после записи. Хотя, по-видимому, только JpegBitmapDecoder влияет на исходный поток Position, вы обычно должны делать это для всех видов потоков растровых изображений.

var bitmap = new BitmapImage(); 

using (var stream = new MemoryStream()) 
{ 
    reader.WriteEntryTo(stream); 
    stream.Position = 0; // here 

    bitmap.BeginInit(); 
    bitmap.CacheOption = BitmapCacheOption.OnLoad; 
    bitmap.StreamSource = stream; 
    bitmap.EndInit(); 
    bitmap.Freeze(); 
} 

var tmpImg = new Image { Source = bitmap }; 

И только в случае, если вы на самом деле не волнует ли источник вашего изображения является BitmapImage или BitmapFrame, вы можете уменьшить свой код на этот:

BitmapSource bitmap; 

using (var stream = new MemoryStream()) 
{ 
    reader.WriteEntryTo(stream); 
    stream.Position = 0; 
    bitmap = BitmapFrame.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); 
} 

var tmpImg = new Image { Source = bitmap }; 
+0

Спасибо большое! Хорошо работает. Я не знаю, что мне нужно перемотать поток. Кроме того, добавленные коды являются awsome! –

Смежные вопросы