|
[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
|
|
|
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
|
|
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
|
|
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
|
|
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
|
|
|
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
|
|
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.
|
Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
|