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

 Delphi Discussion :

Resize d'un PNG avec transparence


Sujet :

Delphi

  1. #21
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2014
    Messages : 143
    Points : 60
    Points
    60
    Par défaut
    Merci pour ce lien, j'ai déjà essayé le SmoothResize mais malheureusement mon PNG est indexé et la fonction ne le gère pas. A moins qu'il soit possible de convertir un PNG indexé en non indexé ?

  2. #22
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2014
    Messages : 143
    Points : 60
    Points
    60
    Par défaut
    J'ai trouvé ce code : http://graphics32.org/news/newsgroup...rticle_id=6918

    Il permet d'ouvrir une image PNG, de la convertir en Bitmap32 puis de la sauver en PNG de nouveau.
    Les fonctions d'ouverture et de sauvegarde semblent fonctionner, mais je n'arrive pas à faire un resize de Bitmap32.
    Quelqu'un aurait déjà fait cela ?

  3. #23
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par NicCo Voir le message
    J'ai trouvé ce code : http://graphics32.org/news/newsgroup...rticle_id=6918

    Il permet d'ouvrir une image PNG, de la convertir en Bitmap32 puis de la sauver en PNG de nouveau.
    Les fonctions d'ouverture et de sauvegarde semblent fonctionner, mais je n'arrive pas à faire un resize de Bitmap32.
    Quelqu'un aurait déjà fait cela ?
    avec un Bitmap 32bits chargé dans un TImage tu peux faire ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TForm1.FormPaint(Sender: TObject);
    var
      BF: TBlendFunction;
    begin
      BF.BlendOp := AC_SRC_OVER;
      BF.BlendFlags := 0;
      BF.SourceConstantAlpha := 255;
      BF.AlphaFormat := AC_SRC_ALPHA;
      Windows.AlphaBlend(Canvas.Handle, 10, 10, Image1.Width div 2, Image1.Height, Image1.Picture.Bitmap.Canvas.Handle, 0, 0, Image1.Width, Image1.Height, BF);
    end;
    voici ce que ça donne en chargeant ton image PNG transformée en Bitmap 32 bits sous XnView
    Nom : Presse-papiers-1.png
Affichages : 354
Taille : 29,1 Ko
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #24
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2014
    Messages : 143
    Points : 60
    Points
    60
    Par défaut
    Merci pour cet exemple.
    Si j'ai bien compris tu as converti mon image d'exemple en bitmap32 sans delphi puis appliqué ta fonction ? Et on peut sauver le résultat en PNG ?

  5. #25
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    ben tu disais savoir le faire dans ton précédent message note que la fonction AlphaBlend fonctionne avec un hDC, donc un Canvas.Handle, elle devrait pouvoir fonctionner avec Bitmap32 voir même PNGImage pour peu qu'il fournisse un Canvas et son Handle.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #26
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2014
    Messages : 143
    Points : 60
    Points
    60
    Par défaut
    Oui je peux peut être réussir à faire ca
    Donc je viens d'essayer au plus simple, avec des PNGImage et l'AlphaBlend, il y a bien des Handle sur les PNGImage mais j'ai une erreur qui me dit que je ne peux pas dessiner sur le Canvas d'un PNGImage (même chose avec des PNGObject).
    Je vais tenter avec le Bitmap32 si j'arrive à faire quelque chose...

  7. #27
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2014
    Messages : 143
    Points : 60
    Points
    60
    Par défaut
    Bon en lisant la doc de Graphics32 j'ai pu avancer un peu.
    J'utilise donc le lien que j'ai donné dans mon post précédent et cette fonction (qui est en vrac donc à réaranger par la suite après les tests) :
    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
    procedure PNGExample;
    var  transparent: boolean;
          myBitmap,myBitmap2,myBitmap3: tBitmap32;
           R: TKernelResampler;
    begin
       myBitmap := TBitmap32.Create;
       myBitmap2 := TBitmap32.Create;
       myBitmap3 := TBitmap32.Create;
       transparent := true;
       if LoadPNGintoBitmap32 (MyBitmap, 'D:\Test\Output_0001.png', transparent)
       then begin
         if transparent then
         begin
           // add anything else that should be done if we a transparent PNG image...
           MyBitmap.DrawMode := dmBlend;
         end
         else
         begin
           MyBitmap.DrawMode := dmOpaque;
         end;
     
         MyBitmap2.Width:=2606;
         MyBitmap2.Height:=73;
     
         MyBitmap3.Width:=1303;
         MyBitmap3.Height:=73;
     
         MyBitmap2.Draw(0,0,myBitmap);
         MyBitmap2.Draw(1910,0,myBitmap);
     
         R := TKernelResampler.Create(MyBitmap2);
         R.Kernel := TLinearKernel.Create;
         MyBitmap3.Draw(MyBitmap3.BoundsRect, MyBitmap2.BoundsRect, MyBitmap2);
     
         SaveBitmap32ToPNG (myBitmap3, transparent, clWhite, 'D:\Test\Test.png', 5);
    Je charge donc mon PNG, je le duplique à gauche et à droite sur un nouveau Bitmap32 et je laisse un écart entre les 2. Puis je resize en divisant par 2 et j'enregistre en PNG.
    Tout semble fonctionner sauf qu'entre les 2 PNG que j'ai dupliqué, au lieu d'avoir de la transparence j'ai du noir que je n'arrive pas à enlever...

    Nom : Test.png
