Re: Lecture de format PNG | Sujet: Re: Lecture de format PNG par Asthroth sur 15/1/2009 16:57:24
Juste pour conclure, voici ma méthode de lecture d'un BMP, je n'ai pas fait de test sur des BMP en 8Bits et ne lit pas les BMP compressé, mais personnellement, je n'en ai jamais vue.
Cette methode lit le fichier et affiche le résultat de la lecture dans un champ image, a vous d'adapter le traitement finale selon vos besoins.
// 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
|
|
Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
|