Получить изображение из базы данных WPF [дубликат]

Классы нового стиля наследуют от object или от другого нового класса стиля:

class SomeObject(object):
    pass

class SubObject(SomeObject):
    pass

В классах старого стиля нет:

class SomeObject:
    pass

Это только применяется к Python 2 - в Python 3 все вышеперечисленное создаст классы нового стиля.

См. 9. Классы (учебник по Python), NewClassVsClassicClass и В чем разница между старым стилем и новыми классами стилей в Python? для деталей.

2
задан Ria 13 January 2013 в 07:42
поделиться

1 ответ

В вашем ToByteArray методе есть две проблемы.

Сначала он вызывает BeginInit и EndInit в уже инициализированном экземпляре BitmapImage. Это недопустимо, см. Список Исключения в BeginInit .

Во-вторых, этот метод нельзя было вызвать в BitmapImage, который был создан из Uri вместо потока. Тогда свойство StreamSource будет null.

Я предлагаю реализовать метод, как показано ниже. Эта реализация будет работать для любого BitmapSource, а не только для BitmapImages. И вы можете управлять форматом изображения, выбирая соответствующий BitmapEncoder , например. JpegBitmapEncoder вместо PngBitmapEncoder.

public static byte[] ToByteArray(this BitmapSource bitmap)
{
    var encoder = new PngBitmapEncoder(); // or any other encoder
    encoder.Frames.Add(BitmapFrame.Create(bitmap));

    using (var ms = new MemoryStream())
    {
        encoder.Save(ms);
        return ms.ToArray();
    }
}

Буфер изображения, возвращаемый этим методом ToByteArray, всегда может быть преобразован обратно в BitmapImage по вашему методу ToBitmapImage.

И обратите внимание, что аргументы ширины и высоты вашего метода ToBitmapImage в настоящее время не используются.


UPDATE

Альтернативная реализация метода декодирования может выглядеть так, как показано ниже , хотя он не возвращает BitmapImage, а только экземпляр базового класса BitmapSource. Однако вы можете изменить тип возврата на BitmapFrame .

public static BitmapSource ToBitmapImage(this byte[] bytes)
{
    using (var stream = new MemoryStream(bytes))
    {
        var decoder = BitmapDecoder.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
        return decoder.Frames[0];
    }
}
5
ответ дан Clemens 22 August 2018 в 10:51
поделиться
  • 1
    Я попробовал ваш метод ToByteArray, но все равно получаю ту же ошибку в моем методе ToBitmapImage. Вы знаете, как преобразовать byte[] массив в BitmapImage по-другому? – Nickon 13 January 2013 в 15:53
  • 2
    Метод ToByteArray выглядит нормально. Возможно, вы можете удалить оператор ms.Position = 0;, поскольку он является избыточным. Я отредактировал свой ответ, чтобы предоставить альтернативное решение для декодирования изображения. Обратите внимание, однако, что этот метод не будет возвращать BitmapImage, кроме BitmapFrame. – Clemens 13 January 2013 в 16:34
  • 3
    Наверное, я могу просто наложить BitmapSource на BitmapImage? – Nickon 13 January 2013 в 17:03
  • 4
    Нет, вы не можете. Это BitmapFrame, а не BitmapImage. Оба имеют BitmapSource как общий базовый класс, но вы не можете отбрасывать один на другой. Почему именно вам нужен BitmapImage? BitmapSource обычно предоставляет всю необходимую информацию о растровом изображении. – Clemens 13 January 2013 в 17:09
  • 5
    Нет, мне не нужно BitmapImage. Мне просто нужно 3 метода. Первый, который отображает мой System.Windows.Controls.Image в Bitmap/BitmapImage/etc., второй, который преобразует его в массив byte[] (мне нужно сериализовать изображение в двоичный файл), а третий, который преобразует массив byte[] обратно в мой image (потому что я хочу отобразить его, используя привязку для System.Windows.Controls.Image. – Nickon 13 January 2013 в 18:08
Другие вопросы по тегам:

Похожие вопросы: