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. #21
    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 Nullosse Voir le message
    il faut rajouter les assemblages .NET suivant dans ton projet
    Menu: Atelier->.NET->Utiliser un assemblage .NET dans ce projet
    mscorlib
    System.Drawing
    Donc ce n'est pas GDI ?

  2. #22
    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
    Je viens de constater 2 choses :
    - L'algo de redimensionnement HQ dans WD18 est légèrement meilleur que dans WD15.
    - Le HQ dans WD15 ne s'active pas sur une image avec de la transparence comme celle-ci.

    Je suis étonné de ça.

    Sinon, System.Drawing est une surcouche à GDI+.

  3. #23
    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
    2 choses :
    - L'algo de redimensionnement HQ dans WD18 est légèrement meilleur que dans WD15.
    - Le HQ dans WD15 ne s'active pas sur une image avec de la transparence comme celle-ci.

    Je suis étonné de ça.

    Sinon, System.Drawing est une surcouche à GDI+.
    Ok... Bon ben je vais devoir passer par l'assemblage .Net alors.

    Je test çà et je vous tiens au courant

    Merci beaucoup pour votre aide !

  4. #24
    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
    Une remarque hors sujet en passant : je lis beaucoup sur ce forum le mot "çà".
    C'est "ça".
    On écrit "çà" uniquement dans "çà et là", où ce n'est pas du tout le même mot.
    Ça me démangeait...

  5. #25
    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
    Une remarque hors sujet en passant : je lis beaucoup sur ce forum le mot "çà".
    C'est "ça".
    On écrit "çà" uniquement dans "çà et là", où ce n'est pas du tout le même mot.
    Ça me démangeait...
    Oui je sais bien, mais j'ai pris une mauvaise habitude lol

  6. #26
    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
    J'ai le framework .Net 4 sur mon pc mais il faut obligatoirement le 4.5 ? Car il à l'air de ne fonctionner qu'à partir de Windows 7 SP1... Et je voudrais que ça fonctionne aussi sous XP.

    Par ailleurs, même avec le Framework installé sur mon pc, dans Windev lors de l'ajout d'un assemblage .Net, il ne trouve pas System.Drawing ni mscorlib...

    Il faut un pack développeur ?

    Merci

  7. #27
    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
    non non pas de besoin de pack développeur,
    même un dotnet 2.0 devrait suffire. C'est bizarre que tu ne vois pas System.Drawing et surtout mscorlib. Que vois-tu comme assemblages ?
    Quelle version de windev as-tu ? sous quel O.S es-tu ? 32 bits , 64 bits ? projet 32 bits , 64 bits ?

    moi je suis sous Windows 7 SP 1, Windev 16 , dotnet 3.5.

  8. #28
    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 Nullosse Voir le message
    non non pas de besoin de pack développeur,
    même un dotnet 2.0 devrait suffire. C'est bizarre que tu ne vois pas System.Drawing et surtout mscorlib. Que vois-tu comme assemblages ?
    Quelle version de windev as-tu ? sous quel O.S es-tu ? 32 bits , 64 bits ? projet 32 bits , 64 bits ?

    moi je suis sous Windows 7 SP 1, Windev 16 , dotnet 3.5.
    Je viens d'installer la version 4.5 et j'ai maintenant les assemblages qui apparaissent

  9. #29
    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
    Donc dans ton code, on sert de System.Drawing et de l'api GDI à ce que je vois ?

    Et ça se passe donc en 3 étapes ?

    EDIT :

    Je remarque que c'est un bitmap et non du png et donc on perd la transparence de fond

    Impossible de gérer la transparence en restant dans le format d'origine ?

    De plus, l'image redimensionnée est un peu "coupée" sur les bords :s

    Merci

  10. #30
    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
    Vous pensez qu'en utilisant ceci : System.Drawing.Imaging.Imageformat.Png

    http://msdn.microsoft.com/fr-fr/libr...v=vs.110).aspx

    Au lieu de System.Drawing.Bitmap pour avoir la gestion de la transparence ?

  11. #31
    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
    hello,
    voici comment gérer la transparence pour ton Logo. J'ai récupéré ton logo original. Le premier pixel de ton logo est transparent. On va utiliser ceci dans les champs image. Mettre la propriété Transparence à point-haut gauche dans les champs Image.
    Dans mon projet j'ai rajouté un champ image (image5). Pour "copier" la transparence j'utilise la fonction GdiTransparentBlt. Celle-ci a besoin de la couleur de transparence. Je récupère cette couleur en lisant le premier pixel. Et voici ce que cela donne en code (le code de l'image 4 y est aussi pour montrer les différences) :
    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
    dcimg3 est un entier = dDébutDessin(Image4)
    hdcCompatible3 est un entier = API("gdi32","CreateCompatibleDC",dcimg3) 
    obj est un entier = 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)
    API("gdi32","DeleteObject",obj)
    API("gdi32","DeleteDC",hdcCompatible3)
     
     
    dcimg4 est un entier = dDébutDessin(Image5)
    hdcCompatible4 est un entier = API("gdi32","CreateCompatibleDC",dcimg4) 
    obj = API("gdi32","SelectObject",hdcCompatible4,Superbitmap.GetHbitmap()) 
    // récupération de la couleur du premier pixel  pour la transparence
    TransparentColor est un entier = API("gdi32","GetPixel",hdcCompatible4 ,0,0)
    API("gdi32","GdiTransparentBlt",dcimg4,0,0,Image5..Largeur,Image5..Hauteur,hdcCompatible4,0,0,
    Image5..Largeur,Image5..Hauteur, TransparentColor)
    API("user32","InvalidateRgn",Handle(Image5),0,True)
    // libération des objets, contextes , bitmaps
    API("gdi32","DeleteObject",obj)
    API("gdi32","DeleteDC",hdcCompatible4)
    bitmapNouveau.Dispose()
    bitmapOriginal.Dispose()
    Superbitmap.Dispose()
    A noter la libération mémoire par rapport à l'ancien code

    En pièce jointe ce que cela donne avec un fond de fenêtre orange. On voit la transparence sur l'image originale et sur l'image 5

    Amicalement, nullosse
    Images attachées Images attachées  

  12. #32
    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 gérer correctement le canal alpha, c'est à dire même la semi-transparence, il vaut mieux utiliser GDI+. Là vous utilisez GDI tout court.
    Avec System.Drawing ça devrait pas être compliqué.

    Pour transférer l'image sans faire un dDébutDessin + du GDI, contentez-vous de la sauvegarder dans un PNG en mémoire (dans un buffer) et de la passer au champ image.

    Dans le code ci-dessus, vous utilisez une colorkey, ce qui rend inutile l'usage de GDI, puisque WD15 sait redimensionner une image avec ce type de transparence en HQ.

  13. #33
    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
    Pour gérer correctement le canal alpha, c'est à dire même la semi-transparence, il vaut mieux utiliser GDI+. Là vous utilisez GDI tout court.
    Avec System.Drawing ça devrait pas être compliqué.

    Pour transférer l'image sans faire un dDébutDessin + du GDI, contentez-vous de la sauvegarder dans un PNG en mémoire (dans un buffer) et de la passer au champ image.

    Dans le code ci-dessus, vous utilisez une colorkey, ce qui rend inutile l'usage de GDI, puisque WD15 sait redimensionner une image avec ce type de transparence en HQ.
    Merci pour votre aide encore, mais... tout ça deviens un peu compliqué pour moi

  14. #34
    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
    bonjour,
    heu! dite-moi monsieur Hibernatus, comment faites-vous ceci :
    et de la passer au champ image.
    j'arrive à faire la première partie comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mem est un MemoryStream
    Superbitmap.Save(mem,ImageFormat.Png)
    le problème, c'est que je n'arrive pas à récupérer un buffer à partir de la memorystream pour l'affecter au champ image.
    Je peux seulement récupérer un tableau d'octets ( mem.ToArray())
    comment transformer ce tableau d'octets en buffer ? (sans passer par transfert)
    sinon en passant par un fichier cela marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Superbitmap.Save("test.png",ImageFormat.Png)
    image2 = "test.png"
    Amicalement, nullosse

  15. #35
    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
    La sauvegarde de l'image me conviens parfaitement donc cela pourrais fonctionner ?

    Merci

  16. #36
    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
    sinon pour copier la semi-transparence il faut utiliser gdialphablend au lieu de bitblt :
    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
    dcimg4 est un entier = dDébutDessin(Image5)
    hdcCompatible4 est un entier = API("gdi32","CreateCompatibleDC",dcimg4) 
    obj = API("gdi32","SelectObject",hdcCompatible4,Superbitmap.GetHbitmap(Color.Black)) 
     
    blendfunc est une  structure 
    	BlendOp est un octet 
    	BlendFlags est un octet
    	SourceConstantAlpha est un octet
    	AlphaFormat est un octet
    FIN
    monblendfunc est un blendfunc
    monblendfunc.BlendOp = 0
    monblendfunc.BlendFlags = 0
    monblendfunc.SourceConstantAlpha = 255 
    monblendfunc.AlphaFormat = 1
     
    API("gdi32","GdiAlphaBlend",dcimg4,0,0,Image5..Largeur,Image5..Hauteur,hdcCompatible4,0,0,
    Image5..Largeur,Image5..Hauteur, monblendfunc)
     
    API("user32","InvalidateRgn",Handle(Image5),0,True)
     
    // libération des objets, contextes , bitmaps
    API("gdi32","DeleteObject",obj)
    API("gdi32","DeleteDC",hdcCompatible4)
    bitmapNouveau.Dispose()
    bitmapOriginal.Dispose()
    Superbitmap.Dispose()
    en jouant sur le paramètre SourceConstantAlpha on peut même rajouter un effet de transparence de la totalité de l'image
    SourceConstantAlpha = 0 -> image complètement transparente (on ne la voit plus )
    SourceConstantAlpha = 128 -> image à moitié transparente

  17. #37
    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
    Citation Envoyé par WDKyle Voir le message
    La sauvegarde de l'image me conviens parfaitement donc cela pourrais fonctionner ?

    Merci

    oui bien sur mais cela fait une écriture fichier

  18. #38
    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
    Mais... Je ne vois plus l'utilisation de System.Drawing dans ton code, c'est normal ?

  19. #39
    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
    Citation Envoyé par WDKyle Voir le message
    Mais... Je ne vois plus l'utilisation de System.Drawing dans ton code, c'est normal ?
    c'est parce que je n'ai pas mis le code complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Superbitmap est un "System.Drawing.Bitmap" dynamique =... 
     allouer un "System.Drawing.Bitmap"(Image5..Largeur, Image5..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, Image5..Largeur,Image5..Hauteur )
    .....
    .....
    en pièce jointe ce que cela donne ( voir transition image - transparence)
    Images attachées Images attachées  

  20. #40
    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
    D'accord, merci

    Je vais tenter d’accommoder tes codes dans mon appli, si j'ai un soucis, je reviens ici

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