Images compressor, v2 dispo

Programmation d'applications complexes
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Images compressor, v2 dispo

Message par lionel_om »

Bonjour à tous.
Je vais finir sans doute à bientot lacher DB pour complétement adopter PB si ca continue comme ça !!!

Cette fois-ci je me suis amusé à créer un programme pour tous les gens qui ont un appareil photos numérique comme moi et qui ont donc des photos non compressées (pour cela il fallait les ouvrir une par une avec paint, puis faire 'Enregistrer' et magie ... la taille de la photo était diminuée par 2 :D ).

Donc j'ai fais un petit programme qui avait cet optique principal.
J'y ait également ajoutée la prise en charge de plusieurs supports graphiques, ainsi que des options supplémenatires.

Voial donc mon code :

Code : Tout sélectionner

; ####################################################################################
; #  Programme permettant de compresser les images d'un dossier selon le format et   #
; #               le taux de compression sélectionné par l'utilisateur.              #
; #                                                                                  #
; #     @ auteur : Lionel                                                            #
; #     @ date : vendredi 12 Novenbre 2004                                           #
; ####################################################################################



; chargement des décodeurs et encodeurs
UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()

Dim Extension.s(100)
Dim fichiers.s(3000)
Global nbExtension.l 
Global Dossier.s
Global Formats.s
Global Compression.l 
Global Prefixe.s


Declare FileListing()
Declare SortFiles()
Declare CompresseLesImages()
Declare CompresseImage(img.s)
Declare.s GetKeyValue(topKey, sKeyName.s, sValueName.s) 

#PROJECT_NAME$ = "Images Compressor"




; ###################################################################################
;- ___ Fenetre principale ___
; ###################################################################################

If OpenWindow(0, 100, 200, 340, 260, #PB_Window_SystemMenu, #PROJECT_NAME$ + " - Compression des images")

  ; creation de la liste d'objets
  If CreateGadgetList(WindowID())
    TextGadget    (0,  10, 10, 150, 15, "Répertoire des images :") 
    StringGadget  (1,  10, 30, 230, 24, GetKeyValue(#HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\", "My Pictures"))
    ButtonGadget  (2, 260, 30, 60 , 24, "Parcourir")
    
    TextGadget(3, 10, 70, 150, 15, "Qualité des images :")
    TextGadget(4, 15, 90, 100, 15, "Format :")
    ; Formats de compression
    ComboBoxGadget(5, 75, 87, 60, 80) 
      AddGadgetItem(5, -1, "JPEG")
      AddGadgetItem(5, -1, "PNG")
      AddGadgetItem(5, -1, "BMP")
      
    TextGadget(6, 190, 90, 130, 15, "Compression :")  
    ; Taux de compression    
    ComboBoxGadget(7, 260, 87, 60, 160)
      For i.l =  0 To 10
        AddGadgetItem(7, -1, Str(i))
      Next i

    TextGadget(8, 10, 130, 250, 15, "Réglages (si même nom de fichier)")
    OptionGadget( 9, 15, 150, 110, 20, "Ecraser l'original") 
    OptionGadget(10, 15, 170, 110, 20, "Rajouter le préfixe :")
    StringGadget(11,150, 170, 30, 23, " _") 
    
    ButtonGadget  (12,  90, 230, 70 , 24, "Lister")
    ButtonGadget  (13, 170, 230, 70 , 24, "Quitter")
  EndIf


  SetGadgetState(5, 0)    ; on sélectionne par défaut JPEG
  SetGadgetState(7, 5)    ; on sélectionne par défaut la qualité 5
  SetGadgetState(9, 1)    ; on sélectionne l'écrasement des fichiers par défaut
  DisableGadget(11, 1)    ; on désactive le préfixe
  DisableGadget(12, 1)    ; on désactive le boutton 'Lister'
  
  ; chargement des formats supportés
  Restore FormatsGraphiques
    nbExtension = 0
    Read a.s
    While a <> "-1"
      nbExtension = nbExtension + 1
      Extension(nbExtension) = a
      Read a
    Wend
    
  ; début de la boucle
  Repeat
    EventID = WaitWindowEvent()
    
If EventID = #PB_EventGadget  ; on a fait une action sur un des gadgets
    
    Select EventGadgetID()
        
      Case 2  ; appel du PathRequester()
        a.s = PathRequester("Sélectionne du dossier","")
        If a <> "": SetGadgetText(1,a): EndIf

      Case 5 ; Liste des formats
        If GetGadgetText(5) = "JPEG"
          DisableGadget(7, 0)
        Else
          DisableGadget(7, 1)
        EndIf

      Case 9  ; on écrase le fichier
            DisableGadget(11, 1)
      Case 10 ; on rajoute un préfixe
            DisableGadget(11, 0)

      Case 13 ; on quitte le programme
         End
        
      Case 12 ; listage des fichiers images
        FileListing()
        
    EndSelect


     ; réactualisation du boutton 'lister'
     If FileSize(GetGadgetText(1)) = -2 And (GetGadgetState(9) = 1 Or ( GetGadgetState(10)=1 And Trim(GetGadgetText(11))<>""))
       DisableGadget(12, 0) 
     Else
       DisableGadget(12, 1)
     EndIf

EndIf

  Until EventID = #PB_EventCloseWindow Or EventGadgetID() = 12
EndIf

End 



; ###################################################################################
;- ___ Fenetre secondaire ___ Procedure de listage des fichiers graphiques ______
; ###################################################################################

Procedure FileListing()

  ; récupération des valeurs
  Dossier = Trim(GetGadgetText(1))
    If Right(Dossier,1) <> "\": Dossier = Dossier + "\": EndIf
  Formats = GetGadgetText(5)
  Compression = Val(GetGadgetText(7))
  If GetGadgetState(10): Prefixe = Trim(GetGadgetText(11)): Else: Prefixe = "": EndIf
  
  ; on ferme l'ancienne fenêtre
  CloseWindow(0)
  

  nbFileInFolder.l = 0

 ; on liste tous les fichiers graphiques trouvés
  If ExamineDirectory(0, Dossier, "*.*")
    Repeat
      fileType.l = NextDirectoryEntry()   ; recupération du type du fichier

    ; analyse sur les fichiers
      If fileType = 1
        file.s = DirectoryEntryName()
        ok.b = 0
        For i.b = 1 To nbExtension
          If Extension(i) = LCase(GetExtensionPart(file)): ok = 1: EndIf
        Next i
        
        If ok ; le fichier est un fichier graphique
          nbFileInFolder = nbFileInFolder + 1
          fichiers(nbFileInFolder) = file
        EndIf
      EndIf
        
    Until FileType = 0  ; tant que le dossier n'est pas vide
  EndIf

  If nbFileInFolder = 0
    MessageRequester(#PROJECT_NAME$,"Il n'y a aucune image dans ce dossier." + Chr(13) + Chr(10) + "  Le programme va donc se terminer.",#PB_MessageRequester_Ok)
    End
  EndIf
  
  ; appel de la fonction pour les trier
  SortFiles()



; ###  on construit une nouvelle fenêtre  ###
If OpenWindow(1, 100, 200, 260, 320, #PB_Window_SystemMenu, #PROJECT_NAME$ + " - Liste des images")

 If CreateGadgetList(WindowID())
   ListIconGadget(0, 10, 10, 240, 270, "Listes des images", 236, #PB_ListIcon_CheckBoxes | #PB_ListIcon_GridLines)
   ButtonGadget(1,65,290,120,24,"Lancer la compression")
 EndIf


  ; on ajoute les fichiers à la liste (et on coche la case)
  For i = 1 To nbFileInFolder
    AddGadgetItem(0,-1,fichiers(i)): SetGadgetItemState(0,CountGadgetItems(0)-1,#PB_ListIcon_Checked)
  Next i


  ; début de la boucle
  Repeat
    EventID = WaitWindowEvent()
    
    ; lancement de l'encodage
      If EventGadgetID() = 1
        CompresseLesImages()
        End
      EndIf
      
          
  Until EventID = #PB_EventCloseWindow
EndIf
  End
EndProcedure




; ###################################################################################
;- ___ Procedure de tri alphabetique des fichiers  ____________
; ###################################################################################

Procedure SortFiles()
EndProcedure
  


; ###################################################################################
;- ___ Procedure Lancement de la compression des images  _________
; ###################################################################################

Procedure CompresseLesImages()
  For i = 0 To CountGadgetItems(0)-1
    If GetGadgetItemState(0,i) = #PB_ListIcon_Checked
      ;MessageRequester("",fichiers(i+1),#PB_MessageRequester_Ok)
      CompresseImage(fichiers(i+1))
    EndIf
  Next i
  RunProgram(Dossier)
EndProcedure



; ###################################################################################
;- ___ Procedure qui compresse une seule image  ________
; ###################################################################################

Procedure CompresseImage(img.s)
;Dossier.s
;Formats.s
;Compression.l
;Prefixe
  If LoadImage(1,Dossier+img)
    out.s = Dossier+Prefixe+Left(img,Len(img)-Len(GetExtensionPart(img)) ) + Formats
    If FileSize(out)>=0
      If DeleteFile(NomFichier$) = 0
        MessageRequester(#PROJECT_NAME$,"Impossible de supprimer le fichier :" + Chr(13) + Chr(10) + out, #PB_MessageRequester_Ok)
        FreeImage(1): ProcedureReturn
      EndIf
    EndIf  
    
      ; enregistrement de l'image  
      r.l = 0
      Select Formats
        Case "BMP":  r = SaveImage(1,out, #PB_ImagePlugin_BMP):
        Case "PNG":  r = SaveImage(1,out, #PB_ImagePlugin_PNG):
        Case "JPEG": r = SaveImage(1,out, #PB_ImagePlugin_JPEG, Compression): 
      EndSelect  
        
        If r = 0
          ; problème lors de l'enregistrement de l'image
          MessageRequester(#PROJECT_NAME$,"Impossible d'enregistrer l'image :" + Chr(13) + Chr(10) + out, #PB_MessageRequester_Ok)
        Else
          ; l'opération s'est bien déroulée        
          ;MessageRequester("","Enregistrement réussit de :" + Chr(13) + Chr(10) + out, #PB_MessageRequester_Ok)
        EndIf
     
    FreeImage(1)
  Else
    MessageRequester(#PROJECT_NAME$,"Le chargement de l'image " + img + " a échoué", #PB_MessageRequester_Ok)
  EndIf    
EndProcedure



; ###################################################################################
;- ___ Procedure qui compresse une seule image  ________
; ###################################################################################

Procedure.s GetKeyValue(topKey, sKeyName.s, sValueName.s) 
   hKey.l 
   lpData.s 
   lpcbData.l 
   lType.l 
   lReturnCode.l 
   GetValue.s 
    
   If Left(sKeyName, 1) = "\": sKeyName = Right(sKeyName, Len(sKeyName) - 1): EndIf 
    
   GetHandle.l = RegOpenKeyEx_(topKey, sKeyName, 0, #KEY_ALL_ACCESS, @hKey) 
  
   If GetHandle = #ERROR_SUCCESS 
       lpcbData = 255 : lpData = Space(255) 
        
       GetHandle = RegQueryValueEx_(hKey, sValueName, 0, @lType, @lpData, @lpcbData) 
            
       If GetHandle = #ERROR_SUCCESS 
           Select lType 
               Case #REG_SZ 
                   GetHandle = RegQueryValueEx_(hKey, sValueName, 0, @lType, @lpData, @lpcbData) 
                
                   If GetHandle = 0 
                       GetValue = Left(lpData, lpcbData - 1) 
                   Else 
                       GetValue = "" 
                   EndIf 
                    
               Case #REG_DWORD 
                  GetValue = ""
                
           EndSelect 
       EndIf 
   EndIf 
   RegCloseKey_(hKey) 
   ProcedureReturn GetValue
EndProcedure 



; ###################################################################################
;- ___ Zone de donnees pour les formats graphiques pris en cpte ________
; ###################################################################################

DataSection
  FormatsGraphiques:
  Data.s "bmp", "jpeg", "jpg", "png", "tiff", "tga", "-1"
EndDataSection
Le dossier par défaut est le dossier 'Mes Images', obtenu grace à une recherche dans le registre (au passage, merci Oliv).
Sous Xp ca marche, si d'autres personnes peuvent tester et me dire si ça marche sous toutes les plateformes ca serait cool ! :D

Merci @ ++
Dernière modification par lionel_om le lun. 21/juil./2008 1:28, modifié 1 fois.
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Aranoth
Messages : 293
Inscription : sam. 24/janv./2004 12:00
Localisation : Toulouse (31)
Contact :

Message par Aranoth »

Win98, PNG > JPG + préfixe, OK !
Débutant en programmation, notament en C++ ?
Vous souhaitez apprendre ?
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Sur Win ME de ".jpg" en ".bmp", puis de ".bmp" en ". png", pas de problème
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

OK merci pour vos réponses si rapides ! :D
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

ImagesCompressor subit une petite cure de jouvance. La version 2 arrive avec quelques nouveautés. Les voici :

L'ancien ImagesCompressor était plutôt conçu pour convertir une photo ou écraser la photo originale (changement de compression JPEG en particulier). Cette nouvelle monture vous permet dorénavant de spécifier le nouveau dossier et le nouveau nom de l'image (et renommer vos images en 'image 001.jpg', 'image 002.jpg', etc.). Vous aurez dès lors la possibilité de supprimer l'image source ou la conserver.

ImagesCompressor est surtout conçu pour importer vos photos prises depuis votre appareil photo numérique vers votre ordinateur. Ainsi, un message apparaîtra si le dossier concerné contient également des vidéos que vous auriez également pris et donc de ne pas les oublier.

Ci-dessous quelques aperçues des nouvelles fenêtres :

Image
Moins d'options sont disponibles dès le début, mais une touche 'Ctrl+V' vous permet de copier directement un nom de dossier qui est dans le presse-papier

Image
La taille des photos est maintenant visible ainsi qu'un message si le dossier contient des vidéos

Image
Toutes les options maintenant disponibles

Pour télécharger ImagesCompressor 2 (taille: 143 Ko).

Bonnes conversions/compressions.
/Lio
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Message par kwandjeen »

J'avais fait un truc du genre pour les screenshoot de jeu avec renommage.

Image
FRIZE

on peut rajouter plein de truc bonne continuation.
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Bonjour à tous,

Nouvelle version disponible pour Images Compressor.
ADD: Quelques options en plus
FIX: problème avec la listview

Bonne compression à tous
/Lio
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Répondre