PixelFormat.Format16bppGrayScale toujours mal supporté ?
Bonjour,
Je manipule un bitmap, que j'utilise pour faire des "heights maps" afin de créer en 3D des lithophanies ou des gravures
La luminosité d'un pixel (ou son "niveau de gris") correspond à une hauteur selon l'axe Z, l'image étant un plan XY
J'arrive à faire tout ce que je veux, j'ai un peut triché en utilisant des fausses couleurs pour que le niveau de gris ne soit pas sur 8 bits (256 niveaux ) mais sur 24 bits en utilisant les octets R, G et B comme des octets de poids faible, poids intermédiaire et poids forts du niveau de gris.
Grâce à un handle j'accède directement aux données du bitmap (32 bits par pixels) sous forme de tableau sans passer par les coûteuses fonctions SetPixel et GetPixel.
Cette façon de faire permet à la fois :
- d'avoir un tableau de coordonnées XYZ rapide à utiliser et économe en mémoire (certes le 4e octet "alpha" n'est pas utilisé mais sur un CPU 32 ou 64 bits il est compliqué et sous-performant de manipuler des données 24 bits)
- de pouvoir utiliser toutes les fonctions graphiques 2D de GDI+ pour créer des formes et des textes variés
MAIS mon usage de "fausses couleurs" m'interdit d'utiliser les fonctions graphiques avec un antialiasing.
Je dois lisser l'image après les dessins avec quelques passes de filtre moyenne (voir ici : http://ressources.unit.eu/cours/vide..._filtering.pdf)
C'est un peut dommage, car un antialiasing "natif" serait meilleur, notamment sur les textes, j'aurais toujours besoin d'adoucir l'image ensuite mais beaucoup moins, ce qui éviterais d'avoir des formes trop "fondues"
Vous allez me dire, pourquoi faire simple quand on peut faire compliqué ? :aie: :mouarf:
Pourquoi ne pas travailler en couleurs et tout convertir en niveau de gris à la fin ?
- 8 bits n'offre que 256 niveaux de gris, c'est une résolution un peu trop faible pour mon application
- l'antialiasing en RGB correspond à l'algorithme "cleartype", qui tiens compte du fait de la positions relative des pixels rouges, verts et bleus dans un écran, alors que dans mon application il n'y a que des pixels gris ; si cleartype génère sur l'écran des images ayant un aspect très propres, après conversion en niveau de gris c'est décalé et flou
Pourquoi ne pas travailler avec un bitmap directement en niveau de gris ?
Le bitmap 8 bits ne convient pas :
- 8 bits n'offre que 256 niveaux de gris, c'est une résolution un peu trop faible pour mon application
- et surtout car le format "8 bits niveaux de gris" n'existe pas : il faut créer un bitmap 8 bits "indexé" c'est à dire avec une palette, et remplir les 256 couleurs de la palette avec les 256 niveaux de gris... or l'antialiasing ne peut pas fonctionner avec des bitmaps indexés :aie:
Et les bitmaps grayscale 16 bits ?
Cela semblait évident, il y a dans .NET un PixelFormat.Format16bppGrayScale
Et 16 bits offre 65536 niveaux de gris, cette résolution est assez bonne pour ce que j'ai besoin de faire.
Mais la joie fut de courte durée...
PixelFormat.Format16bppGrayScale est très mal pris en charge par .NET/GDI+ (http://www.windows-tech.info/1/2b462b01460fe2a1.php)
En gros, ce mode existe, mais :
- les calculs et l'affichage se font sur 8 bits (donc aucun intérêt) - car en effet, les fonctions graphiques prennent en paramètre une couleur ARGB avec 8 bits par composante (il aurait fallu une surcharge de ces fonctions avec un niveau de gris sur 16 bits à la place d'une couleur ARGB)
- pire certaines fonctions plantent (comme l'enregistrement d'une image avec .Save())
C'est à se demander pourquoi Format16bppGrayScale existe.
Les informations que j'ai trouvé sur le sujet sont assez anciennes ; est-ce que ça a évolué depuis, ou bien est-ce que les graphismes en niveaux de gris sont toujours "oubliés" par .NET ?
C'est dommage, car on a pas besoin de tout faire en couleurs vraies sur 32 bits, il existe de réels besoins de traitement sur des images avec un seul canal sur 8 bits, 16 bits voire plus :
- applications scientifiques
- traitement numérique du signal
- traitement d'images venant de photoastronomie, de caméras IR, UV ou rayons X
- scan et impression 3D
- ...
A bientôt