Page 1 sur 1

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

Publié : mer. 14/août/2013 21:38
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.

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

Publié : jeu. 15/août/2013 9:54
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)

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

Publié : jeu. 15/août/2013 10:35
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.

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

Publié : sam. 17/août/2013 0:23
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 !

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

Publié : sam. 17/août/2013 0:42
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.

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

Publié : sam. 17/août/2013 6:13
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...

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

Publié : sam. 17/août/2013 9:56
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