Как правильно использовать таблицу соответствия цветов с Win32 DIB? - PullRequest
0 голосов
/ 10 января 2011

Я пишу некоторый код для выравнивания окон на 16-битном DICOM-изображении (которое загружается в память как 16-битный DIB).Мой код выравнивания окон завершен и работает путем генерации справочной таблицы для сопоставления исходных значений пикселей с желаемыми конечными значениями пикселей.

В чем я не уверен, так это в том, как применить эту таблицу поиска к изображению.Я вижу, что объект BITMAPINFO имеет поле 'bmiColors', типа RGBQUAD [].Я попытался присвоить таблицу поиска этому свойству, но, похоже, это не дает никакого эффекта.Я также попробовал функцию SetDIBColorTable, но она, похоже, тоже не влияет на вывод на экран.

Это то, что я пытаюсь сделать (применить мою таблицу поиска при рисовании, а не изменять пиксельсами данные) даже поддерживаются в GDI, или же фактически предполагается, что они фактически перебирают сами пиксельные данные, изменяя значения пикселов одно за другим перед блиттингом?Функции BitBlt или SetDIBitsToDevice.Они оба, как правило, ведут себя одинаково.

Я открыт для использования DirectX, если было бы легче достичь того, чего я хочу.Я не использовал его раньше, хотя пример кода был бы хорош, если бы он предлагался в качестве ответа.

Мой код очень критичен по производительности, поэтому я ищу самый быстрый способ достичь этого, дажеесли это может потребовать больше усилий / кода.

1 Ответ

0 голосов
/ 10 января 2011

Таблицы цветов используются только для растровых изображений с разрешением 8 бит / с или ниже, поэтому GDI будет игнорировать их в изображениях с 16 битами на пиксель.

(таблица может содержать не более 256 цветов, проиндексированных в байтах.)

(Технически таблица все еще может использоваться, чтобы указать, какие цвета наиболее важны, но это не помогает вам, и я не уверен, что в наши дни это действительно используется.)

Я также обнаружил, что GDI ненадежен при работе в режимах индексированных цветов, поэтому я бы не рекомендовал его.

(см. Мой вопрос здесь, хотя это не то же самое, что вы делаете, это должно отложить вам полагаться на GDI для этого. Речь идет о преобразовании из 16-bpp или 32-bpp в индексированный цвет и проблем GDI имеет ли делать это точно: GDI не удается преобразовать в индексированный цвет с точной палитрой? - Кроме того, код, связанный там, устанавливает некоторые растровые изображения индексированного цвета, так что вы можете найти это полезным, но я не думаю, они все равно будут применяться к тому, что вы делаете, с данными 16 бит / бит.)

Для того, что вы делаете, я бы порекомендовал изменить данные растрового изображения непосредственно, используя что-то вроде std :: map в качестве таблицы быстрого просмотра для преобразования из одного набора цветов в другой.

...