Je pensais m'en être sorti dans ce topic mais que nenni !
Alors j'ouvre ce fil de discussion pour ce soucis précis.
But du programme
- Redimensionner par Lot en "glisser/déposer" de dossiers contenant des images jpg.
Ex : dossier1/toto.jpg deviendra dossier1/dossier1/1.jpg et ainsi de suite
Pour ce qui est de cette partie du code, aucun soucis.
Mon problème
Faire fonctionner Procedure Clignote(*cacahuet) en thread pendant que le soft redimensionne.
Je souhaite donc faire apparaitre le numéro de l'image en cours de traitement pendant le traitement.
Puis que le thread se coupe (ou se pause) jusqu'à la prochaine opération de glisser/deposer
J'ai viré ou commenté tout ce qui touchait aux thread et n'ai laissé que la procédure
Voilà le code :
Code : Tout sélectionner
;Resizier par Ar-S -2009 // PB 4.30
;2011 - PB 4.51 taille relative
; redimensionnement relatif d'images basé sur X:1024 et Y:768
; Si une image est plus large que haute, le redimmensionement se basera sur X
; et inversement.
UseJPEGImageEncoder()
UseJPEGImageDecoder()
Enumeration
#IMG : #AFF
EndEnumeration
Global TailleL.l=1024
Global TailleH.l=768
Global L.l,H.l,Limg.l,Himg.l,NumDir.q,pos.b,Son.l
Global DernierDossier$,NouveauRep$,car$,fin,Repertoire$
Global v$=" v1.03"
Global QuiteThread.l
Global NBRfich.l
Global NewList LesFichiers.s()
QuiteThread=0
CREATION=1
Son=4
; ;--------------------------------
; ;- INITIALISATION DU SON .. ou pas
; ;--------------------------------
; If InitSound () <>0 ; On ne va pas charger le fichier son si le son n'est pas initialisé sur la machine..
; PlaySon=#True
; If CatchSound ( Son , ?chimes_wav_Start , ?chimes_wav_End) = 0
; PlaySon=#False
; EndIf
; Else
; PlaySon=#False
; EndIf
;--------------------------------
;- LES PROCEDURES
;--------------------------------
Procedure Clignote(*cacahuet)
Debug "Je suis lancé"
Static mode=0
Repeat
Debug "NBR FICH : "+Str(NBRfich)
While ListIndex(LesFichiers())+1<NBRfich
Select mode
Case 0
SetGadgetText(#AFF,"* Traitement en cours image > "+Str(ListIndex(LesFichiers())+1))
Case 1
SetGadgetText(#AFF,"* Traitement en cours image >>> "+Str(ListIndex(LesFichiers())+1))
EndSelect
mode = 1-mode
Delay(100)
Debug Str(ListIndex(LesFichiers())+1)+"/"+Str(NBRfich)
Wend
Until QuiteThread=1
Debug "Je suis eteind"
EndProcedure
Procedure CompteFichiers(dir)
Repertoire$=EventDropFiles()
Debug "Repertoire droppé : "+Repertoire$
NBRfich=0
ClearList(LesFichiers())
If ExamineDirectory(dir, EventDropFiles(), "*.jpg")
While NextDirectoryEntry(dir)
If DirectoryEntryType(dir) = #PB_DirectoryEntry_File
fichier$=DirectoryEntryName(dir)
If LCase(GetExtensionPart(fichier$))="jpg" Or LCase(GetExtensionPart(fichier$))="jpeg" ; histoire d'être sur de chopper toutes les images
AddElement(LesFichiers())
LesFichiers()=Repertoire$+"\"+fichier$
Debug LesFichiers()
NBRfich+1
Debug "Nbr Fichier : "+Str(NBRfich)
EndIf
EndIf
Wend
FinishDirectory(dir)
EndIf
ProcedureReturn NBRfich
EndProcedure
;--------------------------------
;- LE PROGRAMME
;--------------------------------
OpenWindow(0, 583, 629, 319, 23, "LDVM Redim 1024/768 relatif"+v$, #PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
StickyWindow(0,1)
StringGadget(#AFF, 0, 0, 315, 20, "Glissez/déposez le dossier image ici",#PB_String_ReadOnly)
EnableWindowDrop(0, #PB_Drop_Files, #PB_Drag_Copy)
thread=CreateThread(@Clignote(),200)
; While IsThread(thread)
; Delay(1)
; Wend
;{- Boucle
Repeat
Select WaitWindowEvent()
Case #PB_Event_WindowDrop
;--------------------------------
;- ANALYSE DU REPERTOIRE
;--------------------------------
Depart=ElapsedMilliseconds()
CompteFichiers(NumDir)
Debug "il y a "+Str(NBRfich)+" images jpg dans ce dossier"
Debug "Taile liste : "+Str(ListSize(LesFichiers()))
Debug "...."
; thread=CreateThread(@Clignote(),100)
; While IsThread(thread)
; Delay(1)
; Wend
;--------------------------------
;- RECUPERATION DU NOM DU DERNIER DOSSIER
;--------------------------------
RepSav$=Repertoire$+"\"
pos=1
NumCar=Len(Repertoire$)
Repeat
car$=Right(Repertoire$,pos)
While Left(car$,1)<>"\"
pos+1
car$=Right(Repertoire$,pos)
Wend
Until Left(car$,1)="\"
DernierDossier$=Right(car$,pos-1)
; Debug "Dernier dossier : "+DernierDossier$
; SetClipboardText(DernierDossier$)
;--------------------------------
;- CREATION DU REPERTOIRE DESTINATION
;--------------------------------
NouveauRep$=RepSav$+DernierDossier$+"\"
Debug "Rep à créer : "+NouveauRep$
;On vérifie s'il existe
Resultat.q = FileSize(NouveauRep$)
Debug Resultat
If Resultat <> -2 ; s'il ni a pas de repertoire on le créé
nouveauRep=CreateDirectory(NouveauRep$)
Debug NouveauRep$+" créé !"
Else
Debug NouveauRep$+" existe déjà :]"
EndIf
;--------------------------------
;- REDIMENSION ET SAUVEGARDE
;--------------------------------
ResetList(LesFichiers())
While NextElement(LesFichiers())
Debug LesFichiers()
charge=LoadImage(#IMG, LesFichiers())
Debug "Chargement de l'image :"+LesFichiers()
Limg=ImageWidth(#IMG)
Himg=ImageHeight(#IMG)
Debug "Image chargée ! X : "+Str(Limg)+" Y : "+Str(Himg)
;- Calcule de la taille des images de destination.
If Limg>Himg
L=TailleL
H=(Himg*TailleL)/Limg
Debug " Resolution de sortie :"
Debug " X : "+Str(L)+" Y : "+Str(H)
ElseIf Himg>Limg
H=TailleH
L=(Limg*TailleH)/Himg
Debug " Resolution de sortie :"
Debug " X : "+Str(L)+" Y : "+Str(H)
ElseIf Limg=Himg
H=TailleH
L=TailleH ; H car doit faire la Hauteur en taille car les ecrans sont plus large que haut...
Debug " Resolution de sortie :"
Debug " X : "+Str(L)+" Y : "+Str(H)
Else
Debug "erreur redimensionnement"
EndIf
;- Redimensionnement de l'image
ResizeImage(#IMG,L,H,#PB_Image_Smooth)
;- Sauvegarde de la nouvelle image
NomNew$=Str(ListIndex(LesFichiers())+1)+".jpg"
Debug "Nouveau nom : "+NomNew$
Debug "Destination : "+NouveauRep$+NomNew$
sauve=SaveImage(#IMG,NouveauRep$+NomNew$,#PB_ImagePlugin_JPEG ,8)
If sauve=0
SetGadgetText(#AFF,"Erreur Sauvegarde")
Debug "Save Foireuse"
Else
Debug "Save OK"
Debug "----------------------------"
EndIf
Delay(1)
Wend
; ;--------------------------------
; ;- LECTURE DU SON DE FIN D'OPERATION
; ;--------------------------------
; If PlaySon=#True
; PlaySound (Son ,1)
; Delay (600)
; StopSound(Son)
; EndIf
Arrivee=ElapsedMilliseconds()-Depart
SetGadgetText(#AFF,"Terminé ! "+Str(NBRfich)+" images traitées dans "+DernierDossier$+" en "+Str(Arrivee)+" ms")
NBRfich=0
ClearList(LesFichiers())
QuiteThread=1
Case #PB_Event_CloseWindow
Select EventWindow()
Case 0
CloseWindow(0)
Break
EndSelect
EndSelect
ForEver