Programme de tri de photos Jpg

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Programme de tri de photos Jpg

Message par brossden »

Bonjour

Je vous propose un petit programme sans prétention qui permet de renumeroter dans un ordre croissant des photos d'un même répertoire.
Ce programme rajoute trois digits de 000 à 999 devant les anciens noms de photo, mais il est possible de faire marche arrière par un bouton spécifique "Dénumérotation".

Par sécurité copier l'ensemble des photos à trier dans un répertoire nommé à votre convenance.
La dimmension des vignettes est variable en fonction du nombre de photos à trier avec un mini !
Ce prog n'est pour l'instant conçu que pour une résolution de 1280*1024 désolé pour ceux qui n'ont pas accès à cette résolution mais c'est un mini pour faire ce genre de boulot, ainsi qu'une machine rapide 2 Go mini, avec une mémoire confortable de 512 Mo et plus
Toute fois il ne devrait pas être trés difficile de modifier la chose, toutes les constantes sont introduites dans la procedure Variables .
Il est tout aussi possible de trier des photos bmp ou autre en modifiant deux paramètres.

Principe :
Lancer le programme.
Attendre la fin de l'affichage
Cliquer sur la photo à déplacer.
Cliquer à l'endroit ou vous voulez inserrer cette photo.
Lorsque votre tri vous parait satisfaisant cliquer sur le bouton "Numérotation" Celui-ci n'est visible que lorsque vous avez replacé une photo supprimée de sa position.
Si vous arréter le programme au milieu de son fonctionnement aucun soucis!

Merci de votre indulgence : :oops:

Code : Tout sélectionner

Global Marge, HBp, LBp, IdBout, Esp, PasV, PasH,LFen, HFen ,LScr ,HScr ,LFSr ,HFSr, PasS,NLigne, NColonne, NbrPhotos
Global NumPhoto, thread, DernierePh,Corbeille, NomChemin.s, name.s, Index

Dim Photo.s(1001)
Dim Image(1001)
Dim Bouton(1001)

