// Syntaxe :
//[ <Résultat> = ] lire_image (<filename> est chaîne)
//
// Paramètres :
// filename (chaîne) : <indiquez ici le rôle de filename>
// Valeur de retour :
// entier : // Aucune
PROCEDURE lire_image(filename est une chaîne)//, BMPFILE)
///* Structure d'un fichier BMP 24 bits
//* Le format BMP est divisé en 3 parties le header,
//* la zone bitmap info et les données
//*
//* Le header
//* Position Type Description
//* 00h DB "BM" BM indique qu'il s'agit d'un fichier bitmap
//* 02h DD ? Taille du fichier en octets
//* 06h DW 0 Réservé
//* 08h DW 0 Réservé
//* 0Ah DD ? Offset des données de l'image
//*
//* La zone bitmap info
//* Position Type Description
//* OEh(14) DD ? Taille de la zone bitmap info
//* 12h(18) DD ? Largeur de l'image en pixels
//* 16h(22) DD ? Hauteur de l'image en pixels
//* 1Ah DW 1 Nombre de plans (1)
//* 1Ch(28) DW 1|4|8|24 Bits par pixel
//* 1Eh(30) DD 0|1|2 Format de compression (O=non compressée)
//* 22h DD ? Taille de l'image en octets
//* 26h DD ? Résolution horizontale en pixels par mètre
//* 2Ah DD ? Résolution verticale en pixels par mètre
//* 2Eh DD ? Nombre de couleurs utilisées ...
//* 32h DD ? Nombre d'index de couleurs importants pour l'affichage
//*
//*/
//* Fonction lisant un fichier BMP 24 ou 8 bits
FILE est un entier // pointeur sur le fichier
header est un tableau de 54 entier sans signe sur 1 octet // tableau qui contiendra l'en-tête du fichier BMP
issLargeur, issHauteur, issTailleImage sont des entiers sans signe
NBBitsParPixel est un entier
TableauZoneBitmap, TableauResultatBitmap est un tableau dynamique //tableau de pixels
iIndiceZoneBitmap est un entier //permet de parcourir la zone bitmap
posx, posy sont des entiers
issComplement est un entier sans signe sur 1 octet //taille du complement
// ouverture du fichier BMP
FILE = fOpen(filename)
SI FILE = 0 ALORS
fClose(FILE)
RENVOYER -1
FIN
// lecture de l'en-tête
IF (fRead(FILE, 54, &header)<>54) THEN
fClose(FILE)
RENVOYER -1
FIN
//verification que c'est bien un BMP
IF (Caract(header[1]) <> "B" OU Caract(header[2])<>"M") ALORS
fClose(FILE);
RENVOYER -1
FIN
//lecture des dimensions de l'image
issLargeur = header[19]
issHauteur = header[23]
issTailleImage = ((issLargeur*3)+issComplement)*issHauteur
//lecture de la taille de la zone bitmap
issComplement = 4-modulo((issLargeur*3),4)
SI issComplement = 4 ALORS issComplement = 0
//lecture de la taille d'un pixel
NBBitsParPixel = header[29]
//compressé ou non? on ne lit que les compressé.
SI header[31] <> 0 ALORS
fClose(FILE)
RENVOYER -1
FIN
//allocation du tableau qui contiendra la zone bitmap
TableauZoneBitmap = allouer un tableau dynamique de issTailleImage entier sans signe sur 1 octet
TableauResultatBitmap = allouer un tableau dynamique de issTailleImage entier sans signe sur 1 octet
//lecture de la zone bitmap
SI fRead(FILE, issTailleImage , &TableauZoneBitmap)<> issTailleImage ALORS
fClose(FILE);
RENVOYER -1
FIN
//on lit et traite la zone bitmap
//les données sont au format BGR et non RGB, on doit donc inverser les composantes R et B
POUR iIndiceZoneBitmap = 1 A issTailleImage PAS 3
TableauResultatBitmap[iIndiceZoneBitmap+2] = TableauZoneBitmap[iIndiceZoneBitmap]
TableauResultatBitmap[iIndiceZoneBitmap+1] = TableauZoneBitmap[iIndiceZoneBitmap+1]
TableauResultatBitmap[iIndiceZoneBitmap] = TableauZoneBitmap[iIndiceZoneBitmap+2]
FIN
//une fois relue, on affiche le resulat dans la deuxieme image
//on commence par la fin du champ image car le point d'origine (0,0) d'un BMP est en bas à gauche et non pas en haut à gauche (comme en basic, souvenez vous!!)
iIndiceZoneBitmap=1
dDébutDessin(Image2)
POUR posy = issHauteur-1 A 0 PAS -1
POUR posx = 0 A (issLargeur)-1
dPoint(posx, posy,RVB(TableauResultatBitmap[iIndiceZoneBitmap],TableauResultatBitmap[iIndiceZoneBitmap+1],TableauResultatBitmap[iIndiceZoneBitmap+2]))
iIndiceZoneBitmap+=3
FIN
iIndiceZoneBitmap+=issComplement
FIN
fClose(FILE)
RENVOYER 0
Cette contribution était de : http://old.wdforge.org/newbb/viewtopic.php?forum=19&topic_id=6064&post_id=24436