Quelle est la bonne façon d'utiliser une table de correspondance des couleurs avec un Win32 DIB?

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

Question

J'écrire du code pour effectuer le nivellement de la fenêtre sur une image DICOM 16 bits (qui est chargé dans la mémoire en tant que 16 bits DIB). Mon code de mise à niveau de la fenêtre est complète et fonctionne en générant une table de consultation pour cartographier les valeurs de pixel de source pour les valeurs de pixel finales souhaitées.

Ce que je ne suis pas sûr de savoir comment est d'appliquer cette table de référence à l'image. Je vois que l'objet BITMAPINFO a un champ sur elle « bmiColors », de type RGBQUAD []. J'ai essayé attribuer ma table de consultation à cette propriété, mais il semble avoir aucun effet. J'ai aussi essayé la fonction SetDIBColorTable, mais il ne semble pas trop avoir d'effet sur la sortie de l'écran.

Est-ce que je suis en train de faire (appliquer ma table de recherche tout en peignant plutôt que de modifier les données de pixels lui-même), même pris en charge dans GDI, ou est un fait supposé boucle à travers les données de pixels se changeant les valeurs de pixels un par un avant blitting?

Il ne semble pas faire une différence si j'utilise les fonctions BitBlt ou SetDIBitsToDevice. Ils ont tous deux ont tendance à se comporter de la même chose ici.

Je suis ouvert à l'utilisation de DirectX si ce serait plus facile de achive ce que je veux. Je ne l'ai pas utilisé avant que le code si l'échantillon serait bien si elle est offerte comme une réponse.

Mon code est la performance très critique, donc je suis à la recherche pour le moyen le plus rapide pour y parvenir, même si elle peut impliquer plus d'effort / code.

Était-ce utile?

La solution

Les tables de couleurs ne sont utilisées que pour les bitmaps qui ont 8 BPP ou au-dessous, donc GDI les ignorer dans vos images 16 BPP.

(Le tableau peut avoir au plus 256 couleurs indexées par octets.)

(Techniquement, la table peut encore être utilisé pour spécifier quelles couleurs sont les plus importantes, mais cela ne vous aide pas, et je ne suis pas sûr que ce vraiment utilisé par quoi que ce soit ces jours-ci.)

J'ai aussi trouvé GDI pour être peu fiables à travailler en mode couleur indexée, donc je ne le recommanderais pas.

(voir ma question ici, bien que ce n'est pas la même chose que vous faites, il devrait vous remettre compter sur GDI pour cela. Il est sur la conversion de 16-BPP ou 32 bpp en couleurs indexées et les problèmes GDI a à le faire avec précision: GDI échoue conversion en couleurs indexées avec exacte palette - en outre, le code lié à il met en place des bitmaps couleurs indexées de sorte que vous trouverez peut-être utile, mais je ne pense pas qu'ils vont demander à ce que vous êtes avec les données 16 Faire des-BPP de toute façon .)

Pour ce que vous faites, je vous recommande de modifier les données bitmap directement vous-même, en utilisant quelque chose comme un std :: carte comme une table de consultation rapide pour la conversion d'un jeu de couleurs à l'autre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top