WPF BitmapSource ImageSource - PullRequest
       24

WPF BitmapSource ImageSource

7 голосов
/ 14 января 2009

Я связываю свойство Image.Source с результатом свойства, показанного ниже.

public BitmapSource MyImageSource
{
    get
    {
        BitmapSource source = null;

        PngBitmapDecoder decoder;
        using (var stream = new FileStream(@"C:\Temp\logo.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.

Кто-нибудь знает, если это ошибка с WPF? или я что-то делаю неправильно?

Ответы [ 3 ]

11 голосов
/ 15 января 2009

Проблема была в параметре BitmapCacheOption, который изменился на BitmapCacheOption. Работает OnLoad.

С BitmapCacheOption.None BitmapSource не декодируется до тех пор, пока изображение не будет визуализировано, но поток с png в нем уже расположен в этой точке. Если вы кешируете OnLoad, он сразу же декодирует и кеширует результаты, вместо того, чтобы пытаться декодировать позже, когда поток больше не существует.

2 голосов
/ 14 января 2009

Кроме того, вы пытались просто использовать BitmapImage для загрузки изображения? Отлично работает с PNG, BMP и JPEG.

Это также специализированный тип BitmapSource, так что вы можете просто заменить свой код в вашем свойстве следующим:

BitmapImage img = new BitmapImage(new Uri(@"C:\Temp\logo.png"));
return img;
0 голосов
/ 14 января 2009

Вы уверены, что это PNG, а не просто переименованный Bitmap или Jpeg? Если вы создаете новое растровое изображение, а затем просто переименовываете его и изменяете расширение файла, эта ошибка воспроизводима.

Если я использую известный PNG с вашим кодом, я не получаю вашу проблему, но выдается исключение COM:

Неверный дескриптор. (Исключение из HRESULT: 0x80070006 (E_HANDLE))

Можете ли вы попробовать это со случайным PNG из Интернета и посмотреть, получите ли вы тот же результат?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...