voilà 2 fonctions que j'ai pondu today pour mes besoins.
Je les utilise avec la fonction de Matwachich "_ImageResize" qui permet de redimensionner une image:
http://autoitscript.fr/forum/viewtopic.php?f=21&t=6057
La première _PicNewSize permet de calculer les futures dimensions d'une image à redimensionner par rapport à son emplacement de base dans la GUI. Ce sont ces dimensions qui seront fournies en paramètres à _ImageResize.
La seconde _PicNewPos calcule la position horizontale et verticale de la nouvelle image (centrage par rapport à l'emplacement de base). Les résultats serviront de paramètres pour GUICtrlSetPos.
Voici les 2 fonctions:
► Afficher le texte
Code : Tout sélectionner
;==============================================================
;
; Function Name: _PicNewSize($Path, $MaxW, $MaxH)
; Description:: Calcule les futures dimensions d'une image par rapport à la taille de son
; emplacement de base
; Parameter(s): $$Path = chemin de la future image
; $MaxW = largeur maximum
; $MaxH = hauteur maxi
;
; Return Value(s): Success -> $Array -> tableau 1D (a adapter si vous voulez simplement les nouvelles valeurs)
; $Array[0] -> valeur 1 ou 0 (1 = redimensionner, 0 = non)
; $Array[1] -> largeur actuelle
; $Array[2] -> hauteur actuelle
; $Array[3] -> nouvelle largeur
; $Array[4] <> nouvelle hauteur
; Failure -> met @error à 1 -> Fichier introuvable
; Author(s): Alex74
;
;==============================================================
;
#include-once
#Include <GDIPlus.au3>
Func _PicNewSize($Path, $MaxW, $MaxH)
Local $Array[5], $ResW, $ResH, $Emp, $Diff, $Resize, $NewW, $NewH
If Not FileExists($Path) Then Return SetError(1, 0, "Fichier introuvable")
_GDIPlus_Startup()
Local $hImg = _GDIPlus_ImageLoadFromFile($Path)
Local $Width = _GDIPlus_ImageGetWidth($hImg) ; On récupère la largeur actuelle de l'image
Local $Height = _GDIPlus_ImageGetHeight($hImg) ; La hauteur également
_WinAPI_DeleteObject($hImg)
_GDIPlus_ShutDown ()
; On compare largeur et hauteur aux dimensions max du futur emplacement
If $Width > $MaxW Then
$ResW = 1
Else
$ResW = 0
EndIf
If $Height > $MaxH Then
$ResH = 1
Else
$ResH = 0
EndIf
; Empreinte des résultats
$Emp = $ResW & $ResH
Switch $Emp
Case $Emp = 00 ; Aucune redimension, l'image gardera ses côtes actuelles
$Resize = 0
$NewW = $Width
$NewH = $Height
Case $Emp = 10 ; Largeur supérieure, on resize
$Resize = 1
$Diff = $Width / $MaxW
$NewW = $MaxW
$NewH = Ceiling($Height / $Diff) ; tant qu'à faire, on arrondi
Case $Emp = 01 ; Hauteur supérieure, on resize aussi
$Resize = 1
$Diff = $Height / $MaxH
$NewW = Ceiling($Width / $Diff)
$NewH = $MaxH
Case $Emp = 11 ; Largeur et hauteur supérieures, idem
$Resize = 1
; Si la largeur est sup à la hauteur
If $Width > $Height Then
$Diff = $Width / $MaxW
$NewW = $MaxW
$NewH = Ceiling($Height / $Diff)
; Si hauteur supérieure
ElseIf $Width < $Height Then
$Diff = $Height / $MaxH
$NewW = Ceiling($Width / $Diff)
$NewH = $MaxH
; Si largeur = hauteur
Else
$NewW = $MaxW
$NewH = $MaxH
EndIf
EndSwitch
; Mise en tableau des résultats
$Array[0] = $Resize ; Valeur 1 ou 0 (1 = redimensionner, 0 = non)
$Array[1] = $Width ; Largeur actuelle
$Array[2] = $Height ; Hauteur actuelle
$Array[3] = $NewW ; Nouvelle largeur
$Array[4] = $NewH ; Nouvelle hauteur
Return $Array
EndFunc ;==>_PicNewSize
;==============================================================
;
; 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
; Author(s): Alex74
;
;==============================================================
;
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 ;==>_PicNewPos
Chargez des images de n'importe quelle dimmensions (des petites, des énormes).
► Afficher le texte
Code : Tout sélectionner
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#Include <GDIPlus.au3>
Opt("GUIOnEventMode", 1)
Opt("MustDeclareVars", 1)
Global $_Img_Left = 120 ; Position horizontale de base
Global $_Img_Top = 100 ; Position verticale de base
Global $_Img_Width = 160 ; largeur de base
Global $_Img_Height = 160 ; hauteur de base
Global $_GUI = GUICreate("Ma GUI", 400, 400, 200, 200)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Fermer")
Global $_Changer_Image = GUICtrlCreateButton("Charger Image", 150, 50, 100, 25)
GUICtrlSetOnEvent(-1, "_ChargerImage")
Global $_Image = GUICtrlCreatePic("", $_Img_Left, $_Img_Top, $_Img_Width, $_Img_Height) ; Image de base
GUISetState(@SW_SHOW)
While 1
Sleep(100)
WEnd
;==============================================================
Func _ChargerImage()
Local $ArrayResults[5], $Resize, $NewPos[2]
; Limité pour l'exemple aux images JPEG et BMP car GUICtrlSetImage ne fonctionne pas avec les PNG
; Pour les PNG, voir l'UDF GUICtrlPic.au3 (http://www.autoit.de/index.php?page=Thread&postID=199530)
Local $ImgPath = FileOpenDialog("Ajouter/modifier une image", @DesktopDir & "\", "Images (*.jpg;*.bmp)", 1)
Local $ImgName = StringTrimLeft($ImgPath, StringInStr($ImgPath, "\", 1, -1)) ; On récupère le nom et l'extension
Local $OutPath = @ScriptDir & "\" & $ImgName ; chemin de la nouvelle image
$ArrayResults = _PicNewSize($ImgPath, $_Img_Width, $_Img_Height) ; On récupère les valeurs dans le tableau
If $ArrayResults[0] = 1 Then ; Si 1, on resize l'image
$Resize = "Oui"
_ImageResize($ImgPath, $OutPath, $ArrayResults[3], $ArrayResults[4])
GUICtrlSetImage($_Image, $OutPath)
$NewPos = _PicNewPos($_Img_Left, $_Img_Top, $_Img_Width, $_Img_Height, $ArrayResults[3], $ArrayResults[4])
GUICtrlSetPos($_Image, $NewPos[0], $NewPos[1], $ArrayResults[3], $ArrayResults[4])
MsgBox(0, "Results", "Redimensionnée : " & $Resize & @CRLF & _
"Largeur avant resize : " & $ArrayResults[1] & @CRLF & _
"Largeur après resize : " & $ArrayResults[3] & @CRLF & _
"Hauteur avant resize : " & $ArrayResults[2] & @CRLF & _
"Hauteur après resize : " & $ArrayResults[4] & @CRLF & _
"Position horitontale : " & $NewPos[0] & @CRLF & _
"Position verticale : " & $NewPos[1])
Else ; Sinon l'image garde les mêmes dimensions, elle est simplement repositionnée
$Resize = "Non"
FileMove($ImgPath, $OutPath, 1)
GUICtrlSetImage($_Image, $OutPath)
$NewPos = _PicNewPos($_Img_Left, $_Img_Top, $_Img_Width, $_Img_Height, $ArrayResults[3], $ArrayResults[4])
GUICtrlSetPos($_Image, $NewPos[0], $NewPos[1], $ArrayResults[3], $ArrayResults[4])
MsgBox(0, "Results", "Redimensionnée : " & $Resize & @CRLF & _
"Largeur actuelle : " & $ArrayResults[1] & @CRLF & _
"Hauteur actuelle : " & $ArrayResults[2] & @CRLF & _
"Position horitontale : " & $NewPos[0] & @CRLF & _
"Position verticale : " & $NewPos[1])
EndIf
FileDelete($OutPath)
EndFunc ;==>_ChargerImage
;==============================================================
Func _PicNewSize($Path, $MaxW, $MaxH)
Local $Array[5], $ResW, $ResH, $Emp, $Diff, $Resize, $NewW, $NewH
If Not FileExists($Path) Then Return SetError(1, 0, "Fichier introuvable")
_GDIPlus_Startup()
Local $hImg = _GDIPlus_ImageLoadFromFile($Path)
Local $Width = _GDIPlus_ImageGetWidth($hImg) ; On récupère la largeur actuelle de l'image
Local $Height = _GDIPlus_ImageGetHeight($hImg) ; La hauteur également
_WinAPI_DeleteObject($hImg)
_GDIPlus_ShutDown ()
; On compare largeur et hauteur aux dimensions max du futur emplacement
If $Width > $MaxW Then
$ResW = 1
Else
$ResW = 0
EndIf
If $Height > $MaxH Then
$ResH = 1
Else
$ResH = 0
EndIf
; Empreinte des résultats
$Emp = $ResW & $ResH
Switch $Emp
Case $Emp = 00 ; Aucune redimension, l'image gardera ses côtes actuelles
$Resize = 0
$NewW = $Width
$NewH = $Height
Case $Emp = 10 ; Largeur supérieure, on resize
$Resize = 1
$Diff = $Width / $MaxW
$NewW = $MaxW
$NewH = Ceiling($Height / $Diff) ; tant qu'à faire, on arrondi
Case $Emp = 01 ; Hauteur supérieure, on resize aussi
$Resize = 1
$Diff = $Height / $MaxH
$NewW = Ceiling($Width / $Diff)
$NewH = $MaxH
Case $Emp = 11 ; Largeur et hauteur supérieures, idem
$Resize = 1
; Si la largeur est sup à la hauteur
If $Width > $Height Then
$Diff = $Width / $MaxW
$NewW = $MaxW
$NewH = Ceiling($Height / $Diff)
; Si hauteur supérieure
ElseIf $Width < $Height Then
$Diff = $Height / $MaxH
$NewW = Ceiling($Width / $Diff)
$NewH = $MaxH
; Si largeur = hauteur
Else
$NewW = $MaxW
$NewH = $MaxH
EndIf
EndSwitch
; Mise en tableau des résultats
$Array[0] = $Resize ; Valeur 1 ou 0 (1 = redimensionner, 0 = non)
$Array[1] = $Width ; Largeur actuelle
$Array[2] = $Height ; Hauteur actuelle
$Array[3] = $NewW ; Nouvelle largeur
$Array[4] = $NewH ; Nouvelle hauteur
Return $Array
EndFunc ;==>_PicNewSize
;==============================================================
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 ;==>_PicNewPos
;==============================================================
;
; Function Name: _ImageResize($oldImage, $newImage, $newW, $newH)
; Description:: Modifie la taille d'une image
; Parameter(s): $oldImage = Chemin de l'image à modifier
; $newImage = Chemin de sortie
; $newW = nouvelle largeur
; $newH = nouvelle hauteur
; Return Value(s): Sucess -> 1, @Extended = Taille de la nouvelle image
; Failed -> 0
; Author(s): Matwachich
;
;==============================================================
;
Func _ImageResize($oldImage, $newImage, $newW, $newH)
Local $img, $gContext, $newBmp, $gNewContext, $closeGDI = False
If $ghGDIPDll = 0 Then
_GDIPlus_Startup()
$closeGDI = True
EndIf
$img = _GDIPlus_ImageLoadFromFile($oldImage)
$gContext = _GDIPlus_ImageGetGraphicsContext($img)
$newBmp = _GDIPlus_BitmapCreateFromGraphics($newW, $newH, $gContext)
$gNewContext = _GDIPlus_ImageGetGraphicsContext($newBmp)
_GDIPlus_GraphicsDrawImageRect($gNewContext, $img, 0, 0, $newW, $newH)
_GDIPlus_ImageSaveToFile($newBmp, $newImage)
_GDIPlus_ImageDispose($img)
_GDIPlus_GraphicsDispose($gContext)
_GDIPlus_GraphicsDispose($gNewContext)
_GDIPlus_BitmapDispose($newBmp)
If Not FileExists($newImage) Then Return 0
Return SetError(0, FileGetSize($newImage), 1)
If $closeGDI Then _GDIPlus_Shutdown()
EndFunc ;==>_ImageResize
;==============================================================
Func _Fermer()
GUIDelete($_GUI)
Exit
EndFunc ;==>_Fermer