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 :

Redimensionnement d'images GDI+


Sujet :

WinDev

  1. #1
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut Redimensionnement d'images GDI+
    Bonsoir,

    Je cherche, en vain, des posts sur le redimensionnement d'images avec GDI+.

    J'ai trouvé une doc sur le site de Microsoft mais j'en pige pas le moindre mot

    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

    Avez-vous déjà mis en place un système de redimensionnement d'image assez propre avec GDI ou autre svp ? Les fonctions d'image de Windev sont vraiment médiocre de ce coté

    Merci.

  2. #2
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Tu veux redimensionner des images pour :

    1) les enregistrer à nouveau dans la nouvelle taille
    2) les afficher

    Si c'est (1), je ne pense pas que GDI+ soit la solution. GDI+ est une API pour dessiner sur une surface (écran). Ce n'est pas une librairie de manipulation d'image, du moins à ma connaissance.

    Si c'est (2), pourquoi les fonctionnalités de Windev ne te suffise pas, que cherches tu à faire que Windev ne propose pas ?

    Essaye de préciser un peu tes besoins, il sera peut être plus facile de répondre
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  3. #3
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Bonjour,

    Je souhaite simplement redimensionner des images en respectant des proportions et que cela soit propre. Les fonctions de redimensionnement de Windev ne sont pas du tout propre, c'est pour cela que je pensais que m'orienter vers GDI était une bonne solution... Un peu comme la bibliothèque GD en php.

  4. #4
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    3 possibilités :
    - Utiliser la flat API via API().
    - Utiliser la version .Net directement.
    - Utiliser l'API C++ dans une DLL et utiliser cette DLL.

    Personnellement j'ai uniquement utilisé la 3ème solution, qui ne vous conviendra probablement pas.

    GDI+ permet de manipuler des images en mémoire et de les enregistrer.

    Pour redimensionner proprement dans WinDev, il ne faut pas oublier l'option "HQ" (haute qualité). Dans dRedimensionne, c'est drHauteQualité, mais cette option existe aussi sur les champs images.

  5. #5
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Citation Envoyé par Hibernatus34 Voir le message
    3 possibilités :
    - Utiliser la flat API via API().
    - Utiliser la version .Net directement.
    - Utiliser l'API C++ dans une DLL et utiliser cette DLL.

    Personnellement j'ai uniquement utilisé la 3ème solution, qui ne vous conviendra probablement pas.

    GDI+ permet de manipuler des images en mémoire et de les enregistrer.

    Pour redimensionner proprement dans WinDev, il ne faut pas oublier l'option "HQ" (haute qualité). Dans dRedimensionne, c'est drHauteQualité, mais cette option existe aussi sur les champs images.
    Si elle pourrais me convenir, on est pas obligé d'enregistrer les images à la fin ? Impossible de simplement les afficher dans un champ image non ?

    Même avec l'option HQ, cela reste détérioré comparé à ce que fais GD en php

  6. #6
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    Pour afficher une image mémoire dans un champ image, j'en fais un PNG mémoire.
    L'option HQ fait de la bonne qualité, je ne vois pas bien où est le problème.

  7. #7
    Membre chevronné Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 881
    Points : 1 771
    Points
    1 771
    Par défaut
    Si c'est juste pour redimensionner une image il y a la fonction dRedimensionne()
    Bon dev
    Laurent

    - C’est génial.
    - Non c’est bizarre.
    - Justement quand c’est simple y’a des milliers de réponses et quand c’est bizarre y’en a aucune.

  8. #8
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Aurais tu un exemple d'image qui te pose problème au redimensionnement ?

    - L'image d'origine.
    - Copie d'écran de l'image redimensionner par tes soins.

    Cela nous permettrait peut être de faire des essais
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  9. #9
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Je ne peux pas utiliser la fonction dRedimensionne(), les options de qualité ne sont pas disponible sous WD16

    J'ai fais une capture avec un redimensionnement fait par Windev et le même en GD.

    Sous Windev, j'ai un champ image en Homothétique centré + HQ.

    La différence est flagrante quand même...

  10. #10
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Citation Envoyé par WDKyle Voir le message
    ...La différence est flagrante quand même...
    J'avoue :/

    Quitte a passer par une bibliothèque externe, je ne vois pas d'autre solution en Windev, autant essayer de passer par des appels au framework .net. windev permet de s'interfacer avec .net. Cela restera plus simple que d'appeler GDI+ directement.

    En .net ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                Bitmap myBitmap = new Bitmap(@"g:\temp\logo_clicable_Jan2012.png");
                Bitmap myBitmap2 = new Bitmap(myBitmap, new Size(55, 37));
                myBitmap2.Save(@"g:\temp\logo_clicable_Jan2012-1.png");
    permet de redimensionner une image en enregistrant le résultat sur le disque. En passant par du .net je ne pense pas que ce soit facile de convertir le bitmap .net en champ image windev, dans un premier temps passer par un fichier temporaire sur le disque me paraît plus simple.

    Je pense que ce code est transposable en Windev en intégrant la librairie System de .net dans windev.
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  11. #11
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    En windev ca doit donner quelque chose dans ce style (désolé pas de Windev sous la main)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    bitmapOriginal est un Bitmap dynamique = allouer un Bitmap("g:\temp\logo_clicable_Jan2012.png")
    bitmapNouveau est un Bitmap dynamique = allouer un Bitmap(bitmapOriginal, allouer un Size(55, 27))
    bitmapNouveau.Save("g:\temp\logo_clicable_Jan2012-1.png")
    [edit]Désolé du double post, trompé de bouton en voulant éditer le message.
    [autreEdit]Je ne suis pas sûr que la qualité que l'on va obtenir avec GDI+ soit bien meilleure que celle que fourni Windev (qui doit lui même s'apputer sur GDI+). La différence avec GD est sûrement du au fait que GD doit embarquer ces propres routines de redimensionnement, qui doivent être peut être plus orienté que qualité que rapidité.

    Si tu veux pas t'embêter avec le test avec .net, fait nous passer ton image originale et la résolution que tu veux obtenir, je te la converti par du code c# et te fais voir le résultat.
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  12. #12
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Merci pour ton aide DelphiManiac

    En fait, j'ai des logos qui devront être contenu dans des champs image de 135x58.

    Vous pouvez essayer avec logo joint

  13. #13
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    En 84x58, pour garder le ratio, ça donne ceci.
    Images attachées Images attachées  
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  14. #14
    Membre chevronné Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 881
    Points : 1 771
    Points
    1 771
    Par défaut
    C'est vrai que c'est plus propre
    Merci DelphiManiac...
    Bon dev
    Laurent

    - C’est génial.
    - Non c’est bizarre.
    - Justement quand c’est simple y’a des milliers de réponses et quand c’est bizarre y’en a aucune.

  15. #15
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Merci DelphiManiac, effectivement c'est bien plus propre comme cela c'est top !

    Tu as fait comment ? Avec le .Net ?

  16. #16
    Membre averti
    Profil pro
    au repos
    Inscrit en
    Février 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2013
    Messages : 156
    Points : 331
    Points
    331
    Par défaut
    Salut,
    voici du code vite fait sur le gaz, à la louche (à optimiser, ça manque cruellement de libération) :
    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
    sFichier est une chaîne = fSélecteurImage("", "", "Sélectionnez une image.....")
    InfoImage est une chaîne = InfoBitmap(sFichier)
    // IMG_Image1 est un champ Image
    Image1..Largeur = Val(ExtraitChaîne(InfoImage, 2))
    Image1..Hauteur = Val(ExtraitChaîne(InfoImage, 3))
    Image2..Largeur = Image1..Largeur/2
    Image2..Hauteur = Image1..Hauteur/2
    Image3..Largeur = Image2..Largeur
    Image3..Hauteur = Image2..Hauteur
    Image4..Largeur = Image2..Largeur
    Image4..Hauteur = Image2..Hauteur
    Image1 = sFichier
    bitmapOriginal est un "System.Drawing.Bitmap" dynamique = allouer un "System.Drawing.Bitmap"(sFichier)
    bitmapNouveau est un "System.Drawing.Bitmap" dynamique = allouer un "System.Drawing.Bitmap"(bitmapOriginal,
              allouer un Size(Image3..Largeur, Image3..Hauteur))
     
    Superbitmap est un "System.Drawing.Bitmap" dynamique =... 
     allouer un "System.Drawing.Bitmap"(Image3..Largeur, Image3..Hauteur)                                     
    MonGraphics est un Graphics dynamique = Graphics::FromImage(Superbitmap)
    MonGraphics.CompositingQuality = CompositingQuality.HighQuality
    MonGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic
    MonGraphics.SmoothingMode = SmoothingMode.HighQuality
    //draw the image into the target bitmap
    MonGraphics.DrawImage(bitmapOriginal, 0, 0, Image3..Largeur,Image3..Hauteur );
    dcimg est un entier = dDébutDessin(Image2)
    hdcCompatible est un entier = API("gdi32","CreateCompatibleDC",dcimg) 
    API("gdi32","SelectObject",hdcCompatible,bitmapOriginal.GetHBitmap())
    API("gdi32","StretchBlt",dcimg,0,0,Image2..Largeur,Image2..Hauteur,hdcCompatible,0,0,Image1..Largeur,Image1..Hauteur,0x00CC0020)
    // Rafraîchissement de l'image
    API("user32","InvalidateRgn",Handle(Image2),0,True)
    dcimg2 est un entier = dDébutDessin(Image3)
     hdcCompatible2 est un entier = API("gdi32","CreateCompatibleDC",dcimg2) 
    API("gdi32","SelectObject",hdcCompatible2,bitmapNouveau.GetHBitmap()) 
    API("gdi32","BitBlt",dcimg2,0,0,Image3..Largeur,Image3..Hauteur,hdcCompatible2,0,0,0x00CC0020)
    API("user32","InvalidateRgn",Handle(Image3),0,True)
     
    dcimg3 est un entier = dDébutDessin(Image4)
    hdcCompatible3 est un entier = API("gdi32","CreateCompatibleDC",dcimg3) 
    API("gdi32","SelectObject",hdcCompatible3,Superbitmap.GetHbitmap()) 
    API("gdi32","BitBlt",dcimg3,0,0,Image4..Largeur,Image4..Hauteur,hdcCompatible3,0,0,0x00CC0020)
    API("user32","InvalidateRgn",Handle(Image4),0,True)
    le résultat en pièce jointe
    Images attachées Images attachées  

  17. #17
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Merci pour ton aide Nullosse

    Il faut utiliser la version .Net de GDI avec ton code ?

    Merci

  18. #18
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    J'ai testé le redimensionnement HQ de WinDev avec une image énorme, et c'est de bonne qualité.
    L'exemple que vous donnez ne semble pas être en HQ, ou bien ça a bien changé depuis WD16...
    Avez-vous l'image d'origine pour nous permettre de tester ?

    J'ai testé avec ceci : http://baronnie.de.soligny.pagespers...o-sweet-fm.jpg
    Images attachées Images attachées  

  19. #19
    Membre averti
    Profil pro
    au repos
    Inscrit en
    Février 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2013
    Messages : 156
    Points : 331
    Points
    331
    Par défaut
    il faut rajouter les assemblages .NET suivant dans ton projet
    Menu: Atelier->.NET->Utiliser un assemblage .NET dans ce projet
    mscorlib
    System.Drawing

  20. #20
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Citation Envoyé par Hibernatus34 Voir le message
    J'ai testé le redimensionnement HQ de WinDev avec une image énorme, et c'est de bonne qualité.
    L'exemple que vous donnez ne semble pas être en HQ, ou bien ça a bien changé depuis WD16...
    Avez-vous l'image d'origine pour nous permettre de tester ?

    J'ai testé avec ceci : http://baronnie.de.soligny.pagespers...o-sweet-fm.jpg

    Effectivement, c'est très correct Tu as fais ça par programmation ou dans un champ image ?

    Voici le logo original : https://www.dropbox.com/s/h1x6jqf9np...EETFMTLM01.png

Discussions similaires

  1. [VB.NET] Redimensionner une image dans un PictureBox
    Par Monster77 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 05/04/2007, 18h24
  2. Redimensionner une image...
    Par RhaZieL dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 22/07/2005, 09h30
  3. [réglé][JSP - Resin] Redimensionnement d'images ...
    Par Claude Pelletier dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 24/03/2005, 18h47
  4. [VB.NET] Redimensionner une image proportionnelement
    Par Monster77 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 19/10/2004, 12h10
  5. [MX2004] redimensionner une image lors du chargement
    Par ouinouin dans le forum Flash
    Réponses: 8
    Dernier message: 18/02/2004, 18h32

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