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 из интернета и посмотреть, получите ли вы тот же результат?