Page 1 sur 1

sauvegarde d'une image dans un fichier contenant des datas ?

Publié : jeu. 10/juin/2004 12:44
par comtois
alors voila , pour l'instant je fais un truc de ce genre

Code : Tout sélectionner

CreateImage(0,512,512)
StartDrawing(ImageOutput())
 Box(0,0,ImageWidh(),ImageHeight(),Rgb(200,0,0))
StopDrawing() 

MemoryID1 = AllocateMemory(500) 
MemoryID2 = AllocateMemory(200) 

If CreateFile(0,Fichier$) 
   WriteData(@MaStructure, SizeOf(MaStructure))
   WriteData(MemoryID1 , 500) 
   WriteData(MemoryID2 , 200) 
;Là j'aimerais enregistrer l'image 0
    CloseFile(0)
Endif
Et pour charger le fichier je fais

Code : Tout sélectionner

If ReadFile(0,Fichier$)
   ReadData(@MaStructure, SizeOf(MaStructure))
   ReadData(MemoryID1 , 500) 
   ReadData(MemoryID2 , 200) 
  ;Et là j'aimerais lire l'image 0
   CloseFile(0)
EndIf  


Est-ce que c'est possible ? et comment ?

Publié : jeu. 10/juin/2004 13:47
par Anonyme2
Voici un bout de code pour enregistrer l'image, en fait j'enregistre chaque point de l'image puis un deuxième code qui lit le fichier et qui cré l'image.

Je n'ai mis que du code pour enregistrer l'image, et le code marche bien.

je cré une image de 14x14 pixels .

Je te conseille de mettre dans le fichier juste avant l'image, la largeur de l'image puis la hauteur de l'image et de lire ces valeurs lors de la lecture du fichier. C'est à mon avis plus souple et permet de redimensionner les images par programme sans problème.

1er code, enregistrement dans le fichier

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 700, 500, #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget , "")
   CreateGadgetList(WindowID())

   Font = LoadFont(200, "ARIAL", 7, #PB_Font_HighQuality)

   Resultat = CreateImage(100, 14, 14)

   If Resultat And StartDrawing(ImageOutput())
      ; le fond de l'image en blanc
      Box(0, 0, 14, 14, #white)
      DrawingMode(4)
      ; on dessine les 2 rectangles extérieurs de la grille en blue
      Box(0, 0, 14, 14, #blue)
            
      ; on écrit le chiffre 1 au milieu avec la police sélectionnée
      DrawingFont(Font)
      Locate((14 -TextLength(Str(1))) / 2, 2)
      DrawText(Str(1))
      Box(0, 0, 14, 14, #blue)
      StopDrawing()
   EndIf

If CreateFile(0,"C:\program Files\PureBasic\Projets\Loto\essai.dat")
;Là j'aimerais enregistrer l'image 0 
   
   ; on récupère chaque point de l'image du hDc en utilisant un useimage si nécessaire
   ; le tout est de de mettre les points dans un ordre qui sera le même qu'en lecture
   
    StartDrawing(ImageOutput())
    For i = 0 To ImageWidth() - 1
        For j = 0 To ImageHeight() - 1
             WriteLong(Point(i, j))
        Next j
    Next i
    StopDrawing()
    CloseFile(0)
    
    ImageGadget(200, 50, 50, 0,0, Resultat) 
 
EndIf

Repeat
Until WaitWindowEvent()= #PB_EventCloseWindow

EndIf

End
2eme code lecture du fichier et création de l'image

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 700, 500, #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget , "")
   CreateGadgetList(WindowID())
Resultat = CreateImage(100, 14, 14)
If Resultat And StartDrawing(ImageOutput())

If OpenFile(0,"C:\program Files\PureBasic\Projets\Loto\essai.dat")
   ; on récupère chaque point de l'image
   
    For i = 0 To 13  ; 14 points 
        For j = 0 To 13
             Plot(i, j, ReadLong())
        Next j
    Next i
    StopDrawing()

    CloseFile(0) 
    
EndIf
EndIf

ImageGadget(200, 50, 50, 0,0, Resultat) 

Repeat
Until WaitWindowEvent()= #PB_EventCloseWindow

EndIf
End

Publié : jeu. 10/juin/2004 13:52
par comtois
Ok merci Denis , je viens de trouver un code de ElChroni , et ça me semble pas mal , je suis en train d'essayer de le mettre en oeuvre dans mon programme .

Si je ne m'en sors pas je prendrai ta méthode .

voila un extrait de la façon dont il s'y prend

Code : Tout sélectionner

OpenBmp:

If ReadFile(0, File)
  FileSize = FileSize(File)
  If loaded
    FreeMemory(0)
  EndIf
  BmpImage = AllocateMemory(0, FileSize, 0)
  ReadData(BmpImage , FileSize)
  CloseFile(0)
  *BmpFile = BmpImage
  *BmpInfo = BmpImage+SizeOf(BITMAPFILEHEADER)
  IData\width = *BmpInfo\biWidth
  IData\height = *BmpInfo\biHeight
EndIf

Return

;
; Save Bmp file
;

SaveBmp:

If CreateFile(0, File)
  WriteData(BmpImage, *BmpFile\bfSize)
  CloseFile(0)
EndIf

Return
J'ai trouvé le code sur le forum anglais , j'avais mal cherché tout à l'heure :)

Bon c'est bien , avant je ne savais pas comment faire, maintenant j'ai le choix entre deux solutions ,c'est l'abondance :)

Allez ,j'y retourne.

Publié : jeu. 10/juin/2004 13:54
par Anonyme2
Je viens juste de jeter un oeil au code de El_Choni, il me semble que c'est pour sauvegarder un fichier au format Bmp, pas pour faire ce que tu cherche.

Publié : jeu. 10/juin/2004 15:21
par comtois
oui j'ai mieux regardé aussi , et effectivement c'est pour du BMP .

Du coup je vais prendre ta méthode :)

Publié : jeu. 10/juin/2004 16:06
par fweil
La meilleure méthode est d'uitiliser les decodeurs (en particulier UseEC_OLEImageDecoder) pour charger l'image et faire une double boucle avec des Point(x, y) pour copier l'image dans un tableau.

Ce tableau peut ensuite être copié dans un fichier et récupéré, ultérieurement ré-utilisé dans une image.

Il existe une limitation actuelle inférieure à la capacité de la plupart des PC valables ... je ne sais pas si cette limite est calculable, mais en tout cas on ne peut pas gérer des images de 8000x6000 par exemple. Il semble que jusqu'à 3200x2400 ça fonctionne bien mais pas forcément au-delà.

Partant de là, la fonction Point() n'est pas vraiment très performante, mais suffisante, sinon il est recommandé de descendre au niveua inférieur en utilisant l'adresse de DrawingBuffer().

Slts

Publié : jeu. 10/juin/2004 16:30
par comtois
fweil a écrit :Il existe une limitation actuelle inférieure à la capacité de la plupart des PC valables ... je ne sais pas si cette limite est calculable, mais en tout cas on ne peut pas gérer des images de 8000x6000 par exemple. Il semble que jusqu'à 3200x2400 ça fonctionne bien mais pas forcément au-delà.Slts

Intéressant cette limite ,je me posais justement la question :)