J'ai un soucis qui me fait tourner en rond depuis un petit moment.
Je récupère une image et ses dimensions (ici une image 100*100 pour mes essais) afin de l'afficher dans ma Gui. Pour les dimensions je les récupère dans un tableau grâce à la fonction ci-dessous :
► Afficher le texte
Code : Tout sélectionner
;============================================================================================
;
; Function Name: _PicGetSize($Path)
; Description:: Récupère les dimensions d'une image
; Parameter(s): $Path = Chemin de l'image
;
; Return Value(s): Array -> tableau 1D
; $Array[0] -> largeur
; $Array[1] -> hauteur
;
;============================================================================================
Func _PicGetSize($Path)
Local $hImg, $Width, $Height, $Array[2]
_GDIPlus_Startup()
$hImg = _GDIPlus_ImageLoadFromFile($Path)
$Width = _GDIPlus_ImageGetWidth($hImg) ; On récupère la largeur actuelle de l'image
$Height = _GDIPlus_ImageGetHeight($hImg) ; La hauteur également
_WinAPI_DeleteObject($hImg)
_GDIPlus_ShutDown ()
; Mise en tableau des resultats
$Array[0] = $Width
$Array[1] = $Height
Return $Array
EndFunc ;==>_PicGetSizeMon problème, c'est que mon image ne s'affiche pas lorsque je donne ces valeurs de retour (largeur et hauteur de mon image) en paramètres à GUICtrlSetPos alors que si je les met "à la mano" (donc 100 et 100 pour mon cas), l'image s'affiche.
Ce que je ne comprend pas également, c'est que ces valeurs s'affichent parfaitement dans les 2 labels ($_Label_Size1 et $_Label_Size2).
Bref, y a un bin's là...
Ci dessous mon code de débug. J'ai commenté au mieux.
Le script va chercher l'image "1.jpg" dans le dossier "foto" qui est dans le même répertoire que le script.
Merci d'avance.
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#Include <GDIPlus.au3>
; Chemin du dossier "photos"
Global Const $_Photo_Folder_Path = @ScriptDir & "\foto\"
; PHOTO
Global $_Photo_Left = 125 ; Position horizontale de base
Global $_Photo_Top = 125 ; Position verticale de base
Global $_Photo_Width = 150 ; largeur de base
Global $_Photo_Height = 150 ; hauteur de base
; GUI
GUICreate("test", 400, 400, 200, 200)
Global $_Label_Data_Id = GUICtrlCreateLabel("1", 20, 20, 20, 17) ; Identifiant correspondant à l'image
; Emplacement de la photo
Global $_Pic_Photo = GUICtrlCreatePic("", $_Photo_Left, $_Photo_Top, $_Photo_Width, $_Photo_Height)
; Affichage des dimensions de la nouvelle photo
Global $_Label_Size1 = GUICtrlCreateLabel("", 20, 380, 30, 20)
Global $_Label_Size2 = GUICtrlCreateLabel("", 60, 380, 30, 20)
GUISetState(@SW_SHOW)
_ChargerPhoto()
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
;=================================================================================
Func _ChargerPhoto()
Local $ArraySize[2], $Width, $Height, $ArrayPos[2], $Left, $Top
Local $Size[2]
Local $CurrentID = GUICtrlRead($_Label_Data_Id) ; Identifiant de la fiche en cours (ici "1")
; Chemin complet de la photo à afficher (ici : @ScriptDir & "\fto\1.jpg" . Ses dimensions 100*100)
Local $PicPhotoPath = $_Photo_Folder_Path & $CurrentID & ".jpg"
;*******LE PROBLEME VIENT DE LA**********
; On récupère les dimensions de la photo
$ArraySize = _PicGetSize($PicPhotoPath)
$Width = $ArraySize[0]
$Height = $ArraySize[1]
;
; On calcule la nouvelle position
; Si on remplace $Width et $Height à la mano par 100 et 100, ça fonctionne...Idem pour GUICtrlSetPos qq lignes plus bas
$ArrayPos = _PicNewPos($_Photo_Left, $_Photo_Top, $_Photo_Width, $_Photo_Height, $Width, $Height)
;****************************************
$Left = $ArrayPos[0]
$Top = $ArrayPos[1]
; Mis à jour de la photo et de son positionnement
GUICtrlSetImage($_Pic_Photo, $PicPhotoPath)
GUICtrlSetPos($_Pic_Photo, $Left, $Top, $Width, $Height)
; Affichage des dimensions dans les labels Size
; Je rejoue la fonction exprès
; *****ICI LES VALEURS S'AFFICHENT CORRECTEMENT AFPPAREMMENT*****
$Size = _PicGetSize($PicPhotoPath)
GUICtrlSetData($_Label_Size1, $Size[0])
GUICtrlSetData($_Label_Size2, $Size[1])
EndFunc ;==> _ChargerPhoto
;============================================================================================
;
; Function Name: _PicGetSize($Path)
; Description:: Récupère les dimensions d'une image
; Parameter(s): $Path = Chemin de l'image
;
; Return Value(s): Array -> tableau 1D
; $Array[0] -> largeur
; $Array[1] -> hauteur
;
;============================================================================================
Func _PicGetSize($Path)
Local $hImg, $Width, $Height, $Array[2]
_GDIPlus_Startup()
$hImg = _GDIPlus_ImageLoadFromFile($Path)
$Width = _GDIPlus_ImageGetWidth($hImg) ; On récupère la largeur actuelle de l'image
$Height = _GDIPlus_ImageGetHeight($hImg) ; La hauteur également
_WinAPI_DeleteObject($hImg)
_GDIPlus_ShutDown ()
; Mise en tableau des resultats
$Array[0] = $Width
$Array[1] = $Height
Return $Array
EndFunc ;==>_PicGetSize
;============================================================================================
;
; Function Name: _PicNewPos($Left, $Top, $OldW, $OldH, $NewW, $NewH)
; Description:: Calcule la position de la future image par rapport à l'emplacement de base
; Parameter(s): $Left = position horizontale de base
; $Top = position verticale de base
; $OldW = largeur de l'actuelle image
; $OldH = hauteur de l'actuelle image
; $NewW = largeur de la future image
; $NewH = hauteur de la future image
;
; Return Value(s): $Array -> tableau 1D
; $Array[0] -> distance horizontale de la future image
; $Array[1] -> distance verticale de la future image
;
;============================================================================================
Func _PicNewPos($Left, $Top, $OldW, $OldH, $NewW, $NewH)
Local $DiffW, $DiffH, $NewLeft, $NewTop
Local $Array[2]
If $NewW < $OldW Then ; Si la largeur de la nouvelle image < que celle de base
$DiffW = $OldW - $NewW ; on calcule la différence
$NewLeft = $Left + ($DiffW / 2) ; et la nouvelle position horizontale aussi
Else
$NewLeft = $Left ; sinon on garde la position de base
EndIf
; Même principe pour la hauteur
If $NewH < $OldH Then
$DiffH = $OldH - $NewH
$NewTop = $Top + ($DiffH / 2)
Else
$NewTop = $Top
EndIf
$Array[0] = $NewLeft
$Array[1] = $NewTop
Return $Array
EndFunc ;==>_PicNewPosEdit2 : Désolé