Procedure BalloonTip(WindowID, Gadget, Text$ , Title$, Icon) 
  ToolTip=CreateWindowEx_(0,"ToolTips_Class32","",#WS_POPUP | #TTS_NOPREFIX | #TTS_BALLOON,0,0,0,0,WindowID,0,GetModuleHandle_(0),0)
  SendMessage_(ToolTip,#TTM_SETTIPTEXTCOLOR,GetSysColor_(#COLOR_INFOTEXT),0)
  SendMessage_(ToolTip,#TTM_SETTIPBKCOLOR,GetSysColor_(#COLOR_INFOBK),0)
  SendMessage_(ToolTip,#TTM_SETMAXTIPWIDTH,0,180)
  Balloon.TOOLINFO\cbSize=SizeOf(TOOLINFO)
  Balloon\uFlags=#TTF_IDISHWND | #TTF_SUBCLASS
  Balloon\hWnd=GadgetID(Gadget)
  Balloon\uId=GadgetID(Gadget)
  Balloon\lpszText=@Text$
  SendMessage_(ToolTip, #TTM_ADDTOOL, 0, Balloon)
  If Title$ > ""
    SendMessage_(ToolTip, #TTM_SETTITLE, Icon, @Title$)
  EndIf 
EndProcedure
Procedure Max(Val1, Val2)
  If Val1 > Val2
    Ret =Val1
  Else
    Ret= Val2
  EndIf
  ProcedureReturn Ret
EndProcedure
Procedure Min(Val1, Val2)
  If Val1 < Val2
    Ret =Val1
  Else
    Ret= Val2
  EndIf
  ProcedureReturn Ret
EndProcedure
Procedure Variables()
  Marge    = 5
  Esp      = 2
  LFen     = 1280
  HFen     = 960
  LScr     = 1255
  LFSr     = 1230
  IdBout   = 0
  PhLigne  = Min(15,Sqr(NbrPhotos)+1)
  PhLigne =  Min(PhLigne,NbrPhotos)
  LBp      = (LFSr-10-(Esp*(PhLigne-1))-(2*Marge)) /PhLigne
  
  HBp      = LBp * 0.75
  PasH     = LBp + Esp
  PasV     = HBp + Esp
  PasS     = PasV
  NLigne   = (NbrPhotos)/PhLigne
  If NLigne*PhLigne<NbrPhotos 
    NLigne+1
  EndIf
  NColonne = PhLigne
  NLiAff   = Min((HFen-(2*Marge))/PasV,NLigne)
  HScr     = (Marge*2)+(NLiAff * PasV)+5
  HFSr     = (Marge*2)+(PasV * NLigne)
  NumPhoto = 0
  Corbeille= 0
  For n=1 To 1001 : Bouton(n)= n : Next
  DernierePh = 1001
EndProcedure
Procedure.l ListeJpg(directory.s )
  Static num.l
  num=-1
  id.l = ExamineDirectory( #PB_Any, directory, "*.jpg")
  Repeat
    type.l = NextDirectoryEntry()
    If type = 0 : ProcedureReturn num : EndIf
    name.s = DirectoryEntryName()
    full.s = directory + "\" + name
    Select type
      Case 1 : num + 1 
        Photo(num)=name
    EndSelect
  ForEver
EndProcedure
Procedure Open_Window_0()
  Titre.s="Tri des Photos Jpg   "+Str(NColonne)+" * "+Str(NLigne)+"  Pour "+Str(NbrPhotos)+" Images" 
  If OpenWindow(0, 0, 0, LFen, HFen,  #PB_Window_SystemMenu | #PB_Window_MaximizeGadget | #PB_Window_TitleBar , Titre)
    If CreateGadgetList(WindowID())
      ButtonGadget(3000, 2500,2900, 100,50, "Numérotation")
      ButtonGadget(3001, 700,900, 100,50, "Dénumérotation")
      ButtonImageGadget(1001, 1000+LFen-10-LBp, HFen-10-HBp, LBp, HBp, 0) 
      ScrollAreaGadget(2000, Marge, Marge,LScr,HScr, LFSr, HFSr, PasS)
      For lig=0 To NLigne-1
        For Col=0 To NColonne-1
          If IdBout=NbrPhotos : Col=11 : lig = 100 : EndIf
          ButtonImageGadget(IdBout, Marge+(Col*PasH), 5+(lig*PasV), LBp, HBp, 0)
          BalloonTip(WindowID(), IdBout, Photo(IdBout), "", #TOOLTIP_NO_ICON)
          IdBout+1
        Next
      Next
    EndIf
  EndIf
  
EndProcedure
Procedure AlertThread(Param)
  While NumPhoto < NbrPhotos
    CreateImage(NumPhoto,LBp,HBp)
    Image(NumPhoto)=LoadImage(NumPhoto,NomChemin+Photo(NumPhoto))
    If ImageHeight()<ImageWidth()
      Image(NumPhoto)=ResizeImage(NumPhoto,LBp,HBp)
    Else
      Image(NumPhoto)=ResizeImage(NumPhoto,HBp*0.75,HBp)
    EndIf
    SetGadgetState(NumPhoto,Image(NumPhoto))
    
    
    NumPhoto+1
    Delay(10)
  Wend
  KillThread(thread)
  
EndProcedure
Procedure affiche()
  For n=0 To NbrPhotos-1
    SetGadgetState(n,Image(n))
    BalloonTip(WindowID(), n, Photo(n), "", #TOOLTIP_NO_ICON) 
    Next
  SetGadgetState(1001,Image(1001))
  If Image(1001)<>0 
    ResizeGadget(3000, 2500,2900, 100,50)
    ResizeGadget(3001, 2700,2900, 100,50)
    ResizeGadget(1001, LFen-10-LBp, HFen-10-HBp, LBp, HBp)
  Else
    ResizeGadget(3000, 500,900, 100,50)
    ResizeGadget(3001, 700,900, 100,50)
    ResizeGadget(1001, 1000 + LFen-10-LBp, 1000+HFen-10-HBp, LBp, HBp)
  EndIf
EndProcedure
Procedure Arrange(Gadget)
  If Corbeille=0
    Corbeille=1
    Image(DernierePh)=Image(Gadget)
    Photo(DernierePh) = Photo(Gadget)
    For n = Gadget To NbrPhotos-1
      Image(n) = Image(n+1)
      Photo(n) = Photo(n+1)
    Next
    Photo(n)=""
    Image(n)=0
  Else
    Corbeille=0
    For n = NbrPhotos-1 To Gadget Step -1
      Image(n+1) = Image(n)
      Photo(n+1) = Photo(n)
    Next
    Image(Gadget)=Image(DernierePh)
    Photo(Gadget)=Photo(DernierePh) 
    Photo(DernierePh)=""
    Image(DernierePh)=0
  EndIf
  affiche()
EndProcedure
Procedure Denum()
  Index=10001
  For n=0 To NbrPhotos
    name=Photo(n)
    If Len(name) > 7
      a = Asc(Mid(name,1,1))
      b = Asc(Mid(name,2,1))
      c = Asc(Mid(name,3,1)) 
      If a > 47 And a < 58
        If b > 47 And b < 58
          If c > 47 And c < 58
            name=Mid(name,4,30)
          EndIf
        EndIf
      EndIf
    EndIf
    RenameFile(NomChemin+Photo(n),NomChemin+name)
    Index+1
  Next
EndProcedure  
Procedure Renum()
  Index=10001
  For n=0 To NbrPhotos
    name=Photo(n)
    If Len(name) > 7
      a = Asc(Mid(name,1,1))
      b = Asc(Mid(name,2,1))
      c = Asc(Mid(name,3,1)) 
      If a > 47 And a < 58
        If b > 47 And b < 58
          If c > 47 And c < 58
            name=Mid(name,4,30)
          EndIf
        EndIf
      EndIf
    EndIf
    RenameFile(NomChemin+Photo(n),NomChemin+Right(Str(Index),3)+name+"0")
    Photo(n)=Right(Str(Index),3)+name
    Index+1
  Next
  For n=0 To NbrPhotos
    RenameFile(NomChemin+Photo(n)+"0",NomChemin+Photo(n))
  Next
  End
EndProcedure

UseJPEGImageDecoder()
NomChemin.s = PathRequester("Choix des photos", "c:\")
NbrPhotos = ListeJpg(NomChemin)+1
If NbrPhotos = 0 
  End
EndIf
Variables()
Open_Window_0()

thread=CreateThread(@AlertThread(), 154)

Repeat
  Event = WaitWindowEvent()
  If Event = #PB_EventGadget 
    GadgetID = EventGadgetID()  
    If GadgetID => 0 And GadgetID < NbrPhotos ; Tri les photos
      Arrange(GadgetID)
    ElseIf GadgetID = 3000 ;Numérote
      Renum()      
    ElseIf GadgetID = 3001 ;Dénumerote
      Denum()
      End 
    EndIf
  EndIf
Until Event = #PB_EventCloseWindow
End
Denis

Bonne Jounée à tous
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

ton code est bien
mais les photos apparaissent en grand
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

La taille des vigenttes dépend du nombre de fichiers Jpeg qui sont dans le répertoire selectionné, avec un maximum de 14 par ligne !
Denis

Bonne Jounée à tous
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Ya des bugs au niveau des tooltips qui ne s'effacent pas dans certains cas et donc le nouveau peut le masquer. Ou sinon c'est que deux tooltips sont créé en mm temps...

En tout cas ya des choses à revoir (ou sinon bug de version, PB : 3.93 chez moi)
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Bonjour Lionel_om

Le bug vient de purebasic, car le fonctionnment est correct sous Xp mais bug il est vrai sous Win98 ou le contraire suivant la programmation, mais comme Xp est quand même devenu le principal Os j'ai laissé le code pour Xp.
Denis

Bonne Jounée à tous
Répondre