[Func] GuiCtrlCreatePic avec tous formats d'images

Partagez des fonctions et des UDF AutoIt.
Règles du forum
.
Répondre
SagePourpre
Niveau 7
Niveau 7
Messages : 442
Enregistré le : dim. 06 juil. 2008 09:11
Status : Hors ligne

[Func] GuiCtrlCreatePic avec tous formats d'images

#1

Message par SagePourpre »

Voilà une petite fonction tirée de mon udf ( et légèrement modifiée ) qui agit de façon semblable à GuiCtrlCreatePic mais
vous permet d'afficher les formats d'images non supportés par cette dernière (comme les *.png)

$src = chemin du fichier
$x = position X du contrôle
$y = position Y du contrôle
$scale = 1 ratio d'agrandissement ou de réduction de l'image ( un ratio de 1 = dimensions de l'image)
$alt = "texte à afficher lors du survol de l'image"


* Scale n'est pas parfait et si vous changez la grandeur de l'image, il est possible qu'une "ombre" apparaisse sur l'image.
Si vous en connaissez la cause, n'hésitez pas à m'en faire part. Si laissé à 1, il n'y a aucun problème.

Code : Tout sélectionner

#include<gdiplus.au3>

; Func PngGuiCreatePic($src, $x, $y, $scale = 1, $alt = "",$gdi = 1)
Func PngGuiCreatePic($src, $x, $y, $scale = 1, $alt = "")
    Local $gdi_state = $ghGDIPDll
    If $ghGDIPDll = 0 Then _GDIPlus_Startup()
    $hImage2 = _GDIPlus_ImageLoadFromFile($src)
    $ImageHeight = (_GDIPlus_ImageGetHeight($hImage2)) * $scale
    $ImageWidth = (_GDIPlus_ImageGetWidth($hImage2)) * $scale

    If $scale <> 1 Then
        $hBitmap = _WinAPI_CreateBitmap($ImageWidth, $ImageHeight, 1, 32)
        $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
        $hgraphic = _GDIPlus_ImageGetGraphicsContext($hImage1)
        _GDIPlus_GraphicsDrawImageRect($hgraphic, $hImage2, 0, 0, $ImageWidth, $ImageHeight)
        $hBitmap2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage1)
        _WinAPI_DeleteObject($hBitmap)
        _GDIPlus_ImageDispose($hImage1)
        _GDIPlus_GraphicsDispose($hgraphic)
    Else
        Local _
                $hBitmap = _GDIPlus_BitmapCreateFromFile($src), _
                $hBitmap2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
        _GDIPlus_BitmapDispose($hBitmap)


    EndIf

    $pic = GUICtrlCreatePic("", $x, $y, $ImageWidth, $ImageHeight)
    If $alt <> "" Then GUICtrlSetTip($pic, $alt)
    GUICtrlSendMsg($pic, 0x0172, 0, $hBitmap2)
If $gdi_state = 0 Then _GDIPlus_Shutdown()
    Return $pic
EndFunc   ;==>PngGuiCreatePic
 
Le Sage Pourpre, pour qui la vie est tellement
plus belle vue du haut de son Pouf = )
Avatar du membre
Narmeke
Niveau 6
Niveau 6
Messages : 247
Enregistré le : mer. 28 oct. 2009 11:31
Localisation : Libourne
Status : Hors ligne

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

#2

Message par Narmeke »

Super, à tester ! :lol:
SagePourpre
Niveau 7
Niveau 7
Messages : 442
Enregistré le : dim. 06 juil. 2008 09:11
Status : Hors ligne

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

#3

Message par SagePourpre »

À noter :

Si l'image a de la transparence et que le paramètre $scale <> 1,
la transparence sera remplacée par un fond noir. (À ce moment, il vaut mieux
modifier la taille de l'image à utiliser plutôt que de toucher à ce paramètre.
Le Sage Pourpre, pour qui la vie est tellement
plus belle vue du haut de son Pouf = )
Serge63
Niveau 4
Niveau 4
Messages : 71
Enregistré le : lun. 22 juin 2009 14:54
Localisation : Clermont-ferrand
Status : Hors ligne

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

