2010-10-08 2 views
3

Я сохраняю BitmapImage в байт [] для сохранения в БД. Я уверен, что данные сохраняются и извлекаются точно, так что это не проблема.ошибка в моем байте [] для преобразования WPF BitmapImage?

На мой байт [] на преобразование BitmapImage я все время получаю исключение из «System.NotSupportedException: компонент обработки изображений, подходящий для завершения этой операции».

Может ли кто-нибудь увидеть, что я делаю неправильно с моими двумя функциями здесь?

private Byte[] convertBitmapImageToBytestream(BitmapImage bi) 
    { 
    int height = bi.PixelHeight; 
    int width = bi.PixelWidth; 
    int stride = width * ((bi.Format.BitsPerPixel + 7)/8); 

    Byte[] bits = new Byte[height * stride]; 
    bi.CopyPixels(bits, stride, 0); 

    return bits; 
    } 

    public BitmapImage convertByteToBitmapImage(Byte[] bytes) 
    { 
    MemoryStream stream = new MemoryStream(bytes); 
    stream.Position = 0; 
    BitmapImage bi = new BitmapImage(); 
    bi.BeginInit(); 
    bi.StreamSource = stream; 
    bi.EndInit(); 
    return bi; 
    } 

ответ

0

Оказывается BitmapImage CopyPixels не прав. Я принимаю вывод bitmapimage и преобразовываю его в нечто, пригодное для использования в этом случае jpg.

public static Byte[] convertBitmapImageToBytestream(BitmapImage bi) 
    { 
    MemoryStream memStream = new MemoryStream(); 
    JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
    encoder.Frames.Add(BitmapFrame.Create(bi)); 
    encoder.Save(memStream); 
    byte[] bytestream = memStream.GetBuffer(); 
    return bytestream; 
    } 
+0

Эй, @ Jippers, я бы хотел посмотреть и другое преобразование ... – zazkapulsk

0

Помогает ли этот вопрос StackOverflow?

byte[] to BitmapImage in silverlight

EDIT:

Попробуйте это, не уверен, что он будет работать:

public BitmapImage convertByteToBitmapImage(Byte[] bytes) 
{ 
    MemoryStream stream = new MemoryStream(bytes); 
    stream.Position = 0; 
    BitmapImage bi = new BitmapImage(); 
    bi.BeginInit(); 
    bi.CacheOption = BitmapCacheOption.OnLoad; 
    bi.DecodePixelWidth = ??; // Width of the image 
    bi.StreamSource = stream; 
    bi.EndInit(); 
    return bi; 
} 

UPDATE 2:

Я нашел эти:

Load a byte[] into an Image at Runtime

BitmapImage from byte[] on a non UIThread

Помимо этого, я не знаю.

+0

извините, все еще не работает. такое же исключение – Jippers

0

Откуда вы знаете, что созданный вами формат byte [] - это то, что ожидает BI в потоке? Почему вы не используете BitmapImage.StreamSource для создания байта [], который вы сохраняете? Тогда вы знаете, формат будет совместим.

http://www.codeproject.com/KB/vb/BmpImage2ByteArray.aspx

http://social.msdn.microsoft.com/forums/en-US/wpf/thread/8327dd31-2db1-4daa-a81c-aff60b63fee6/

[Я не пробовал любой из этого кода, но вы можете]