2014-10-16 2 views
0

Я должен преобразовать BitmapImage (JPEG внутри) в байт [], а затем обратно .WPF BitmapImage - EndInit() бросали NotSupportedException

Вот мой код:

using System.IO; 
using System.Windows.Media.Imaging; 

public class CImageConverter 
    { 
    // 
    public BitmapImage ByteArray_To_BitmapImage(byte[] _binaryData) 
    { 
     BitmapImage _bitmapImage = new BitmapImage(); 
     // 
     _bitmapImage.BeginInit(); 
     _bitmapImage.CacheOption = BitmapCacheOption.OnLoad; 
     _bitmapImage.StreamSource = new MemoryStream(_binaryData); 
     _bitmapImage.EndInit(); 
     // 
     return _bitmapImage; 
    } 

    // 
    public byte[] BitmapImage_To_ByteArray(BitmapImage _bitmapImage) 
    { 
     byte[] bytes; 
     // 
     using(MemoryStream ms = new MemoryStream()) 
     { 
     JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(_bitmapImage)); 
     encoder.Save(ms); 
     bytes = ms.ToArray(); 
     } 
     // 
     return bytes; 
    } 
    } 

Кажется, что BitmapImage_To_ByteArray работает должным образом.

Но ByteArray_To_BitmapImage бросали NotSupportedException в EndInit() метода.

Сообщение (перевод с веб-переводчика):

Не удалось обнаружить компонент обработки изображений, который является подходящим для завершения этой операции.

Я нашел похожие вопросы в Интернете, но ответы не работают. Обычный ответ: «Я попробовал ваш код - у меня все работает нормально».

Я также нашел this suggestion, но не понял, способ его использования.

Благодарим за помощь!

+2

На самом деле ваш код работает. Возможно, вы каким-то образом испортили буфер, который вы передали ByteArray_To_BitmapImage. Тем не менее я предлагаю заменить BitmapImage на BitmapSource (базовый класс), чтобы сделать ваши методы более пригодными для использования. И почему это уродливое подчеркивание некоторых ваших идентификаторов? – Clemens

+0

Сделал конверсию на месте там и обратно (почему я не подумал об этом?) - и все прошло хорошо! Вы правы, проблема в массиве байтов передачи. И уродливые символы подчеркивания - это только знаки локальных переменных :) –

ответ

0
public BitmapImage ToImage(byte[] array) 
{ 
    using (var ms = new System.IO.MemoryStream(array)) 
    { 
    var image = new BitmapImage(); 
    image.BeginInit(); 
    image.CacheOption = BitmapCacheOption.OnLoad; // here 
    image.StreamSource = ms; 
    image.EndInit(); 
    return image; 
    } 
} 

Вы пробовали это?

+0

Да, сделал. Работает точно так же. –