BitmapImage из файла PixelFormat всегда bgr32

Я загружаю изображение из файла с этим кодом:

BitmapImage BitmapImg = null;
BitmapImg = new BitmapImage();
BitmapImg.BeginInit();
BitmapImg.UriSource = new Uri(imagePath);
BitmapImg.CacheOption = BitmapCacheOption.OnLoad;
BitmapImg.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
BitmapImg.EndInit();

Он работает, как и ожидалось, за исключением того факта, что независимо от того, какое изображение я загружаю (24-битный RGB, 8-битный серый, 12-битный серый,...), после.EndInit() BitmapImage всегда имеет формат bgr32. Я знаю, что были обсуждения в сети, но я не нашел никакого решения для этой проблемы. Кто-нибудь из вас знает, решена ли она еще?

Спасибо,

Табина

2 ответа

Решение

Из раздела "Замечания" в BitmapCreateOptions:

Если PreservePixelFormat не выбран, PixelFormat изображения выбирается системой в зависимости от того, что система определит, для достижения наилучшей производительности. Включение этой опции сохраняет формат файла, но может привести к снижению производительности.

Поэтому вам также необходимо установить PreservePixelFormat флаг:

var bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.UriSource = new Uri(imagePath);
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.CreateOptions = BitmapCreateOptions.IgnoreImageCache
                     | BitmapCreateOptions.PreservePixelFormat;
bitmap.EndInit();

По какой-то причине я не понимаю, используяBitmapCreateOptions.PreservePixelFormatсnew BitmapImage()не работал для меня. Но это навело меня на верный путь. Если кто-то еще попробует другой ответ, и он не сработает, этот альтернативный метод сработал для меня:

      var decoder = new PngBitmapDecoder(new Uri(imagePath), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
BitmapFrame frame = decoder.Frames[0];

Для любой причиныPngBitmapDecoderработал там, где не работал.
Примечание:BitmapFrameнаследуетBitmapSourceкакBitmapImage, для моей цели это было все, что мне нужно.

Другие вопросы по тегам