Lecteur d'image Format *.PNM

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Lecteur d'image Format *.PNM

Message par Zorro »

le format Pnm est un format d'image "Ascii" , il est beaucoup employé dans la cartographie , mais pas que ....
le principe est tout simple , mais j'en ai eu besoin ...

voir ici pour plus d'info :
https://fr.wikipedia.org/wiki/Portable_pixmap

mon code , lit les images pnm de type "P1", "P2", et "P3" et "P6" (les plus courrant )
si vous testé sur des fichiers de petite images , utilisez le Box() au lieu du plot , et ajoutez +10 aux X et Y ....
sinon utilisez +1 en x et y

faute de n'avoir pas trouvé de fichiers pnm de grande image, je n'ai pas pu tester mon code sur de grande images
mais fonctionne tres bien sur les images exemple
suivante :

faire un fichier txt appelé "P1.pnm" et collez ceci dedans :
P1
# Un exemple bitmap de la lettre "J"
7 10
0 0 0 0 0 0 0
0 0 0 0 0 1 0
0 0 0 0 0 1 0
0 0 0 0 0 1 0
0 0 0 0 0 1 0
0 0 0 0 0 1 0
0 0 0 0 0 1 0
0 1 0 0 0 1 0
0 0 1 1 1 0 0
0 0 0 0 0 0 0
un autre fichier nommé "p2.pnm" et collez ceci dedans :
P2
# Affiche le mot "FEEP" (exemple de la page principale de Netpbm à propos de PGM)
24 7
15
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 3 3 3 3 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 15 15 15 0
0 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 15 0
0 3 3 3 0 0 0 7 7 7 0 0 0 11 11 11 0 0 0 15 15 15 15 0
0 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 0 0
0 3 0 0 0 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

un autre fichier nommé "P3.pnm"
et collez ceci dedans :
P3
# Le P3 signifie que les couleurs sont en ASCII,
# par 3 colonnes et 2 lignes,
3 2
# ayant 255 pour valeur maximum, et qu'elles sont en RGB.
255
255 0 0 0 255 0 0 0 255
255 255 0 255 255 255 0 0 0

les fichiers exemple format pnm sont a telecharger ici :
http://michel.dobro.free.fr/Purebasic/exemple_pnm.zip

le code :

Code : Tout sélectionner

;***********************************************
;Titre  :*Lecteur_pnm Type P1,P2,P3,P6
;Auteur  : Zorro
;Date  :05/08/2017
;Heure  :14:38:49
;Version Purebasic :  PureBasic 5.60 (Windows - x86)
;Version de l'editeur :EPB V2.64
; Libairies necessaire : Aucune 
;***********************************************


#img = 0
#Barre = 1
#win=0
#file=1
Global Ligne.s="",ImageX,ImageY
Declare Lire_ligne()
Declare creation_image(imagex,imagey)

Global Zoom =10 
;Zoom=1; pour l'image "xsane-startimage.pnm" utilisez Zoom=1


; on charge l'image
UseJPEGImageDecoder ()
file$=OpenFileRequester("ouvrir pnm",GetCurrentDirectory(),"*.pnm",1)

