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, упомянутых выше, каждый раз проверяя результат. Для каждого теста он сообщит вам о первых неправильных пикселях до и после цветов или сообщит, что все пиксели верны, если он работает.

Спасибо!

Спасибо за чтение моего вопроса! Извините, если это результат того, что я сделал что-то действительно глупое! :-)

Ответы на вопрос(3)

Ваш ответ на вопрос