Affichages : 321
Taille : 10,1 Ko

  8. #28
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    dans Bitmap32 tu dois avoir une fonction clear ou fill qui permet de le remplir avec une couleur dont le canal alpha est à 0 (avant de dessiner les deux images)
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #29
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2014
    Messages : 143
    Points : 60
    Points
    60
    Par défaut
    Effectivement un Bitmap32.Clear ne fonctionne pas mais un Bitmap32.Clear($FFFFFFFF) semble fonctionner
    Je vais finir mes tests mais ca semble bien s'annoncer
    Merci !

  10. #30
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2014
    Messages : 143
    Points : 60
    Points
    60
    Par défaut
    Bon ben dernier problème : j'ouvre un PNG que je charge dans un Bitmap32 et j'enregistre directement ce Bitmap32 en PNG donc aucune modification. Au lieu d'avoir le fichier suivant (original), j'obtiens ce fichier qui rajoute des pixels blancs...
    Nom : Capture2.PNG
Affichages : 324
Taille : 42,6 Ko
    Nom : Capture3.PNG
Affichages : 320
Taille : 34,8 Ko

  11. #31
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    ce doit être un problème de format d'enregistrement, tu es passé de 738 couleurs à 264...mais ce que je ne comprend pas c'est que ta première image n'a pas de canal alpha, donc je ne vois pas comment le programme pourrait décider de modifier le contours du texte...ça ressemble plus à une image dont le canal alpha a été transformé en couleur de transparence binaire.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  12. #32
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2014
    Messages : 143
    Points : 60
    Points
    60
    Par défaut
    Les 2 images que j'ai posté ne sont que des captures réalisées avec l'outil capture de Windows, le mieux serait peut être que je poste un PNG original non modifié ?

    Edit : Fichier d'origine non retouché :
    Nom : Output_0001.png
