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

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

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

Message 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 ?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
Dernière modification par Anonyme2 le ven. 11/juin/2004 6:43, modifié 2 fois.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

oui j'ai mieux regardé aussi , et effectivement c'est pour du BMP .

Du coup je vais prendre ta méthode :)
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message 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
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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 :)
Répondre