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 :

Fusionner des images PNG transparentes [WD18]


Sujet :

WinDev

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Points : 45
    Points
    45
    Par défaut Fusionner des images PNG transparentes
    Bonjour,

    Je reviens vers vous pour un problème sur lequel je bute depuis quelques jours. J'ai essayé pas mal de choses mais je ne parviens pas à obtenir le résultat souhaité.

    J'ai plusieurs PNG destinés à être assemblés dynamiquement.

    Voici des exemples d'images servant à construire l'image finale :







    Et voici un exemple d'image finale :



    J'ai regardé du côté de dImageCopie, de dFusionne et même fait des tests avec les fonctions dDessin mais je n'arrive pas à obtenir le résultat final escompté.

    Merci d'avance à celui qui saura trouver la bonne méthode pour le faire (si c'est possible).

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Vous devez utiliser une librairie graphique qui gère le canal alpha.

    Ou utiliser GDIPLUS et fabriquer une image composée en mémoire (dans un DIB mémoire 32-bit) puis copier le tout dans le champ image WinDev en utilisant le DC du champ image.

    ...

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Exemple de librairie graphique gérant la transparence (démos écrites en 2009)

    http://forum.pcsoft.fr/fr-FR/pcsoft....40473/read.awp

    ...

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Points : 45
    Points
    45
    Par défaut
    Ah, impossible donc de le faire nativement avec WinDev ?

    Dans ce cas, je pourrais peut-être utiliser imagemagick et notamment le "composite" mais cela m'obligerait à fabriquer et enregistrer mes images à l'avance et non à le faire dynamiquement.

    Je suis débutant, j'essaie d'apprendre donc la solution GDIPLUS me semble bien compliquée.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Ah, impossible donc de le faire nativement avec WinDev ?
    Je ne pense pas.

    J'ai fait rapidement un projet GDImage, qui utilise le concept des images composées.
    Les images sont superposées comme dans PhotoShop.
    L'image résultante est enregistrée dans le dossier EXE pour vous permettre de l'intégrer à la volée dans un champ image.

    Voici le code WinDev
    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
    Obj is array dynamic of 3 ZOBJECT
    nW, nH, nUseW, nUseH is int
    sFileName is string
     
    sFileName = ExePath() + "1.png"
    hBitmap is system int = ZI_CreateBitmapFromFile(sFileName, nW, nH)
    IF (hBitmap) THEN
        ZI_CreateBitmapObject(Obj[1], 104, 0, hBitmap, ZD_ARGB(255, 0, 0, 0), ZS_VISIBLE)
     
        sFileName = ExePath() + "2.png"; hBitmap = ZI_CreateBitmapFromFile(sFileName, nUseW, nUseH)
        IF (hBitmap) THEN
            ZI_CreateBitmapObject(Obj[2], 0, 0, hBitmap, ZD_ARGB(255, 0, 0, 0), ZS_VISIBLE)
     
            sFileName = ExePath() + "3.png"; hBitmap = ZI_CreateBitmapFromFile(sFileName, nW, nH)
            IF (hBitmap) THEN
                ZI_CreateBitmapObject(Obj[3], 189, 6, hBitmap, ZD_ARGB(255, 0, 0, 0), ZS_VISIBLE)
     
                //ZI_CreateImageComposited(ExePath() + "compo.png", nUseW, nUseH, Obj)
                hBitmap = ZI_CreateImageComposited("", nUseW, nUseH, Obj)
                IF (hBitmap) THEN
                    sFileName = ExePath() + "compo.png"
                    ZI_SaveBitmapToFile(sFileName, hBitmap, 0)
                    IMG_Result = sFileName
                END
     
            END
        END
    END
    Le projet du ZIP joint est en WD17.

    ...
    Fichiers attachés Fichiers attachés

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Points : 45
    Points
    45
    Par défaut
    I've tried your Poject and it works as intended. BUT... My project will be free and i won't recieve money for it so i can't spend 450€ to get the registered dll...

    I'm a bit disappointed as it really does what i want and it's simple to add in my project.

    EDIT : oh, ce n'est pas gênant puisque le splash n’apparaît qu'une seule fois. Je n'ai quà générer toutes mes images comme ça mes utilisateurs ne seront pas génés par un popup à chaque génération dynamique. Merci beaucoup !

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Something very important i forgot to do in the quick example.

    You must use the GDI32 API DeleteObject(hBitmap) after the composited image has been saved with ZI_SaveBitmapToFile(sFileName, hBitmap, 0).
    Failing to do this, would cause a memory leak (fuite de mémoire)

    ...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Points : 45
    Points
    45
    Par défaut
    Petit HS : je viens de voir que j'avais répondu en partie en anglais... C'est ça de faire deux choses en même temps. Désolé ^^

    C'est noté pour la fuite de mémoire, je vais supprimer l'objet après sauvegarde. Enfin je vais essayer, je n'ai pas l'habitude d'utiliser les API.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Voici la procédure qui encapsule l'API DeleteObject du GDI32

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PROCEDURE DeleteObject(nObject is int)
    IF nObject THEN API("GDI32", "DeleteObject", nObject); nObject = 0
    et voici la procédure WinDev modifiée pour l'utiliser correctement.
    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
    Obj is array of 3 ZOBJECT
    nW, nH, nUseW, nUseH is int
    sFileName is string
    
    sFileName = ExePath() + "1.png"
    hBitmap is system int = ZI_CreateBitmapFromFile(sFileName, nW, nH)
    IF (hBitmap) THEN
        ZI_CreateBitmapObject(Obj[1], 104, 0, hBitmap, ZD_ARGB(255, 0, 0, 0), ZS_VISIBLE)
        
        sFileName = ExePath() + "2.png";  hBitmap = ZI_CreateBitmapFromFile(sFileName, nUseW, nUseH)
        IF (hBitmap) THEN
            ZI_CreateBitmapObject(Obj[2], 0, 0, hBitmap, ZD_ARGB(255, 0, 0, 0), ZS_VISIBLE)
           
            sFileName = ExePath() + "3.png"; hBitmap = ZI_CreateBitmapFromFile(sFileName, nW, nH)
            IF (hBitmap) THEN
                ZI_CreateBitmapObject(Obj[3], 189, 6, hBitmap, ZD_ARGB(255, 0, 0, 0), ZS_VISIBLE)
              
                //ZI_CreateImageComposited(ExePath() + "compo.png", nUseW, nUseH, Obj)
                hBitmap = ZI_CreateImageComposited("", nUseW, nUseH, Obj)
                IF (hBitmap) THEN
                    sFileName = ExePath() + "compo.png"
                    ZI_SaveBitmapToFile(sFileName, hBitmap, 0)
                    DeleteObject(hBitmap)
                    IMG_Result = sFileName
                END
           
            END
        END
    END

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Points : 45
    Points
    45
    Par défaut
    Merci c'est impeccable

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Points : 45
    Points
    45
    Par défaut
    Bonjour,

    Après être passé sous Windev 20, j'ai finalement trouvé une solution pour faire ce que je souhaitais sans l'aide de la DLL (que j'utilisais jusque là) :

    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
    		LIB_Progress = "Processing image "+ Carte.ImageCarte
    		i est entier = 0
    		POUR i = 0 A 9
    			nOpacité est entier = 255
    			SI i = 0 ALORS
    				nOpacité = 128
    			FIN
    			ImageFond est une Image = ExePath + "images" + ["\"] + "frame-vierge.png"
    			ImageCountMana est une Image = ExePath + "images" + ["\"] + "frame" + Carte.CoutMana + ".png"
    			ImageCarte est une Image = ExePath + "images" + ["\"] + Carte.ImageCarte + ".png"
    			ImageCountBox est une Image
    			SI i < 2 ET Carte.Rarete = "Legendary" ALORS
    				ImageCountBox = ExePath + "images" + ["\"] + "legendary.png"
    			SINON
    				ImageCountBox = ExePath + "images" + ["\"] + "countbox-" + i + ".png"
    			FIN
    			dDébutDessin(ImageFond,dAvecOpacité)
    			dCopie(ImageCarte,ImageFond,110,0,118,35,101,0,110,35)
    			dCopie(ImageCountMana,ImageFond,0,0,218,35)
    			dCopie(ImageCountBox,ImageFond,190,6,25,24,190,6,25,24)
    			SI i = 0 ALORS
    				dModifieOpacité(ImageFond, 50)
    			FIN
    			dSauveImagePNG(ImageFond,ExePath + "images" + ["\"] + Carte.ImageCarte + "-" + i + ".png",iTransparent)
    			dFinDessin(ImageFond)
    		FIN
    Cela rend le tout compatible avec Linux du coup, si je ne me trompe pas.

    Un détail : il ne faut pas que la couleur de fond soit enregistrée dans le PNG (donc sous Gimp, lors de l'export en PNG, on décoche "Save background color") sinon la transparence n'est pas bien gérée par Windev.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fusionner des images PNG ?
    Par BobaL dans le forum Langage
    Réponses: 2
    Dernier message: 26/07/2012, 22h58
  2. Transparence des images PNG sous Internet Explorer
    Par Torpedox dans le forum Webdesign & Ergonomie
    Réponses: 12
    Dernier message: 14/10/2008, 23h41
  3. Charger des images PNG
    Par McBlender dans le forum Développement 2D, 3D et Jeux
    Réponses: 14
    Dernier message: 23/01/2008, 20h41
  4. Comment utiliser usemap sur une image png transparente
    Par master_kb2 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 03/01/2008, 14h00
  5. Où trouver des images PNG pour une application ?
    Par Pythonesque dans le forum Imagerie
    Réponses: 5
    Dernier message: 10/07/2007, 14h44

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