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
, для моей цели это было все, что мне нужно.