#4

Message par Serge63 »

Merci et bravo pour cette UDF, c'est exactement ce dont j'avais besoin
SagePourpre
Niveau 7
Niveau 7
Messages : 442
Enregistré le : dim. 06 juil. 2008 09:11
Status : Hors ligne

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

#5

Message par SagePourpre »

14 juillet 2010
Fonction améliorée par l'ajout de la gestion automatique de gdiplus.
Le Sage Pourpre, pour qui la vie est tellement
plus belle vue du haut de son Pouf = )
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

#6

Message par matwachich »

N'est elle pas mieux comme cela! (J'ai mis ; ### juste devant les modifications)

Code : Tout sélectionner

#include-once
#include <GDIPlus.au3>

Func PngGuiCreatePic($src, $x, $y, $w = -1, $h = -1, $alt = "")
    Local $gdi_state = $ghGDIPDll

If $ghGDIPDll = 0 Then _GDIPlus_Startup()

    $hImage2 = _GDIPlus_ImageLoadFromFile($src)

    If $w <> -1 Or $h <> -1 Then
        $ImageHeight = $h ; ###
        $ImageWidth = $w ; ###

        $hBitmap = _WinAPI_CreateBitmap($ImageWidth, $ImageHeight, 1, 32)
        $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
        $hgraphic = _GDIPlus_ImageGetGraphicsContext($hImage1)

        _GDIPlus_GraphicsDrawImageRect($hgraphic, $hImage2, 0, 0, $ImageWidth, $ImageHeight)
        $hBitmap2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage1)

        _WinAPI_DeleteObject($hBitmap)
        _GDIPlus_ImageDispose($hImage1)
        _GDIPlus_GraphicsDispose($hgraphic)
    Else
        $ImageHeight = _GDIPlus_ImageGetHeight($hImage2) ; ###
        $ImageWidth = _GDIPlus_ImageGetWidth($hImage2) ; ###

        Local $hBitmap, $hBitmap2
        $hBitmap = _GDIPlus_BitmapCreateFromFile($src)
        $hBitmap2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
        _GDIPlus_BitmapDispose($hBitmap)
    EndIf

    $pic = GUICtrlCreatePic("", $x, $y, $ImageWidth, $ImageHeight)
    If $alt <> "" Then GUICtrlSetTip($pic, $alt)
    GUICtrlSendMsg($pic, 0x0172, 0, $hBitmap2)

If $gdi_state = 0 Then _GDIPlus_Shutdown()

    Return $pic
EndFunc   ;==>PngGuiCreatePic
Comment gérer la transparence si on donne une taille différente à l'image!???
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

#7

Message par pierrotm777 »

Ca fonctionne , mais je me retrouve avec un fond noir .
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

#8

Message par matwachich »

Tu as un fond noir quand tu redimensionne l'image, pour ne pas faire cela, tu mets $w et $h à -1 (par défaut), c'est équivalent à un $scale à 1

J'ai changer la méthode du scale pour la taille directement car je pense que c'est plus pratique pour bien faire coller précisement une image dans un GUI.

Je cherche toujours pour la transparence, si quelqu'un à une réponse...
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

#9

Message par pierrotm777 »

C'est parfait pour moi , j'ai juste reduit mes images à la taille que je souhaitais ce qui me permet de conserver w=-1 et h=-1.

Comment faire pour cacher l'image afficher , avec une image vide ?

Avec cette ligne:
$Pic = PngGuiCreatePic(@ScriptDir&"\pictures\30.png", 560, 0, -1, -1, $alt = "IMAGE")

Je ne vois aucun tooltip s'afficher!

Merci pour cette fonction trés sympa !
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

#10

Message par pierrotm777 »

Serait il possible de modifier cette fonction afin de pouvoir afficher une image avec une rotation de 0 à 359° ?

