Structure du format BMP, sa lecture, sa construction et son écriture
Transcription
Structure du format BMP, sa lecture, sa construction et son écriture
Structure du format BMP, sa lecture, sa construction et son écriture Claude Parisel Mars 2003 Table des matières : 1. 2. 3. 4. Le choix du format Commentaires sur les autres formats Format BMP pour noir&blanc, 8 bits Structure des fonctions informatiques 4.1. La lecture d’un fichier BMP 4.2. L’écriture d’un fichier BMP 4.3. La construction d’un fichier BMP 1. Le choix du format 2. Commentaires sur les autres formats Il y a deux formats que l’on peut qualifier de « natif » selon le système d’opération : Le format PICT de Macintosh est le format standard, orienté objet, de toutes les applications sur les Macs. Un BitMap est un des objets possibles d’un fichier PICT, les autres étant du texte, des lignes, des régions, des patterns de remplissage, et ainsi de suite. Tous les programmes qui utilisent du graphique sur Macintosh peut utiliser des fichiers PICT, mais ce ne sont pas tous les programmes qui permettent d’éditer les divers objets d’un fichier PICT. Le format BMP est l’équivalent, le format natif du IBMpc utilisé par Microsoft Window3.1 et plus. Mais se limite au bitmap lui-même. Les fichiers BMP sont enregistrés dans un format DIB indépendant des appareils d’affichage (device-independent bitmap ). Ceci veut dire que le bitmap spécifie la couleur du pixel dans une forme indépendante de la méthode utilisée par l’afficheur pour représenter la couleur. Le logiciel ASRIX que nous utilisons déjà pour redresser des photos de surfaces planes utilise le format BMP en 8 bits (256 gris) et les fonctions que nous avons développées font de même. Il est à noter que les programmes MS-DOS n’utilisent pas le format PICT alors que ceux du Macintosh ne peuvent pas utiliser le format BMP. Comme on n’avait qu’a traiter des images et non d’autres types d’objets,et comme Asrix l’utilise déjà, on a opté pour le format BMP, le plus simple, le plus standard et le plus répandu. GIF Le format de CompuServ graphics utilise la compression LWZ et supporte des images noir et blanc (1bit) à celles 8bits couleur ou gris. C’est un des formats très utilisés sur World Wide Web (WWW) pour les documents qui utilisent des fichiers graphiques. TIFF Le format TIFF est celui qui a le plus de variantes : Noir et blanc, palette de gris, couleur 24 bits, palette de couleur (4-bits et 8-bit). Les fichier TIFF supportent la compression utilisant LZW, PackBits, et CCITT . Pour compliquer le sujet, il y a deux systèmes de bytes de supporté : 'II' (Intel) and 'MM' (Motorola) JPEG C’est un format créé pour conserver des images couleur sans modification. Il a un très bon taux de compression mais ne décompresse pas exactement comme avant la compression. Il est fait pour conserver des images qui ne sont plus à rééditer. WMF Le format Window Meta File est la version de Microsoft du format PICT de Macintosh et peut contenir des objets comme des lignes, des cercles et ainsi de suite. Les WMF ont une entête spéciale définie par Aldus Corp. Pour permettre aux applications de lire, mettre à l’échelle et dessiner les fichiers WMF. EPSF Les fichiers PostScript encapsulés sont des programmes spéciaux postscript avec une entête particulière décrivant la forme de l’image et la manière de la situer dans une page. Elle permet aux diverses applications d’inclure, de tourner, de mettre à l’échelle et de placer correctement une image dans son document pour impression ou affichage sur des appareils postscript. 3. Format BMP pour noir&blanc, 8 bits Le fichier se décompose en 4 parties dans l’ordre : L’entête du fichier (FileHeader) L’entête du Bitmap (BitMapHeader) Une palette de couleur (pour les images d’au plus 256 couleurs soit 8 bits par pixels) Les données du BitMap Entête du fichier : BMP_fileType BMP_FileSize BMP_Reserved BMP_BitMapOffset db dd dd dd “BM” ? 0 ? ; Toujours BM ; taille du fichier (1078 + 1024 + bitmap) ; toujours à zéro ; offset de l’image : toujours 1078 ; place du premier octets du BitMap dans le fichier BMP_HeaderSize dd ? BMP_Width BMP_Height BMP_Planes BMP_BitsPerPixel dd dd dw dw ? ? 1 ? BMP_Compression dd ? BMP_SizeOfBitMap dd ? BMP_HorzResolution BMP_VertResolution dd dd ? ? ; Taille de l’entête en octets. En fait type de système ; Valeurs: [40] : Window 3.1, 95, NT,.. [12] : OS2.1 [240] : OS2.2 ; Largeur de l’image en pixels ; Hauteur de l’image en pixels ; Nombre de plans utilisés, toujours 1 ; Nombre de bits par pixels ; Valeurs possibles : 1, 4, 8, 16, 24, 32. (toujours 8 en ce qui nous concerne) ; Méthode de compression ; toujours 0 pour pas de compression 1, 2, 3 pour le type de compression ; Taille de l’image en octects ; toujours zéro s’il n’y a pas de compression ; Résolution Horizontale en pixels par mètre. 2834 ; Résolution verticale en pixels par mètre. 2834 Entête du BitMap: BMP_ColorsUsed dd ? BMP_ColorsImportant BMP_xxxMask dd dd ? ? ; Nombre de couleurs dans la palette. ; Si BitPerPixel <= 8 alors toujours 0 pour palette entière ; Nombre de couleurs importantes. ; Ensemble de masques pour les modes de plus de 8 bits par pixels ; informent sur la répartition en rouge, vert, bleu et alpha sur les bits pour chaque pixel. ; Information jamais présente. La palette : Les couleurs sont codées sur 4 octets : Bleu, Vert, Rouge et alpha (sur 8 octets, ordre inversé par rapport au RGB). La palette n’est présente que pour les images d’au plus 256 couleurs. En gamme de gris, les valeurs sont de 00 00 00 00 à FF FF FF 00 ( ou 256 valeurs, de 0 à 255, pour le RGB). La palette a donc 256 fois 4 octets soit 1024 octets. Le BitMap : L’image est codée de la dernière ligne à la première, de gauche à droite. La largeur de l’image en octets est toujours un multiple de 4. Si ce n’est pas le cas, la fin de la ligne est complétée avec de zéros. Les pixels sont stockés bits à bits : Pour un 256 couleurs ou grisés, un octet décrit un pixel et un octet est représenté par un caractère ayant la valeur ascii du pixel. Le codage : Db : Valeur alphabétique décrite directement en octets ou caractères Dx : Valeur numérique décrite par deux caractères ou octets Dd : Valeur numérique décrite par quatre caractères ou octets. Traitement requis pour interpréter les valeurs de type dx et dd: Soit 4 caractères : -> 6 . . . (les points affichent des caractères non illustrables comme le CHR de 4 ou le CHR de 0 c’est à dire NULL) Traduction des caractères selon leur valeur décimale ascii -> 54 04 00 00 Traduction des valeurs décimales en valeurs hexadécimales. -> 36 04 00 00 Renversement des 4 octets. -> 00 00 04 36 Valeur hexadécimale obtenue par concaténation -> 436 Traduction de la valeur hexadécimale en valeur décimale -> 1078 4. Structure des fonctions informatiques Un fichier BMP de 1000 x 1000 génère déjà 1000,000 d’octets de données. La transformation recherchée demande d’avoir en mémoire l’information propre à une image et de construire à partir de là une autre image de même nature. C’est pourquoi on a choisi de construire des fichiers intermédiaires qui seront utilisés dans la dernière opération : Lecture d’un fichier BMP et écriture de la matrice de pixels sous la forme d’une liste de lignes de pixels. XXX.BMP -> XXX.TXT Création d’une base d’information pour la construction d’une nouvelles images comprenant ce qu’il faut pour faire les transformations entre l’image à construire et l’image existante. Modèle Autocad -> XXX.DAT Création d’une ortho image à partir de la photo. XXX.TXT + XXX.DAT -> ORTHO-XXX.TXT Écriture d’un fichier BMP ORTHO-XXX.TXT -> ORTHO-XXX.BMP 4.1. La lecture d’un fichier BMP Programme R-BMP.scm (ou BMP.lsp) Ce programme lit un fichier BMP noir et blanc, 8 bits, mode Window 3.1 et plus, et écrit sa matrice de pixels dans un fichier de nom identique avec l’extension TXT. Exemple : Fichier lu: Test.bmp Fichier écrit : Test.txt Variables calculées : ent pour entête, pal pour palette de couleur, dat pour matrice de pixels. Le programme écrit les données de la variable dat dans le fichier texte et affiche les données de la variable ent. Exemple d’affichage: (BM 346678 0 1078 40 480 720 1 8 0 21600 0 0 0 0) Exemple d’écriture : ((153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 153 141 38 47 50 51 53 53 54 54 55 55 56 57 57 58 58 59 59 60 60 61 62 62 63 63 63 64 64 65 66 66 67 67 67 67 67 67 68 68 68 68 69 ….153 153 153) (153 153 153 …… 207 207 207 207 207 207)) La fonction utilise les sous-programmes scheme suivants : LECT-PART R-CAR (read caractère) R-PIX (read pixel) 4.2. L’écriture d’un fichier BMP Programme W-BMP.scm Cette fonction lit un fichier de type *.TXT, comprenant une matrice de pixels dont le format est généré par la fonction RBMP ou une fonction de transformation et l’écrit sous le format BMP. Il génère l’entête, la table de couleur et codifie la matrice de pixels. La fonction utilise le sous-programme scheme suivant : W-NB (write number) 4.3. La construction d’un fichier BMP pour les cônes Programme [MAKE-BMP.scm] Cette opération se fait en trois étapes et commence avec le programme lisp [GET-BMP.lsp], qui permet de saisir l’ensemble des informations nécessaires à la construction du développement d’un cône, à savoir : L’information sur la photo du cône, sur le modèle 3D photographié et sur le développement de sa surface ainsi que ce qui est nécessaire au passage de l’un à l’autre et à la fabrication de l’ortho image. Cette fonction LISP écrit un fichier XXX.dat. Le programme [MAKE-BMP.scm] récupère les données générées par la fonction [GET-BMP.lsp] en lisant le fichier XXX.dat ainsi que la matrice de pixels de la photo originale en lisant le fichier XXX.txt. Il ouvre un fichier ORTHO-XXX.txt dans lequel il écrit les valeurs des pixels de l’image calculée. En dernier on utilisera la fonction [W-BMP.scm] pour transformer ce fichier ORTHO-XXX.txt en ORTHOXXX.bmp, fichier lisible par les logiciels d’affichage d’image raster. Pour faire la transformation, la fonction [MAKE-BMP.scm] procède en plusieurs étapes : Elle balaye tous les pixels de l’image à calculer de la dernière ligne à la première du pixel de gauche à celui de droite pour chaque ligne. Pour chaque pixel : elle calcule PT2D, la position géométrique (x,y) du milieu du pixel [pix-pt2d] Elle calcule PT3D, la position de PT2D sur le modèle normalisé du cône [pt2d-pt3d]. Elle calcule PT2D, la position géométrique de la perspective de PT3D sur la photo de la colonne [pt3dpt2d]. Elle calcule PIX, l’indice du pixel correspondant à PT2D sur la photo [pt2d-pix]. Elle lit alors la valeur du pixel de la photo et l’assigne au pixel de l’image à calculer. On obtient donc un fichier ORTHO-XXX.txt de la matrice des pixels de l’image à calculer, dont il ne reste qu’à mettre en format BMP avec [W-BMP.scm]. 5.4. Intégration de l’image L’image générée est alors intégrée à l’environnement de travail sur Autocad, localisée et mise à l’échelle dans la fenêtre sur le développement de la surface du cône. Tout est prêt alors à faire le relevé à plat en vraie grandeur.