OpenFile(#file,file$)
		flag_entete=0:Flag_taille=0 : entete.s=""
		While Eof(#file) = 0  
				x=0
				lire_ligne()
				if left(ligne.s,1)="P" and flag_entete=0 ; sur une seule ligne
						entete.s=stringfield(ligne.s,1," ")
						If stringfield(ligne.s,2," ")<>""
								imagex=(val(StringField(ligne.s,2," "))*zoom)
								imagey=(val(StringField(ligne.s,3," "))*zoom)
								if entete.s="P2" Or entete.s="P3" Or entete.s="P6"
										nombre_couleur=val(StringField(ligne.s,3," "))
								Endif
								Flag_taille=1
								Creation_image(imagex,imagey)
						StartDrawing(ImageOutput(#img));|
								goto fin ; ligne suivante
						Endif
						goto fin  ; ligne suivante
				Endif ;<
				if Flag_taille=0 and entete.s<>"" ; sur plusieurs lignes
						imagex=(val(StringField(ligne.s,1," "))*zoom)
						imagey=(val(StringField(ligne.s,2," "))*zoom)
					
						Creation_image(imagex,imagey)
				StartDrawing(ImageOutput(#img));|
						Flag_taille=1
						if entete.s="P2" Or entete.s="P3"
								lire_ligne()
								nombre_couleur=val(StringField(ligne.s,1," "))
						Endif
						
						goto fin  ; ligne suivante
				Endif
		;<
;<
; on passe aux couleurs
select Lcase(entete.s)
		Case "p1"
		compt=CountString(ligne.s," ")
		For i = 1 to compt+1
				co=val(StringField(ligne.s,i," "))
				If co>0
						coul=0
				Else 
						Coul=rgb(255,255,255)
				Endif
				Plot(x,y,rgb(coul,coul,coul))
				box(x,y,zoom,zoom,rgb(coul,coul,coul))
				x=x+zoom ; remplacer par x=x+10 si vous utilisez Box()
		Next i
		Case "p2"
		compt=CountString(ligne.s," ")
		For i = 1 to compt+1
				co=val(StringField(ligne.s,i," "))
				If co>0
						coul=(co)*17
				Else 
						Coul=0
				Endif
				Plot(x,y,rgb(coul,coul,coul))
				box(x,y,10,10,rgb(coul,coul,coul))
				x=x+zoom ; remplacer par x=x+10  si vous utilisez Box()
		Next i
		Case "p3"
		compt=CountString(ligne.s," ")
		For i = 1 to compt+1 step 3
				rouge=val(StringField(ligne.s,i," "))
				vert=val(StringField(ligne.s,i+1," "))
				Bleu=val(StringField(ligne.s,i+2," "))
				;Plot(x,y,rgb(rouge,vert,bleu))
				box(x,y,zoom,zoom,rgb(rouge,vert,bleu))
				x=x+zoom ;
		Next i
		
		Case "p6"
		
		While Eof(#file) = 0 
		
				rouge=ReadByte(#file)
				vert=ReadByte(#file)
				Bleu=ReadByte(#file)
				
				if x>=imagex
						x=0
						y=y+1
				Endif
				
				if y>=imagey
			goto fin
	endif
	
				Plot(x,y,rgb(rouge,vert,bleu))			
				x=x+zoom
		Wend
		
	
EndSelect
y=y+zoom  
fin:
Wend
StopDrawing()
CloseFile(#file)



If OpenWindow (#win, 0, 0, ImageX, ImageY , "Contraste",#PB_Window_SystemMenu | #PB_Window_ScreenCentered  )
		ImageGadget ( #img , 0, 0, ImageX, ImageY, ImageID( #img ))
		
		; on réaffiche l'image
		SetGadgetState ( #img , ImageID( #img ))
		Repeat
				Event = WaitWindowEvent ()
				
		Until Event = #PB_Event_CloseWindow ; on clique sur la croix, fin du prog
EndIf


;- Zone Procedures

Procedure Lire_ligne()
		ligne.s=trim(Readstring(#file))
		ligne.s=ReplaceString(ligne.s,"     "," ")
		ligne.s=ReplaceString(ligne.s,"    "," ")
		ligne.s=ReplaceString(ligne.s,"   "," ")
		ligne.s=ReplaceString(ligne.s,"  "," ")
		if left(ligne.s,1)="#" or ligne.s=""
				Lire_ligne() ; Recursif Power !
		Endif
EndProcedure



Procedure Creation_image(imagex,imagey)
		if imagex<3 :imagex=320:Endif
		if imagey<2 :imagey=200:Endif
		If CreateImage(#img,imagex,imagey,32,Rgb(255,255,255))
				ProcedureReturn 1
		Else
				MessageRequester("erreur","peut pas creer l'image")
		Endif
EndProcedure




; Epb
Dernière modification par Zorro le mer. 16/août/2017 18:24, modifié 7 fois.
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Lecteur d'image Format *.PNM

Message par Zorro »

petite correction de derniere secondes ...
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Lecteur d'image Format *.PNM

Message par Zorro »

Ajout du type P6 c'est un type binaire (True Color )

j'ai ajouté un lien vers une archive qui contient les exemples d'images au format Pnm
que mon prg decode :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Lecteur d'image Format *.PNM

Message par venom »

Sympa ce format.

A compiler en x86 :wink:






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Lecteur d'image Format *.PNM

Message par Kwai chang caine »

Merci du partage 8)

J'ai essayé plusieurs images et à toutes j'ai une petite coquillette :|
Attente du démarrage du programme...
Type d'exécutable: Windows - x86 (32bit, Unicode)
Exécutable démarré.
[ERREUR] Test.pb (Ligne: 157)
[ERREUR] Plot(): Plot() est en dehors de la zone de dessin.
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Lecteur d'image Format *.PNM

Message par Zorro »

oui c'est possible !

car le format Pnm est tres permissif

il peut etre ecrit sur une seule ligne , ou bien plusieurs .. (je gere ici pour plusieurs lignes )
je me suis conformé au type d'images ici :
https://fr.wikipedia.org/wiki/Portable_pixmap

donc avec un entete et des données sur plusieurs lignes
genre :

Code : Tout sélectionner

P2
# Affiche le mot "FEEP" (exemple de la page principale de Netpbm à propos de PGM)
24 7
15

mais c'est vrais qu'on trouve des images ecrites sur une seule lignes
genre :

Code : Tout sélectionner

P2 # Affiche le mot "FEEP" (exemple de la page principale de Netpbm à propos de PGM) 24 7 15 .....etc .....
donc ce type d'images mon code ne les lit pas ! :)

a tout hasard dit moi qu'elle est le type de tes images , et dis moi aussi qu'elle est la premiere valeur (P1 ,P2,P3...P6 ) ??

copie colle ici l'entete ...et quelques lignes de l'image....
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Lecteur d'image Format *.PNM

Message par Kwai chang caine »

Bah en fait, j'ai voulu essayer tes exemples pour voir ce que ça donne.
J'ai donc collé ton code et téléchargé tes images sur ton site
Et j'ai à chaque fois ce probleme :|
Je suis avec v5.60 x86 W10
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Lecteur d'image Format *.PNM

Message par Zorro »

Effectivement, Merci , il y avait bien un bug !! :)

bon j'ai modifié le code ...
j'ai ajouté une Variable "zoom"
que j'initialise a 10 parce que mes images exemples sont tres petite (pour pas charger inutilement )
donc on dessine avec un pixel de 10x10

mais pour l'image "xsane-startimage.pnm" qui est plus grosse , le zoom doit etre remis a 1
pour dessiner avec des pixels de 1x1 :)

Merci encore pour le retour :)

ps: en plus j'ai vu apres coups que j'avais bien pris en compte les images de type multilignes (mais pas le type p6) ,et celles sur une seule ligne (type p6 )

rappel :
P1 type monochrome (un rectangle noir dans mon exemple )
P2 type niveau de gris
p3 Type Couleur (quelques pixels de couleur dans mon exemple )

P6 une image couleurs (ça peut etre tout type sauf transparence ... )
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Lecteur d'image Format *.PNM

Message par Kwai chang caine »

Marche nickel maintenant 8)

Impressionnant quand même de dessiner autant de choses avec si peu de données 8O
Bon le format P6 j'ai cru que c'était fait aussi simplement, mais y'a noir de hiéroglyphes quand même :lol:

Juste une petite chose, je crois que pour fermer la fenêtre c'est "#PB_Event_CloseWindow" parce que "#WM_close" ça marche pas ici :wink:

J'avais jamais entendu parler de ce format, encore merci de ce partage. 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre