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 :
un autre fichier nommé "p2.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
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