<Convertion image/Data>

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

<Convertion image/Data>

Message par Fortix »

Bonjours, pouvez vous me dire SVP comment convertir une image ou îcone en Data pour que ça puisse rentrer dans une DataSection ?, merci à tous! :D
Anonyme

Message par Anonyme »

Salut , c'est du 3.94 je crois. a modifier surement.

@++

Code : Tout sélectionner

; code by Dobro 
Declare SetStringManipulationBufferSize(Bytes) 

SetStringManipulationBufferSize(1048576) 



If OpenWindow(1, 0, 0, 200, 50, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget , "") 
  
  NomFichier$ = OpenFileRequester("dobro_datagenerator", "c:\", "Fichiers image|*.bmp", 0 ) 
  
  If LoadImage(0, NomFichier$) 
    Hauteur = ImageHeight() 
    Largeur = ImageWidth() 
  num=CreateFile(#PB_Any,"data.pb") :; ceci ecrit le fichier pb (txt) pour etre charge dans l'editeur !! 
      WriteStringN("; codé Par Dobro img to data"):; ecrit la premiere ligne de code 
      WriteStringN("Declare WindowCallback(WindowID,message,wParam,lParam)") 
      WriteStringN("largeur="+Str(Largeur)):; ecrit la variable 
      WriteStringN("hauteur="+Str(Hauteur)) 
      WriteStringN("CreateImage(1, Largeur, Hauteur)") 
      
      WriteStringN("For i = 0 To Largeur -1") 
      WriteStringN("  For j = 0 To Hauteur -1 ") 
      WriteStringN("    Read a.l ") 
      WriteStringN("    If StartDrawing(ImageOutput())") 
      WriteStringN("      Plot(i,j,a.l) ") 
      WriteStringN("      StopDrawing() ") 
      WriteStringN("    EndIf") 
      WriteStringN("  Next j") 
      WriteStringN("Next i") 
      
      WriteStringN(" titre$="+Chr($22)+NomFichier$+Chr($22)) 
      ; dessous: genere le code qui permet de relire les datas !! 
      ; ouaaa du code qui s'autoecrit !!! :-D 
      WriteStringN("If OpenWindow (1, 0, 0, Largeur, Hauteur, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget,titre$)") 
      WriteStringN("  SetWindowCallback(@WindowCallback())  ") 
      WriteStringN("  If StartDrawing(WindowOutput())") 
      WriteStringN("    DrawImage(UseImage(1), 0, 0)  ") 
     WriteStringN("  StopDrawing() ") 
      WriteStringN("  EndIf")    
      WriteStringN("  Repeat") 
      WriteStringN("  Until WaitWindowEvent()= #PB_EventCloseWindow") 
      WriteStringN("EndIf ") 
      WriteStringN("End ") 
      
      WriteStringN("Procedure WindowCallback(WindowID,message,wParam,lParam)") 
      WriteStringN("  res=#PB_ProcessPureBasicEvents") 
      WriteStringN("  Select message ") 
      WriteStringN("  Case #WM_PAINT") 
      WriteStringN("  StartDrawing(WindowOutput())") 
      WriteStringN("    DrawImage(UseImage(1), 0, 0)  ") 
      WriteStringN("  StopDrawing() ") 
      WriteStringN("  ProcedureReturn #True  ") 
      WriteStringN("  EndSelect") 
      WriteStringN("  ProcedureReturn res") 
      WriteStringN("EndProcedure ")  
      ;************************ 
      
      Resultat = StartDrawing(WindowOutput()) 
      DrawText("encodage en cours "+Chr(10)+" attendre la fermeture de cette fenetre") 
      StopDrawing() 
      
      WriteStringN("DataSection") :; commence la section des data 
      
      For i =0 To  Largeur -1 
        ligne.s="data.l "  ; insere la fonction data.l avant les valeurs  
        For j = 0 To Hauteur-1 
          StartDrawing(ImageOutput() ) 
          ligne.s=ligne.s+Str(Point(i, j))+",":; met des virgules entre les datas 
          StopDrawing() 
        Next j 
        ligne.s=Left(ligne.s, Len(ligne.s)-1) :; retire la derniere virgule de la ligne 
        WriteStringN(ligne.s):; ecrit une ligne entiere de data 
      Next i 
      WriteStringN(" "):; saute une ligne vide 
      WriteStringN("EndDataSection") :;ecrit la fin de section data 
      CloseFile(num) 
    EndIf 
    CloseWindow(0) 

EndIf 

End 


Procedure SetStringManipulationBufferSize(Bytes) 
  PBStringBase.l = 0 
  PBMemoryBase.l = 0 
  !MOV eax, dword [PB_StringBase] 
  !MOV [esp+4],eax 
  !MOV eax, dword [PB_MemoryBase] 
  !MOV [esp+8],eax 
  HeapReAlloc_(PBMemoryBase, #GMEM_ZEROINIT, PBStringBase, Bytes) 
  !MOV dword [_PB_StringBase],eax 
EndProcedure 
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Moi aussi c'est pour la 3.94

Code : Tout sélectionner

FileIn.s=OpenFileRequester("Convert to Data.b","C:\","All|*.*",0)
If FileIn="":End:EndIf
FileOut.s="C:\Out.txt"
#In=0
#Out=1


OpenFile(#In,FileIn)
CreateFile(#Out,FileOut)
UseFile(#Out)
WriteString("DataSection"+#CRLF$+"Data.b ")
Repeat
  UseFile(#In)
  FileSeek(index)
  If Eof(#In) 
    Break 
  Else
    If index>0 
      UseFile(#Out)
      WriteString(",")
    EndIf
  EndIf
  UseFile(#In)
  Byte=ReadByte()
  UseFile(#Out)
  WriteString(Str(Byte))
  index+1
ForEver


;/ Add 'EndDataSection' and close all files
UseFile(#Out)
WriteString(#CRLF$+"EndDataSection"+#CRLF$)
CloseFile(#Out)
CloseFile(#In)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

voici mon convertisseur mis a jour a la version 4.00

rappel du fonctionnement

lance le prg , choisi une image "BMP"

le convertiseur va generé un prg purebasic avec le nom de "Data.pb"
ce petit prg generé ("Data.pb") va charger l'image qui a ete mis au format DATA

bref ce petit prg("Data.pb") est l'image au format DATA et son loader integré :D

Code : Tout sélectionner

; code by Dobro


If OpenWindow(1, 0, 0, 200, 50, "", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget )
  
  NomFichier$ = OpenFileRequester("dobro_datagenerator", "c:\", "Fichiers image|*.bmp", 0 )
  
  If LoadImage(0, NomFichier$)
    Hauteur = ImageHeight(0)
    Largeur = ImageWidth(0)
    num=CreateFile(#PB_Any,"data.pb") :; ceci ecrit le fichier pb (txt) pour etre charge dans l'editeur !!
    WriteStringN(num,"; codé Par Dobro img to data")
    WriteStringN(num,"Declare WindowCallback(WindowID,message,wParam,lParam)")
    WriteStringN(num,"Largeur=80")
    WriteStringN(num,"Hauteur=144")
    WriteStringN(num,"CreateImage(1, Largeur, Hauteur)")
    WriteStringN(num,"For i = 0 To Largeur -1")
    WriteStringN(num,"For j = 0 To Hauteur -1 ")
    WriteStringN(num," Read a.l ")
    WriteStringN(num,"If StartDrawing(ImageOutput(1))")
    WriteStringN(num," Plot(i,j,a.l) ")
    WriteStringN(num," StopDrawing() ")
    WriteStringN(num,"EndIf")
    WriteStringN(num,"Next j")
    WriteStringN(num,"Next i")
    WriteStringN(num," titre$="+Chr($22)+NomFichier$+Chr($22))
    ; dessous: genere le code qui permet de relire les datas !!
    ; ouaaa du code qui s'autoecrit !!! :-D
    WriteStringN(num,"If OpenWindow (1, 0, 0, Largeur, Hauteur,titre$,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget)")
    WriteStringN(num,"SetWindowCallback(@WindowCallback())  ")
    WriteStringN(num," If StartDrawing(WindowOutput(1))")
    WriteStringN(num,"  DrawImage(ImageID(1), 0, 0)  ")
    WriteStringN(num," StopDrawing() ")
    WriteStringN(num," EndIf")
    WriteStringN(num," Repeat")
    WriteStringN(num," Until WaitWindowEvent()= #PB_Event_CloseWindow")
    WriteStringN(num,"EndIf ")
    WriteStringN(num,"End ")
    WriteStringN(num,"Procedure WindowCallback(WindowID,message,wParam,lParam)")
    WriteStringN(num," res=#PB_ProcessPureBasicEvents")
    WriteStringN(num," Select message ")
    WriteStringN(num," Case #WM_PAINT")
    WriteStringN(num," StartDrawing(WindowOutput(1))")
    WriteStringN(num,"   DrawImage(ImageID(1), 0, 0) ") 
    WriteStringN(num,"  StopDrawing() ")
    WriteStringN(num," ProcedureReturn #True  ")
    WriteStringN(num,"  EndSelect")
    WriteStringN(num,"  ProcedureReturn res")
    WriteStringN(num,"EndProcedure ")
    ;************************
    
    Resultat = StartDrawing(WindowOutput(1))
    DrawText(0,0,"encodage en cours "+Chr(10)+" attendre la fermeture de cette fenetre")
    StopDrawing()
    
    WriteStringN(num,"DataSection") :; commence la section des data
    
    For i =0 To  Largeur -1
      ligne.s="data.l "  ; insere la fonction data.l avant les valeurs 
      For j = 0 To Hauteur-1
        StartDrawing(ImageOutput(0) )
        ligne.s=ligne.s+Str(Point(i, j))+",":; met des virgules entre les datas
        StopDrawing()
      Next j
      ligne.s=Left(ligne.s, Len(ligne.s)-1) :; retire la derniere virgule de la ligne
      WriteStringN(num,ligne.s):; ecrit une ligne entiere de data
    Next i
    WriteStringN(num," "):; saute une ligne vide
    WriteStringN(num,"EndDataSection") :;ecrit la fin de section data
    CloseFile(num)
  EndIf
  CloseWindow(1)
  
EndIf

End
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Message par bombseb »

c'est pas marrant, dès qu'on demande un truc, on a une réponse et plusieurs programmes déja tout fait :D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

bombseb a écrit :c'est pas marrant, dès qu'on demande un truc, on a une réponse et plusieurs programmes déja tout fait :D
ben c'est que ce sujet a deja ete abordé il y a un moment sur le forum :lol:
andrebernard
Messages : 58
Inscription : jeu. 22/déc./2005 11:23

Message par andrebernard »

Bonjour DOBRO

Comme dab un super code.
Tu va pas y croire mais je cherchais ça aussi.
Tu va me dire que je suis gourmand .......

Je l'ai essayé, mais je ne suis pas arrivé à le faire marcher.

Il créé bien le fichier pb, mais qd je demarre, il tourne en boucle et ne redonne pas la photo originale.

Je suis sous 2000 sur cette machine.

Bonne journée
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Message par Fortix »

Merci @Dobro

Merci @Droopy

Merci @Cpl.Bator

et Merci à tous, vous êtes les meilleurs :D
andrebernard
Messages : 58
Inscription : jeu. 22/déc./2005 11:23

Message par andrebernard »

bonjour

Pardon il fonctionne, j'avais pas vu que ça marchais que pour les bmp.

Serais-ce plus compliqué avec les autres fichiers, jpg, doc, zip, mp3 etc ...???

Quoi qu'il en soit encore bravo

Bonne soiree
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

andrebernard a écrit :jpg, doc, zip, mp3 etc ...???
ben non il suffit d'ajouter les convertisseur de purebasic :D

je regarde ça, mais la je vais bouffer :lol:
andrebernard
Messages : 58
Inscription : jeu. 22/déc./2005 11:23

Message par andrebernard »

Bon appetit

Mais alors les dieux mangent aussi ?????
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

voici la version qui marche avec les Format reconu par le purebasic
c'est a dire BMP,JPEG,TGA,TIFF,PNG

j'en est profité pour rajouter des petite alerte, car sur des grosses images, on peut avoir l'impression qu'il ne se passe rien (car ça rame ! :D (a cause du point() !! ))

bien c'est globalement mieux ecris , mais pas "optimisé"
il faudrai que j'ai le courage de changer la fonction point() par un equivalent plus rapide (Lpeek() )

voila voila ! :D



Code : Tout sélectionner

; code by Dobro
; pure basic 4.00
; suporte les Formats BMP,Jpeg,Png,TGA,TIFF
; a utiliser sur de petite image max 1024x768
; car au dela cela Rame Grave :D (la fonction point() est en cause)
UseJPEGImageDecoder()
UsePNGImageDecoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()
Enumeration
  #fenetre
  #image
  #alerte
EndEnumeration
InitSprite()



If OpenWindow(#fenetre, 0, 0, 800, 600, "", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget )
  If OpenWindowedScreen(WindowID(#fenetre),0,0,800,600,1,1,1)
    NomFichier$ = OpenFileRequester("dobro_datagenerator", "c:\", "Fichiers image|*.bmp;*.jpg;*.jpeg;*.png;*.tga;*.tiff", 0 )
    
    If LoadImage(#image, NomFichier$)
      Hauteur = ImageHeight(#image)
      Largeur = ImageWidth(#image) 
      Global Dim tableau(Largeur, Hauteur )
      
      ResizeWindow(#fenetre, 0,0,Largeur,Hauteur)
      If StartDrawing(ScreenOutput() )
        DrawImage(ImageID(#image), 0, 0 )
        StopDrawing()
      EndIf     
      
      ResizeWindow(#fenetre, 0,0,800,600)
      FlipBuffers()
      
      num=CreateFile(#PB_Any,"data.pb") :; ceci ecrit le fichier pb (txt) pour etre charge dans l'editeur !!
      WriteStringN(num,"; codé Par Dobro img to data")
      WriteStringN(num,"Enumeration")
      WriteStringN(num,"#fenetre")
      WriteStringN(num,"#image")
      WriteStringN(num,"#alerte")
      WriteStringN(num,"EndEnumeration")
      WriteStringN(num,"If InitSprite() = 0")
      WriteStringN(num,"MessageRequester("+Chr($22)+"Erreur"+Chr($22)+","+Chr($22)+ "Impossible d'ouvrir l'écran & l'environnement nécessaire aux sprites !"+Chr($22)+","+"#PB_MessageRequester_Ok)")
      ; MessageRequester("","",#PB_MessageRequester_Ok          )
      WriteStringN(num,"End")
      WriteStringN(num,"EndIf")
      WriteStringN(num,"If OpenWindow (#alerte, 0, 0, 320, 50,"+Chr($22)+"alerte"+Chr($22)+",#PB_Window_BorderLess|#PB_Window_ScreenCentered ) ")
      WriteStringN(num,"If StartDrawing(WindowOutput(#alerte)) ")
      WriteStringN(num,"  DrawText(50, 24, "+Chr($22)+"Patience ! je charge les Datas "+Chr($22)+",RGB(255,50,0),RGB(0,0,0)) ")
      WriteStringN(num," StopDrawing() ")
      WriteStringN(num,"  EndIf ")
      WriteStringN(num,"EndIf")
      WriteStringN(num,"Read Largeur")
      WriteStringN(num,"Read Hauteur")
      WriteStringN(num,"Global Dim tableau(Largeur, Hauteur)")
      WriteStringN(num,"CreateImage(#image, Largeur, Hauteur)")
      WriteStringN(num,"If StartDrawing(ImageOutput(#image))")
      WriteStringN(num," ; ***********mise en tableau ************")
      WriteStringN(num,"For i = 0 To Largeur -1")
      WriteStringN(num," For j = 0 To Hauteur -1 ")
      WriteStringN(num,"  Read a.l ")
      WriteStringN(num," tableau(i, j)=a.l ")
      WriteStringN(num,"Next j")
      WriteStringN(num,"Next i")
      WriteStringN(num," ; **************************")
      
      WriteStringN(num,"For i = 0 To Largeur -1")
      WriteStringN(num," For j = 0 To Hauteur -1 ")
      WriteStringN(num,"  Plot(i,j,tableau(i,j)) ")
      WriteStringN(num," Next j")
      WriteStringN(num,"Next i")
      WriteStringN(num," StopDrawing() ")
      WriteStringN(num,"EndIf")
      WriteStringN(num," titre$="+Chr($22)+NomFichier$+Chr($22))
      ; dessous: genere le code qui permet de relire les datas !!
      ; ouaaa du code qui s'autoecrit !!! :-D
      WriteStringN(num,"If OpenWindow (#fenetre, 0, 0, Largeur, Hauteur,titre$,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget|#PB_Window_SizeGadget)")
      WriteStringN(num,"If  OpenWindowedScreen(WindowID(#fenetre), 0, 0, Largeur, Hauteur, 1, 1, 1) ")
      WriteStringN(num,"If StartDrawing(ScreenOutput())")
      WriteStringN(num," DrawImage(ImageID(#image), 0, 0)  ")
      WriteStringN(num,"StopDrawing() ")
      WriteStringN(num,"EndIf")
      WriteStringN(num,"Largeur=Largeur/4 ; affiche 4 fois plus petit")
      WriteStringN(num,"Hauteur=Hauteur/4 ; affiche 4 fois plus petit")
      WriteStringN(num,"ResizeWindow(#fenetre,0,0,Largeur,Hauteur)")
      WriteStringN(num,"CloseWindow(#alerte)")
      WriteStringN(num," Repeat")
      WriteStringN(num,"Until WaitWindowEvent()= #PB_Event_CloseWindow")
      WriteStringN(num,"EndIf")
      WriteStringN(num,"EndIf ")
      WriteStringN(num,"End ")
      ;************************
      
      If OpenWindow (#alerte, 0, 0, 500, 50,"alerte",#PB_Window_BorderLess|#PB_Window_ScreenCentered )
        If StartDrawing(WindowOutput(#alerte))
          DrawText(50, 24, "Patience ! je sauve les Datas dans 'Data.Pb' ",RGB(255,50,0),RGB(0,0,0))
          StopDrawing()
        EndIf
      EndIf
      
      WriteStringN(num,"DataSection") :; commence la section des data
      WriteStringN(num,"Data.l "+Str( Largeur)+","+Str( Hauteur)) 
      StartDrawing(ImageOutput(#image) )
      ; *********** mise en tableau de l'image ************
      For Y=0 To Hauteur-1
        For X=0 To Largeur-1
          tableau(X,Y)=Point(X, Y)
        Next X 
      Next Y
      ; *********************************************
      
      For i =0 To  Largeur -1
        ligne.s="data.l "  ; insere la fonction data.l avant les valeurs
        For j = 0 To Hauteur-1 
          ligne.s=ligne.s+Str(tableau(i,j))+",":; met des virgules entre les datas 
        Next j
        ligne.s=Left(ligne.s, Len(ligne.s)-1) :; retire la derniere virgule de la ligne
        WriteStringN(num,ligne.s):; ecrit une ligne entiere de data 
      Next i
      
      StopDrawing()
      WriteStringN(num," "):; saute une ligne vide
      WriteStringN(num,"EndDataSection") :;ecrit la fin de section data
      CloseFile(num)
    EndIf
    CloseWindow(#alerte)
    CloseWindow(#fenetre)
  EndIf
EndIf
End


Mais alors les dieux mangent aussi ?????
tout flateur vit au dépends de celui qui ecoute , cette leçon vaut bien un fromage sans doutes !! :D
Dernière modification par Backup le sam. 23/sept./2006 13:45, modifié 1 fois.
andrebernard
Messages : 58
Inscription : jeu. 22/déc./2005 11:23

Message par andrebernard »

Bonjour maitre,

Tout d'abord bravo et merci pour cette nouvelle leçon.
ça marche super avec une BMP de 581 k et ça va, j'y trouve pas trop long.
Tu as raison mon compliment valait bien ce fromage.

Pourquoi pour les autres formats que l'image, ne marcherait pas ???? pourtant c'est du binaire comme le reste non ????
Je sais bien que ce n'est pas la demande initiale mais qui peut le + ...
Dommage car cela aurait pu etre utile pour se creer un generateur de setup par exemple.

Sache que ce n'est pas de la flaterie, mais bien de l'admiration.
J'aimerais tellement avoir votre niveau.
J'y travaille, mais la route est longue.
Et puis il est toujours bon d'avoir un compliment, cela montre que ce que vous faites interesse du monde, et c'est un peu une forme de salaire, car la gratitude de vos fans paye un peu tout le temps et les nombreuses heures que vous passez à les aider bénévolement.

Je parle de toi evidemment et des autres CAID de ce forum, que je commence à connaitre comme Denis, Cpl.bator, SPH, Dr dri, soldat inconnu, comtois etc ...et bien d'autre que je m'excuse d'oublier

Passe une excelente journée.
A bientot (Malheureusement pour toi)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

je viens de changer le listing juste au dessus
car je le trouvais un peut trop lent !

j'avais fait une erreur de debutant (mis les startdrawing, et stopdrawing dans les boucles !! ça prends un max de temps :lol: )
j'en est profité pour passer temporairement par un tableau de point, car c'est beaucoup plus rapide, que l'utilisation de plot et point() en direct live :D
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Je veux jouer avec vous!!!!

Message par Huitbit »

Ce programme m'interresse BEAUCOUP car je déteste mettre des img jointes quand je poste un prog!
Bilan, je dessine mes sprites avec des plot, des lines et....paint!

Quand je lance le programme, il me demande de charger une image puis....plus rien!
Si les datas sont crées, je ne sais pas où ils sont :mad:

Ca marche pour tout le monde apparemment, j'ai dû rater un épisode ou/et je suis un gros nase :oops:

Help!
Elevé au MSX !
Répondre