GDI не удается преобразовать в индексированный цвет с точной палитрой?
Используя Windows GDI для преобразования 24-битного цвета в индексированный, кажется, что GDI выбирает цвета, которые «достаточно близки», даже если в предоставленной палитре есть точные совпадения.
Кто-нибудь может подтвердить это как проблему GDI, или я где-то ошибаюсь?
Может быть, есть флаг "пожалуйста, проверьте всю палитру на соответствие цветов", который мне не удалось найти?
Примечание: этоне о квантовании. Источник 24-битный, но содержит 256 или меньше цветов, поэтому точная палитра является тривиальным для вычисления. Проблема в том, что GDI не использует полную палитру.
Временное решениеЯ обошел проблему, сопоставляя цвета самостоятельно, но предпочел бы использовать GDI, так как он должен быть лучше оптимизирован. Проблема в том, что это «быстро, но неправильно».
Подробное описаниеМое исходное изображение 24-битное, но использует 256 (или меньше) цветов. Я генерирую точную палитру для этого и прошу GDI перенести изображение в индексированное растровое изображение, используя эту палитру. Для некоторых пикселей GDI выбирает похожие, но не точные цвета, даже если в других местах палитры есть точные цвета. Это разрушает плавные градиенты.
Эта проблема происходит с:
SetDIBitsToDeviceStretchDIBitsBitBltStretchBltПроблема делаетне случиться с:
SetPixel или SetPixelV в цикле (невероятно медленно!)Используя мой собственный код, чтобы сделать отображениеЯ проверил это на:
Windows 7 (аппаратное обеспечение / драйверы NVidia)Windows Vista (аппаратное обеспечение / драйверы ATI)Windows 2000 (оборудование / драйверы VMware)В каждом тесте я получаю одинаковые результаты. (Не только неправильные цвета, но всегда одни и те же цвета.)
Я не думаю, что проблема заключается в управлении цветом (ICM / ICC-профили и т. растровый заголовок, и я не думаю, что он будет применяться в моей виртуальной машине vanlilla-Win2k.
Тестовый проектКод для простого тестового проекта Win32 / GDI / VS2008 можно найти здесь:
http://www.pretentiousname.com/data/GdiIndexColor.zip
Функция Test1 в Win32UI.cpp является фактическим тестом. У него есть два массива RGBQUAD, один - исходное изображение, а другой - точная палитра для него. Он проверяет, что палитра действительно точна, а затем просит GDI преобразовать изображение с помощью API, упомянутых выше, каждый раз проверяя результат. Для каждого теста он сообщит вам о первых неправильных пикселях до и после цветов или сообщит, что все пиксели верны, если он работает.
Спасибо!Спасибо за чтение моего вопроса! Извините, если это результат того, что я сделал что-то действительно глупое! :-)