Merci
SagePourpre
Niveau 7
Niveau 7
Messages : 442
Enregistré le : dim. 06 juil. 2008 09:11
Status : Hors ligne

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

#11

Message par SagePourpre »

@matwachich

J'avais pensé à le faire comme ça en premier mais j'ai choisi "scale" afin de pouvoir modifier la taille de l'image
facilement sans perdre les proportions (et sans avoir à faire les calculs manuellement).

Ceci dit, utiliser $w et $h au lieu de $scale est une alternative tout à fait valable.


@Pierrotm777


Tu as mis $alt="IMAGE" essaie avec seulement "IMAGE" et ça devrait fonctionner.
Le Sage Pourpre, pour qui la vie est tellement
plus belle vue du haut de son Pouf = )
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

#12

Message par matwachich »

Ok j'attend!
Et si t'as un truc pour la transparence...
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
SagePourpre
Niveau 7
Niveau 7
Messages : 442
Enregistré le : dim. 06 juil. 2008 09:11
Status : Hors ligne

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

#13

Message par SagePourpre »

Je vais voir ce que je peux faire.

J'ai bien une idée pour la transparence.

Un autre de mes projets (duquel cette fonction a été créée) permet d'ajuster la
transparence d'une image servant de GUI.

Cependant, l'UDF n'étant plus à jour et comportant quelques failles toujours non-réglées...
J'essaierai de voir si je peux arriver à un résultat satisfaisant dès que j'aurai le temps.


Pour faire une rotation, le moyen le plus simple serait la mise en application de _GDIPlus_MatrixRotate().
Mes études ne me laisse pas vraiment de temps pour autoit de ces jours-ci mais si je parviens à un résultat,
je le publierai ici.
Le Sage Pourpre, pour qui la vie est tellement
plus belle vue du haut de son Pouf = )
Percival
Niveau 1
Niveau 1
Messages : 6
Enregistré le : dim. 03 oct. 2010 00:32
Status : Hors ligne

Re: [Func] GuiCtrlCreatePic avec tous formats d'images

#14

Message par Percival »

Bonjour, cela fait 4 jours que j'essaye d'ajouter la fonction _GDIPlus_MatrixRotate() mais sans succès, à chaque fois, soit l'image ne s'affiche pas ou un rectangle noir s'affiche. J'utilise une version "lite" car plus simple a modifier. voici le code que j'utilise actuellement.

Code : Tout sélectionner

Func PngGuiCreatePic($src, $x, $y, $nAngle = 90)    
    $nAngle = 90
  
  $nW = 14
  $nH = 18
  
  _GDIPlus_Startup()
    $hImage1 = _GDIPlus_ImageLoadFromFile($src)
    $hGraphic1 = _GDIPlus_ImageGetGraphicsContext($hImage1)
    $hImage2 = _GDIPlus_BitmapCreateFromGraphics($nW,$nH,$hGraphic1)
    $hGraphic2 = _GDIPlus_ImageGetGraphicsContext($hImage2)

    $matrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixRotate($matrix, 90)
    _GDIPlus_GraphicsSetTransform($hGraphic2, $matrix)
    _GDIPlus_GraphicsDrawImage($hGraphic2, $hImage1, 0, -$nW)

    $pic = GUICtrlCreatePic("", ($x - ($nW / 2)), ($y - ($nH / 2)), $nW, $nH)
    
    Local _
        $hBitmap = _GDIPlus_BitmapCreateFromGraphics($nW, $nH, $hGraphic2)
        $hBitmap2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    
    _WinAPI_DeleteObject(GUICtrlSendMsg($pic, 0x0172, 0, $hBitmap2))

    _GDIPlus_MatrixDispose($matrix)
    _GDIPlus_GraphicsDispose($hGraphic1)
    _GDIPlus_GraphicsDispose($hGraphic2)
    _GDIPlus_ImageDispose($hImage1)
    _GDIPlus_ImageDispose($hImage2)
  
    _GDIPlus_Shutdown()
    Return $pic
EndFunc   ;==>PngGuiCreatePic
Répondre