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.