IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

API GDI et GDI+ : copier une image PNG dans un champ image


Sujet :

WinDev

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut API GDI et GDI+ : copier une image PNG dans un champ image
    Bonjour,

    tout est dans le titre, je cherche à améliorer les temps d'affichage pour une application.

    Je dois copier plusieurs fichiers PNG avec effets de transparence dans un champ image.

    La fonction dcopieimage (option copieImage) fait ça relativement bien mais est lente. J'ai vu qu'il existait les DLL GDI et GDIPlus qui pourraient améliorer les performances.

    Je bute sur les notions de DC, BITMAP et autres ...

    Si quelqu'un avait un bout de code pour copier une petite image (80x80) dans une grande tout en conservant la transparence pour m'aider à comprendre le principe.

    Merci d'avance.

    Frog.

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Pour Raphael1980
    Salut,

    Donc pour Raphael1980 qui m'a contacté en MP mais qui à bloqué sur son compte l'envoi de MP :-)

    J'ai bien avancé sur l'utilisation du GDI+ dans windev ... mon problème majeur provenais du fait que j'avais commencé mes tests en windev10 (le projet sur lequel je travaillais étant en 10).

    Le fait de passer en 14 à grandement facilité les choses, il semblerait que la gestion des API par windev en 10 ne fonctionne pas tous le temps. Je n'ai pas pris la peine de tester en 11 ou en 12.

    Je vais un tour sur ce site pour récupérer des codes en VB (plus facile à convertir pour moi que du C ou du .NET que je ne souhaitais pas utiliser ... vu la façon dont c'est géré par windev :-) )

    Il y'a un site très sympa ou beaucoup de concepts sont expliqués : http://www.jose.it-berater.org/smffo...hp?board=277.0

    J'y ai trouvé de nombreuses expliquations ... un grand merci à son auteur. De plus il y'a beaucoup d'exemples en powerbasic dont le code se rapproche bien du wlanguage.

    Fred.

  3. #3
    Membre expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Points : 3 266
    Points
    3 266
    Par défaut
    Pas de soucis si tu te sens l'ame de nous écrire un tutoriel sur tes expériends GDI
    Emmanuel Lecoester
    => joomla addict.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Salut,

    Sans être un tuto, voici un exemple que j'ai collé ce jour à l'attention d'un contributeur.




    La première chose à faire est d'encapsuler les appels GDIPLUS.DLL

    Par exemple, l'ouverture de session GDI+ se fait par la fonction
    GdiplusStartup dont voici la déclaration en vb :

    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Declare Function GdiplusStartup Lib "gdiplus" (ByRef token As Long, 
    inputbuf As GdiplusStartupInput, Optional ByVal outputbuf As Long = 0) As 
    GpStatus
    En windev, cela donne ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PROCEDURE GdiplusStartup(token est entier, inputbuf est GdiplusStartupInput, 
    outputbuf est entier = 0)
    R est un entier = API(:MaDll,"GdiplusStartup",&token ,&inputbuf ,outputbuf)
    RENVOYER R
    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    GdiplusStartupInput est une structure
      GdiplusVersion est un entier
      DebugEventCallback est un entier
      SuppressBackgroundThread est un entier
      SuppressExternalCodecs est un entier
    FIN
    Si j'ai bien compris le principe (et ça à l'air de fonctionner) lorsque
    qu'une variable est définie en VB par ByRef, il faut passer le pointeur
    &Mavariable, lorsqu'elle est défini par ByVal il faut mettre la variable en
    direct.


    Pour l'initialisation du GDI cela donne donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    hGdipToken est un entier
    lpSI est GdiplusStartupInput
    HDC = SysrecupèreDC(handle("MonImage"))
     
    lpSI:GdiplusVersion = 1
    GdiplusStartup( hGdipToken, lpSI)
     
    // on crée un objet de type Graphic, issu de notre hDc
    si GdipCreateFromHDC(HDC, hTargetGraphics) = Gp_Ok alors
     
    FIN
    Pour l'insertion d'une image, voici une procédure qui crée le contexte GDI,
    charge le fichier image et le colle dans un champ image

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    PROCEDURE DrawImage(vsFilePath est une chaîne, vnTargetDC est un entier,Sx 
    est un entier, Sy est un entier, vnWidth, vnHeight, vnTransparency est un 
    réel sur 4 octets= 1, vnAngle est un réel sur 4 octets = 0,pConserveRation = 
    Vrai)
    hTargetGraphics est un entier
    hImage est un entier
    hImageAttr est un entier
    nWidth est un réel sur 4 octets
    nheight est réel sur 4 octets
    lpColorMatrix est GpColorMatrix
    lpSI est GdiplusStartupInput
    hGdipToken est un entier
    lpOrg est GpPointF
    // on allume GDI+
    // Il vaudrait mieux ne le FAIRE qu'une fois POUR toutes, au début, mais 
    ainsi, la FONCTION est directement réutilisable...
    // SI on n'Active/désactive PAS GDI+ comme il faut, QUAND il faut, vous 
    allez FAIRE crasher votre VB.
    lpSI:GdiplusVersion = 1
    GdiplusStartup( hGdipToken, lpSI)
     
    // on crée un objet de type Graphic, issu de notre hDc
    IF GdipCreateFromHDC(vnTargetDC, hTargetGraphics) = Gp_Ok THEN
     // Chargement de l'image (PNG/JPG/TIF/GIF/BMP...)
     // Toutes les chaînes sont a passer en UNICODE
     // on contrebalance la transformation que VB effectue lors des appels 
    API...
     IF GdipLoadImageFromFile(vsFilePath, hImage) = Gp_Ok THEN
      // on crée des attributs d'image.
      // C'est uniquement nécessaire ici POUR dessiner l'image en smi 
    transparence
      GdipCreateImageAttributes(hImageAttr)
     
      lpColorMatrix:m[1, 1] = 1
      lpColorMatrix:m[2, 2] = 1
      lpColorMatrix:m[3, 3] = 1
      lpColorMatrix:m[4, 4] = vnTransparency
      lpColorMatrix:m[5, 5] = 1
     FIN
     
     // on renseigne nos attributs (hImageAttr)
     GdipSetImageAttributesColorMatrix( hImageAttr, ColorAdjustTypeBitmap, True, 
    lpColorMatrix, lpColorMatrix, ColorMatrixFlagsSkipGrays)
     
     // on récupère les dimensions de l'image...
     IF GdipGetImageDimension(hImage, nWidth, nheight) = Gp_Ok THEN
    //   SI on ne passe PAS de Dimension (largeur OU hauteur),
    //   on n'effectue PAS de redimensionnement : on garde les dimensions de 
    l'image
      IF vnWidth = 0 THEN
       vnWidth = nWidth
      END
      IF vnHeight=0 THEN
       vnHeight = nheight
      END
     
      lpOrg:x = Sx
      lpOrg:y = Sy
     
      // on traduit les coordonnées en coordonnées du monde : orientée A vnAngle 
    degrés
    //  IF vnAngle <> 0 THEN
    //   GdipRotateWorldTransform( hTargetGraphics, vnAngle, MatrixOrderPrepend)
    //   GdipTransformPoints( hTargetGraphics, CoordinateSpaceWorld, 
    CoordinateSpaceDevice, lpOrg, 1)
    //  END
     
      // on dessine enfin notre image.
      // on aurait pu utiliser GdipDrawImage, OU GdipDrawImageRect, mais elles 
    ne permettent
      // PAS de prendre en compte les attributs (ici la transparence)
      lW est un entier = nWidth
      lh est un entier = nheight
      GdipDrawImageRectRectI( hTargetGraphics, hImage, lpOrg:x , lpOrg:y , 
    vnWidth, vnHeight, 0, 0, lW, lh,UnitPixel, hImageAttr)
     
     END
     
     // on détruit nos attributs d'image
     GdipDisposeImageAttributes (hImageAttr)
     
     // on libère l'image
     GdipDisposeImage( hImage)
    END
     
    // on détruit notre objet Graphic
    GdipDeleteGraphics (hTargetGraphics)
     
    GdiplusShutdown (hGdipToken)

    Voila, c'est le mieux que je peux faire. Une fois collé dans windev, les
    variables non déclaré sont les constantes que tu pourras trouver dans le SDK de GDI+ à télécharger sur microsoft.com.


    Dernière astuce, les chaines (comme le chemin et le nom de fichier) sont
    généralement passées en unicode,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    machaine est une chaine unicode = ansiversunicode(MonCheminFichier)
    Bon dev,

    Albert P.

Discussions similaires

  1. Insertion d'une image png dans une base de données
    Par smalldebian dans le forum Requêtes
    Réponses: 4
    Dernier message: 27/08/2009, 08h36
  2. Inclure une image png dans un composant personnalisé
    Par jv2759 dans le forum Débuter
    Réponses: 8
    Dernier message: 20/08/2009, 13h51
  3. [IE7] taille d'une image png (ancienne taille, nvlle image :s)
    Par djynwk dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/09/2007, 18h26
  4. Réponses: 1
    Dernier message: 25/07/2006, 09h16
  5. Mettre une image png dans un Timage
    Par Coussati dans le forum Composants VCL
    Réponses: 7
    Dernier message: 02/03/2006, 18h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo