¿Cuál es la forma correcta de utilizar una tabla de búsqueda de color con un Win32 DIB?

StackOverflow https://stackoverflow.com/questions/4648146

Pregunta

Estoy escribiendo algo de código para realizar la nivelación ventana de la imagen DICOM un poco en 16 (que se carga en la memoria como un DIB de 16 bits). Mi código ventana de nivelación está completo y funciona generando una tabla de búsqueda para asignar los valores de los píxeles de origen a los valores de los píxeles finales deseados.

Lo que no estoy seguro es cómo aplicar esta tabla de consulta para la imagen. Puedo ver que el objeto BITMAPINFO tiene un campo en él '' bmiColors, de tipo RGBQUAD []. He intentado asignar mi tabla de consulta para esta propiedad pero parece no tener ningún efecto. También he probado la función SetDIBColorTable pero también no parece tener ningún efecto sobre la salida de pantalla.

Es lo que estoy tratando de hacer (aplicar mi tabla de búsqueda mientras que la pintura en lugar de modificar los propios datos de píxeles), incluso apoyados en GDI, o es una realidad supone colocar a través de los propios datos de píxeles que cambian los valores de los píxeles de una en una antes blitting?

Asimismo, no parece hacer una diferencia si utilizo las funciones BitBlt o SetDIBitsToDevice. Ambos tienden a comportarse de la misma aquí.

Estoy abierto a usar DirectX si eso sería más fácil de achive lo que quiero. No he usado antes, aunque por lo código de ejemplo sería bueno si se ofrece como una respuesta.

Mi código es muy crítica de rendimiento, así que estoy buscando la manera más rápida de conseguir esto, incluso si puede implicar un mayor esfuerzo / código.

¿Fue útil?

Solución

Las tablas de colores se usan sólo para mapas de bits que tienen de 8 bpp o por debajo, por lo que GDI caso de ellos en sus imágenes de 16 bpp.

(La tabla puede tener como máximo 256 colores indexados por bytes.)

(Técnicamente, la tabla todavía puede ser utilizado para especificar qué colores son los más importantes, pero que no le ayuda, y estoy seguro de que no es realmente utilizados por cualquier cosa en estos días.)

También he encontrado GDI a ser poco fiable en el trabajo en los modos con colores indexados, así que no lo recomendaría.

(Véase mi pregunta aquí, aunque no se trata de lo mismo que lo está haciendo hay que desanimarse depender de GDI para esto. Se trata de la conversión de 16 bpp o 32 bpp en color indexado, y los problemas GDI tiene al hacer eso con precisión: GDI falla la conversión a color indexado con exacta paleta - Además, el código vinculado ahí establece algunos mapas de bits de color indexado por lo que puede que le resulte útil, pero no creo que se aplicarán a lo que estás doign con datos de 16 bpp todos modos .)

Por lo que estás haciendo, me gustaría recomendar la modificación de los datos de mapa de bits directamente a sí mismo, usando algo como un std :: mapa como una tabla de búsqueda rápida para la conversión de un conjunto de colores para el otro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top