TransformedBitmap меняет формат пикселей и гамму?

Я столкнулся со странным поведением TransformedBitmap.

16-битное изображение TIFF в оттенках серого (PixelFormats.Gray16) прекрасно загружается в BitmapSource, но когда изображение масштабируется с помощью TransformedBitmap, содержащего преобразование масштабирования, WIC изменяет формат пикселей на PixelFormats.Gray32Float, и изображение становится темнее.

Вот исходный BitmapSource и TransformedBitmap:

введите здесь описание изображения

введите здесь описание изображения

Моя подсказка заключается в том, что WIC по какой-то причине применяет гамма-коррекцию ко второму изображению, но в документации говорится, что и Gray16, и Gray32Float используют гамму 1,0, поэтому преобразования гаммы вообще не должно быть.

Это ошибка в WIC? Есть ли способ обходного пути для TransformedBitmap, изменяющего содержимое моих изображений?


person Libor    schedule 07.10.2016    source источник
comment
Я не могу воспроизвести это поведение. Какой именно ScaleTansform вы используете и каков исходный размер растрового изображения?   -  person Clemens    schedule 08.10.2016
comment
@Clemens Изображение должно быть 16-битным в оттенках серого (например, TIFF), чтобы исходный BitmapSource имел формат пикселей Gray16. ScaleTransform уменьшает изображение, например. на 60%. Затем новый BitmapSource имеет формат Gray32Float, и цвета искажаются. К сожалению, я удалил свое тестовое приложение, когда решил проблему, и у меня нет свободного времени, чтобы полностью его воссоздать. Я нашел в сети несколько 16-битных изображений TIFF, но, к сожалению, они в формате RGB, а не в оттенках серого (я использовал исходные изображения от моего клиента, которыми не могу поделиться, а также воссоздал некоторые из них программно из массива байтов).   -  person Libor    schedule 09.10.2016
comment
Я протестировал его с помощью BitmapSource, созданного программно из буфера пикселей, с помощью PixelFormats.Gray16. Мой TransformedBitmap также имеет PixelFormats.Gray32Float, но заметного искажения цвета нет.   -  person Clemens    schedule 09.10.2016


Ответы (1)


Хорошо, я нашел решение. Вместо создания встроенного TransformedBitmap:

bitmapSource = new TransformedBitmap(bitmapSource, transform);

Я использовал следующий код с вызовами BeginInit() и EndInit():

TransformedBitmap transformedBitmap = new TransformedBitmap();

transformedBitmap.BeginInit();

transformedBitmap.Source = bitmapSource;
transformedBitmap.Transform = transform;

transformedBitmap.EndInit();

bitmapSource = transformedBitmap;

К счастью, результирующее растровое изображение просто трансформируется с сохранением цветов.

Формат пикселей по-прежнему меняется на Gray32Float, но это можно исправить с помощью FormatConvertedBitmap, чтобы вернуть его к Gray16.

person Libor    schedule 07.10.2016