Классы нового стиля наследуют от object
или от другого нового класса стиля:
class SomeObject(object):
pass
class SubObject(SomeObject):
pass
В классах старого стиля нет:
class SomeObject:
pass
Это только применяется к Python 2 - в Python 3 все вышеперечисленное создаст классы нового стиля.
См. 9. Классы (учебник по Python), NewClassVsClassicClass и В чем разница между старым стилем и новыми классами стилей в Python? для деталей.
В вашем 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];
}
}
ToByteArray
, но все равно получаю ту же ошибку в моем методеToBitmapImage
. Вы знаете, как преобразоватьbyte[]
массив вBitmapImage
по-другому? – Nickon 13 January 2013 в 15:53ms.Position = 0;
, поскольку он является избыточным. Я отредактировал свой ответ, чтобы предоставить альтернативное решение для декодирования изображения. Обратите внимание, однако, что этот метод не будет возвращать BitmapImage, кроме BitmapFrame. – Clemens 13 January 2013 в 16:34BitmapSource
наBitmapImage
? – Nickon 13 January 2013 в 17:03BitmapImage
. Мне просто нужно 3 метода. Первый, который отображает мойSystem.Windows.Controls.Image
вBitmap/BitmapImage/etc.
, второй, который преобразует его в массивbyte[]
(мне нужно сериализовать изображение в двоичный файл), а третий, который преобразует массивbyte[]
обратно в мой image (потому что я хочу отобразить его, используя привязку дляSystem.Windows.Controls.Image
. – Nickon 13 January 2013 в 18:08