ImageSource в WPF объект bitmapsource
Я связываю изображение.Свойство Source к результату свойства, показанного ниже.
public BitmapSource MyImageSource
{
get
{
BitmapSource source = null;
PngBitmapDecoder decoder;
using (var stream = new FileStream(@"C:Templogo.png", FileMode.Open, FileAccess.Read, FileShare.Read))
{
decoder = new PngBitmapDecoder(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None);
if (decoder.Frames != null && decoder.Frames.Count > 0)
source = decoder.Frames[0];
}
return source;
}
}
по какой-то причине это не удается во время рендеринга изображения (глубоко в сборке PresentationCore). Я уверен, что изображение не повреждено, поскольку я могу успешно показать тот же образ без привязки
<Image Name="FooImage" Source="/logo.png" />
Я должен связать Источник изображения в коде, потому что в конечном итоге я буду создавать поток изображений из строки base64.
кто-нибудь знает если это ошибка w / WPF? или я делаю что-то неправильно?
3 ответов
проблема заключалась в опции BitmapCacheOption, изменяющейся на BitmapCacheOption.OnLoad работает.
С BitmapCacheOption.Ни один BitmapSource не декодируется до тех пор, пока изображение не будет отображено, но поток с png в нем уже расположен в этот момент. Если вы кэшируете OnLoad, он будет декодировать сразу и кэшировать результаты, а не пытаться декодировать позже, когда поток больше не существует.
кроме того, вы пытались просто использовать BitmapImage для загрузки изображения? Он отлично работает с PNG, BMP и JPEG.
это также специализированный тип BitmapSource, поэтому вы можете просто заменить свой код в своем свойстве следующим:
BitmapImage img = new BitmapImage(new Uri(@"C:\Temp\logo.png"));
return img;
вы уверены, что это PNG, а не просто переименованный растровый или Jpeg? Если создать новое растровое изображение, а затем просто переименовать и изменить расширение файла, эта ошибка воспроизводима.
Если я использую известный PNG с вашим кодом, я не получаю вашу проблему, но создается исключение COM:
недопустимый дескриптор. (Исключение из HRESULT: 0x80070006 (E_HANDLE))
можете ли вы попробовать его со случайным PNG из интернета и посмотреть, получите ли вы тот же результат?