Какой правильный способ использовать стол цветной поиска с DIB Win32?
-
09-10-2019 - |
Вопрос
Я пишу некоторый код для выравнивания окна на 16-битном изображении DICOM (который загружен в память как 16-битная DIB). Мой код выравнивания окна завершен и работает, создавая таблицу поиска, чтобы сопоставить значения исходных пикселей в нужные конечные значения пикселей.
Что я не уверен, это то, как применить этот поиск таблицы на изображение. Я вижу, что объект Bitmapinfo имеет поле на нем «Bmicolors», типа RGBquad []. Я пытался назначить свой поиск таблицы на это свойство, но, похоже, не имеет никакого эффекта. Я также попробовал функцию SetDibColortable, но она тоже не имеет никакого эффекта на выходе экрана.
Я пытаюсь сделать (применить мою таблицу поиска во время рисования, а не модифицировать саму данные пикселей), даже поддерживаемых в GDI, или на самом деле предполагается петлю через саму пиксельные данные, изменяющие значения пикселей один за другим, прежде чем блеска?
Это также не имеет значения, использую ли я Bitblt или SetDibitstodevice Functions. Они оба имеют тенденцию вести себя то же самое здесь.
Я открыт для использования DirectX, если это было бы легче достичь того, что я хочу. Я не использовал его раньше, хотя этот пример код будет хорошим, если он предлагается как ответ.
Мой код очень важен, поэтому я ищу самый быстрый способ добиться этого, даже если он может включать больше усилий / код.
Решение
Цветные таблицы используются только для растровых изображений, которые имеют 8-BPP или ниже, поэтому GDI будет игнорировать их в ваших 16-BPP изображениях.
(Стол может иметь максимум 256 цветов, проиндексированных байтами.)
(Технически таблица все еще может использоваться для уточнения того, какие цвета наиболее важны, но это не помогает вам, и я не уверен, что действительно используется в эти дни.)
Я также нашел GDI ненадежным при работе в проиндексированных цветовых режимах, поэтому я не рекомендую его.
(См. В этом вопросе, хотя это не одинаковое, как вы делаете, следует указать вам полагаться на GDI для этого. Речь идет о преобразовании от 16-BPP или 32-BPP в индексированный цвет, а проблемы GDI что точно: GDI не удается преобразование в индексированный цвет с точной палитрой? - Кроме того, код, связанный туда, устанавливает некоторые растровые изображения по индексированным цвету, поэтому вы можете найти его полезным, но я не думаю, что они будут применяться к тому, что вы добираетесь до 16-бирн.
Для того, что вы делаете, я бы порекомендовал изменять данные растровых изображений непосредственно самостоятельно, используя что-то вроде STD :: Map в качестве быстрой таблицы поиска для преобразования из одного набора цветов на другую.