Décompresser en mémoire une image contenu dans un zip

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Décompresser en mémoire une image contenu dans un zip

Message par falsam »

Ce code met en oeuvre la fonction UncompressPackMemory()

-Lire le contenu d'un fichier compressé composé d'images exclusivement (png, jpeg, tga).
-Afficher une liste d'images dans un ListviewGadget
-Sélectionner le nom d'une image depuis la liste proposée et l'afficher dans un canvas

Code : Tout sélectionner

EnableExplicit

Enumeration
  #ZipFile
  
  #Mainform
  #ListImg
  #Canvas
  #Image
EndEnumeration

Define.l Event, GEvent

Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered

Global ZipFile.s

Procedure ShowZipContent()
  Protected PackEntryName.s
  
  ZipFile = OpenFileRequester("Open file ...","", "zip files|*.zip", 0)

  If ZipFile <> ""
        
    OpenPack(#ZipFile, ZipFile, #PB_PackerPlugin_Zip)

    If ExaminePack(#ZipFile)
      While NextPackEntry(#ZipFile)
        
        PackEntryName = PackEntryName(#ZipFile)
      
        Select PackEntryType(#ZipFile)
      
          Case #PB_Packer_File
            AddGadgetItem(#ListImg, -1, PackEntryName)
                
        EndSelect
      Wend  
    EndIf
  EndIf
  
  ClosePack(#ZipFile)
EndProcedure


Procedure ShowImage(ImageName.s)
  Protected PackEntryName.s, ImageSize.i, *Image
  
  OpenPack(#ZipFile, ZipFile, #PB_PackerPlugin_Zip)
    
  ; Search entry name
  If ExaminePack(#ZipFile)
    While NextPackEntry(#ZipFile)
      
      PackEntryName = PackEntryName(#ZipFile)

      Select PackEntryType(#ZipFile)
        
        Case #PB_Packer_File
          If PackEntryName = ImageName
            ;Uncompress PackEntryName in memory 
            ImageSize = PackEntrySize(#ZipFile)
            *Image = AllocateMemory(ImageSize)
            UncompressPackMemory(#ZipFile, *Image, ImageSize)
    
          EndIf  
      EndSelect
    Wend  
  EndIf
      
  ClosePack(#ZipFile)
  
  ; Show image
  CatchImage(#Image, *Image, ImageSize)
    
  StartDrawing(CanvasOutput(#Canvas))
  DrawingMode(#PB_2DDrawing_Default)
  Box(0, 0, 370, 350) ;Canvas Clear
  DrawImage(ImageID(#Image), 0, 0)
  StopDrawing()
  
  FreeMemory(*Image)
  
EndProcedure

Procedure Open_MainForm()
  OpenWindow(#Mainform, 0, 0, 600, 400, "Unpack image in memory", WindowStyle)
  ListViewGadget(#ListImg, 10, 10, 200, 350)
  CanvasGadget(#Canvas, 220, 10, 370, 350)
EndProcedure

UseJPEGImageDecoder()
UsePNGImageDecoder()
UseTGAImageDecoder()

UseZipPacker()  
Open_MainForm()
ShowZipContent()

Repeat
  Event  = WaitWindowEvent(10)
  GEvent = EventGadget()
  
  Select Event
    Case #PB_Event_Gadget
      Select GEvent
          
        Case #ListImg
          ShowImage(GetGadgetItemText(#ListImg, GetGadgetState(#ListImg)))
          
      EndSelect
        
    Case #PB_Event_CloseWindow
      End
      
  EndSelect
ForEver
Il manque une procédure pour redimensionner l'image lors de son affichage dans le canvas gadget.
Dernière modification par falsam le jeu. 15/août/2013 10:45, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Décompresser en mémoire une image contenu dans un zip

Message par falsam »

Correction du code : J'allouais la mémoire en fonction de la taille du fichier compressé au lieu de prendre la taille de l'image concernée qu'il est possible de lire avec la fonction PackEntrySize().

Ca ne change pas grand chose au fonctionnement du code sauf à l'optimiser et SURTOUT à éviter un plantage: La taille de l'image retournée par la fonction PackEntrySize() pourrait très bien être supérieure à la taille du fichier compressé.(Merci fred pour cette précision que tu apportes sur le forum Anglais)
Dernière modification par falsam le jeu. 15/août/2013 10:58, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Décompresser en mémoire une image contenu dans un zip

Message par Ar-S »

Merci, je teste à l'occasion.

------edit------

Vraiment pas mal, un peu long à l’exécution mais après très réactif.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Décompresser en mémoire une image contenu dans un zip

Message par graph100 »

C'est super :mrgreen: , il me manque plus que même chose pour le format RAR (qui est licencié, oui oui je sais) et mon lecteur d'image sera entièrement multiplateforme !

je vais pouvoir me débarrasser des lib externes que j'utilisais pour le ZIP !
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Décompresser en mémoire une image contenu dans un zip

Message par Ar-S »

graph100 a écrit :C'est super :mrgreen: , il me manque plus que même chose pour le format RAR (qui est licencié, oui oui je sais) et mon lecteur d'image sera entièrement multiplateforme !

je vais pouvoir me débarrasser des lib externes que j'utilisais pour le ZIP !
Il me semblait que la rar.dll était gratuitement utilisable pour la décompression.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Décompresser en mémoire une image contenu dans un zip

Message par graph100 »

graph100 a écrit :C'est super :mrgreen: , il me manque plus que même chose pour le format RAR (qui est licencié, oui oui je sais) et mon lecteur d'image sera entièrement multiplateforme !
Et oui, c'est pour ça que je peux les lire sur window (j'ai un code pour ça super pratique et simple si besoin :D )

Mais le but est de pouvoir utiliser cette fonctionnalité sur les 3 OS...
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Décompresser en mémoire une image contenu dans un zip

Message par Ar-S »

graph100 a écrit :
graph100 a écrit :C'est super :mrgreen: , il me manque plus que même chose pour le format RAR (qui est licencié, oui oui je sais) et mon lecteur d'image sera entièrement multiplateforme !
Et oui, c'est pour ça que je peux les lire sur window (j'ai un code pour ça super pratique et simple si besoin :D )

Mais le but est de pouvoir utiliser cette fonctionnalité sur les 3 OS...
unrar existe bien sous les 3 OS me semble t il
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre