Message de rapport:
 

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
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2