[Résolu] Lecture de format PNG
ChefDeProjet WDF
Inscrit:
29/05/2007 17:03
De Sassenage
Post(s): 180
Bonjour, je cherche désespérément une DLL pour lire une image PNG, mais un truc de très simple pas besoins de lire 300 format, juste du PNG.

J'en ai bien trouvé, mais la translation du code C en Windev est parfois tres complexe et comme je suis en Windev 9, le champs image ne gere pas l'opacité.

Merci à tous

PS : Un petit bout de code pour mettre en oeuvre la DLL ne serait pas de refus ;)

Contribution le : 11/12/2008 15:11

Edité par drcharly93 sur 13/1/2009 15:30:22
Créer un fichier PDF de la contribution Imprimer


Re: Lecture de format PNG
ChefDeProjet WDF
Inscrit:
29/05/2007 17:03
De Sassenage
Post(s): 180
solution :

allez sur le site de zap solution, il y a des exemple windev qui fond ça à la perfection via une DLL gratuite (petit message de copyrigth au chargement de la dll) et qui se charge de charger en memoire un png, bon moi je cherchais pour faire un truc openGL, et la ca tombe pile dans ce que je cherhe, met doit y avoir moyen de s'en servir de facon plus générique.

Contribution le : 15/12/2008 09:35
_________________
be aware
Créer un fichier PDF de la contribution Imprimer


Re: Lecture de format PNG
ChefDeProjet WDF
Inscrit:
29/05/2007 17:03
De Sassenage
Post(s): 180
je réactive le post car en faite, cette fonction ne marche que si on utilise depuis le début toutes les fonctions d'init de la DLL et ce n'est pas du tout mon cas.

la focntion dPixelOpacité ne permet pas de connaitre lopacité d'un pixel d'un PNG dans un champ image (elle me renvoie toujours 255, ce qui n'est pas mon cas), donc retour au point mort.

Donc je cherche toujours une solution simple pour lire un fichier PNG et/ou GIF (étant étant optionnel)

Contribution le : 24/12/2008 14:56
_________________
be aware
Créer un fichier PDF de la contribution Imprimer


Re: Lecture de format PNG
ChefDeProjet WDF
Inscrit:
29/05/2007 17:03
De Sassenage
Post(s): 180
Bon, j'ai mis en place un palliatif:
- J'ouvre mon image sous Photoshop et j'en extrait la couche alpha et j'ai j'en fait un BMP (le noir est transparent et le blanc opaque)
- je convertie mon PNG en BMP.
- Dans mon appplication, j'ouvre mon BMP issue du PNG et je relève les composante de couleur
- J'ouvre le BMP correspondant à la couche ALPHA puis je relève une des composante, peu importe puisque la couche alpha a été convertie en dégradé de gris, si la composante relevé est égale à 255, c'est complètement opaque, si elle est égale à 0, c'est complètement transparent, ainsi je récupère un dégradé de la composante qui me donne un dégradé d'alpha.

Et voila, j'ai récupéré mes couleur et ma couche alpha.
Je vous l'accorde, c'est un peu tordu, mais étant un peu pris par le temps, c'est la solution la plus simple.

Pourquoi BMP? deux raisons:
* Simple à lire
* Aucune dégradation à l'inverse du JPG par exemple.
et comme je n'ai pas de contrainte de volume, la grosse taille n'est pas un problème, de plus, cela concerne que de petites images (40*40)

Contribution le : 13/01/2009 12:18
_________________
be aware
Créer un fichier PDF de la contribution Imprimer


Re: Lecture de format PNG
Animateur WDF
Inscrit:
02/03/2003 04:07
De Noisy le grand(93)
Post(s): 2745
Bonjour Asthroth,

Je vous remercie de faire participer le résultat de vos recherches et surtout la méthode utilisée.

Contribution le : 13/01/2009 15:30
_________________
@A+
Contact (privé)......
email : drcharly@wdforge.org
[DrCharly93]
Créer un fichier PDF de la contribution Imprimer


Re: Lecture de format PNG
ChefDeProjet WDF
Inscrit:
29/05/2007 17:03
De Sassenage
Post(s): 180
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


Contribution le : 15/01/2009 16:57
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant




Enregistrer votre réponse
CompteNom   Mot de passe   Authentification
Message:


Vous ne pouvez pas débuter de nouveaux sujets.
Vous pouvez voir les sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


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