Affichages : 319
Taille : 50,8 Ko

  13. #33
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut Le moteur de recherche du forum...
    Salut

    Voici un exemple complet qui traite de ce sujet.

    Bon dev
    De retour parmis vous après 10 ans!!

  14. #34
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2014
    Messages : 143
    Points : 60
    Points
    60
    Par défaut
    Merci pour ce lien qui pourrait m'être fort utile
    Je vais étudier les possibilités, je peux revenir vers toi en cas de problème ou de question ?
    Merci !

  15. #35
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Pas de souci. De mémoire, il s'agit d'une fonction de redimensionnement avec un filtre anti-aliasing. L'exemple que je t'ai donné date un peu mais le principe reste le même. Il utilise la librairie Graphic32. Si tu as besoin de plus de détails, je me replongerais dans le code. Bon courage
    De retour parmis vous après 10 ans!!

  16. #36
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2014
    Messages : 143
    Points : 60
    Points
    60
    Par défaut
    Merci c'est très sympa
    Je pense que ca peut correspondre à ce que je cherche, à savoir charger un PNG avec transparence, le resizer avec un filtre un peu plus évolué que le basique (du genre Spline ou Lanczos ou Mitchell) et l'enregistrer en PNG avec transparence.
    On va voir ce que ca donne

  17. #37
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2014
    Messages : 143
    Points : 60
    Points
    60
    Par défaut
    Alors déjà j'ai un petit problème (mais ton projet n'est pas prévu pour ca à la base), il y a une fonction pour charger un PNG en Bitmap32 mais par pour enregistrer un Bitmap32 en PNG.
    Aurais-tu une fonction qui fait cela ?

    Deuxième chose, Graphics32 n'utilise plus le StretchFilter mais un TKernelResampler (qui reprend les filtres du StretchFilter et quelques uns en plus d'après ce que j'ai pu voir). Mais ca encore ca se modifie, l'idéal pour moi dans un 1er temps serait de pouvoir charger un PNG dans un Bitmap32 et enregistrer ce Bitmap32 en PNG

  18. #38
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Salut
    Je n'ai pas retrouvé le code qui permettrait de sauver un objet Bitmap32 en PNG, mais il me semble qu'il suffirait d'utiliser tout simplement la fonction SaveToFile. En attendant, je vais quand même essayer de chercher dans mes cartons, ça fait un bon moment que j'ai développé tout ça

    [EDIT] J'ai retrouvé ces liens si ça peut t'aider...
    http://www.developpez.net/forums/d67...r-image-png/#5
    http://www.developpez.net/forums/d15...-transparence/
    De retour parmis vous après 10 ans!!

  19. #39
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2014
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2014
    Messages : 143
    Points : 60
    Points
    60
    Par défaut
    Merci de t'intéresser à mon sujet et merci pour le lien
    En regardant bien, ta fonction permet de charger un PNG en Bitmap32 et ton lien montre comment enregistrer un TPngImage ou TPngObject directement, il n'y a pas de conversion du BMP32 vers PNG avant de pouvoir le sauvegarder, d'où mon problème...

  20. #40
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    J'ai peur de n'avoir pas tout compris...
    J'essaye autrement :
    Dans le sujet suivant, on explique comment dissocier une image 32bits (RGBA) et 2 images :
    24 bits pour l'image RGB et 8 bits pour le masque alpha
    Puis on explique comment refusionner l'image et la sauvegarder
    http://www.developpez.net/forums/d15...ransparence/#8

    Ps : Je vais chercher dans mes codes, je l'ai déjà fait. Patience
    De retour parmis vous après 10 ans!!

Discussions similaires

  1. [GD] Miniature en cache d'image PNG avec transparence
    Par a.brioit dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 27/01/2012, 23h42
  2. PNG avec transparence entre IE7 et FireFox2
    Par Daikyo dans le forum Mise en page CSS
    Réponses: 18
    Dernier message: 27/02/2008, 16h38
  3. Image PNG avec transparence
    Par BlackStorm dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 11/09/2007, 15h00
  4. [D5] Zoom d'image PNG avec transparence
    Par Thierry Laborde dans le forum Delphi
    Réponses: 9
    Dernier message: 12/06/2006, 15h41
  5. Traitements d'image sur PNG avec transparence
    Par Ingham dans le forum Langage
    Réponses: 16
    Dernier message: 02/08/2004, 16h42

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