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. #101
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    content que ça te plaises

    pour le souci suivant ... ça t'as peut être échappé mais le code permet non seulement la conversion du PNG en BMP32 mais il peut aussi redimensionner le bitmap dans la foulée ... j'ai donc modifié le code suivant afin qu'il double la taille du bmp et que le problème de transparence finale soit également réglé.
    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
    begin
      aPng := TPngImage.Create;
      aPng.LoadFromFile('D:\Test\Output_0001.png');
     
      aBMP := TBitmap.Create;
      // ici on peut décider de redimensionner le Bitmap de sorti
      aBMP.Width := aPNG.Width * 2;   // aPNG.Width div 2;
      aBMP.Height := aPNG.Height * 2; // aPNG.Height div 2;
      aBMP.PixelFormat := pf32bit;
     
      if aPng.TransparencyMode = ptmPartial then PartialTransPng2Bmp32(aPNG, aBMP);
        // totalement inutile ici !!
    //  aBMP.AlphaFormat := afPremultiplied;
     
      aBmp2 := TBitmap.Create;
      aBmp2.Width:=2792;
      aBmp2.Height:=aBmp.Height;
      aBmp2.PixelFormat:=pf32bit;
      aBmp2.Canvas.Brush.Color := clBlack;
      aBmp2.Canvas.FillRect(aBmp2.Canvas.ClipRect);
     
      aBmp2.Canvas.CopyRect(Rect(0,0, aBMP.Width, aBMP.Height),aBmp.Canvas, aBMP.Canvas.ClipRect);
      aBmp2.Canvas.CopyRect(Rect(1400,0, 1400 + aBMP.Width, aBMP.Height),aBmp.Canvas, aBMP.Canvas.ClipRect);
     
      // la pré-multiplication n'est utile que si l'on souhaite
      // afficher le Bitmap avec la transparence
      aBmp2.AlphaFormat := afPremultiplied;
      Image2.Picture.Assign(aBmp2);
     
      // ne jamais utiliser une fonction qui retourne un objet comme ceci ...
    //  Bmp32ToPng(aBMP2).SaveToFile('Cirec.png');
      // en procédant ainsi on perd la référence du composant créé et on ne peut
      // plus le libérer ... du coup il y a fuite de mémoire                  (*  voir suite du message)
     
      // il faut absolument procéder comme ceci:                           (**  voir suite du message)
      with Bmp32ToPng(aBMP2) do
      try
        SaveToFile('D:\Test\Cirec.png');
      finally
        Free;
      end;
     
      aBMP.Free;
      aBmp2.Free;
      aPng.Free;
    end;
    * depuis BDS1 pour détecter les fuites de mémoires tu peux ajouter ceci dans le OnCreate de ta fiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ReportMemoryLeaksOnShutdown := True;
    **
    ou encore comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var
      bPng: TPNGImage;
    begin
      bPng := Bmp32ToPng(aBMP2);
      if Assigned(bPng) then
      try
        bPng.SaveToFile('D:\Test\Cirec.png');
      finally
        bPng.Free;
      end;
    end;
    je pense que tout y est

    @+ Cirec

  2. #102
    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 beaucoup je vais tester tout ca dès ce soir je pense

    Pour le resize effectivement j'avais vu les commentaires mais par contre il utilise quoi comme méthode de resize ? Un simple StretchDraw ? Il n'est pas possible d'utiliser une méthode de resize avec un peu d'AA par exemple comme la fonction Stretch32 de sub0 ?

    Enfin je n'ai pas encore essayé mais peut être que le résultat du resize sera suffisamment correct pour ne pas utiliser autre chose

  3. #103
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Citation Envoyé par NicCo Voir le message
    Merci beaucoup je vais tester tout ca dès ce soir je pense

    Pour le resize effectivement j'avais vu les commentaires mais par contre il utilise quoi comme méthode de resize ? Un simple StretchDraw ? Il n'est pas possible d'utiliser une méthode de resize avec un peu d'AA par exemple comme la fonction Stretch32 de sub0 ?

    Enfin je n'ai pas encore essayé mais peut être que le résultat du resize sera suffisamment correct pour ne pas utiliser autre chose
    oui c'est un simple stretch mais il préserve le canal alpha ... et c'est le code que la PngLib utilise pour afficher un Png à l'écran .. stretched ou non. donc tu connais déjà les limites du code ^^

    et oui, tu peux utiliser n'importe quel algo de redimensionnement à condition qu'il préserve lui aussi le canal alpha.

    regarde et compare mais il existe encore d'autres codes de ré-échantillonnage qui préservent la canal alpha

    @+ Cirec

  4. #104
    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
    Très bon travail!
    Un grand Merci et Bravo à Cirec
    De retour parmis vous après 10 ans!!

  5. #105
    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 j'ai testé depuis quelques jours et le résultat est parfait, merci encore Cirec pour ce super boulot.
    Par contre j'ai un problème pour le resize : la fonction Stretch32 de sub0 donne de bons résultats mais extrêmement lents... J'ai peut être oublié quelque chose ou il y a peut être moyen d'optimiser la vitesse, si quelqu'un a une idée...
    Edit : Le stretchdraw donne une vitesse très correcte mais une qualité assez basse. Le TempBmp peut monter à une dimension de 200 x 3000 ou 1000 x 1500 avant resize.
    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
    SourcePng:=TPngImage.Create;
        SourcePng.LoadFromFile(PSource+PFilename);
     
        SourceBmp:=TBitmap.Create;
        SourceBmp.Width := SourcePng.Width;
        SourceBmp.Height := SourcePng.Height;
        SourceBmp.PixelFormat := pf32bit;
     
        if SourcePng.TransparencyMode = ptmPartial then PartialTransPng2Bmp32(SourcePng, SourceBmp);
        TempBmp:=TBitmap.Create;
          TempBmp.Width:=TempWidth;
          TempBmp.Height:=TempHeight;
          TempBmp.PixelFormat:=pf32bit;
          TempBmp.Canvas.Brush.Color := clBlack;
          TempBmp.Canvas.FillRect(TempBmp.Canvas.ClipRect);
     
          TempBmp.Canvas.CopyRect(Rect(0,TempY, SourceBmp.Width, TempY + SourceBmp.Height),SourceBmp.Canvas, SourceBmp.Canvas.ClipRect);
          TempBmp.Canvas.CopyRect(Rect(TempX,TempY, TempX + SourceBmp.Width, TempY + SourceBmp.Height),SourceBmp.Canvas, SourceBmp.Canvas.ClipRect);
    DestBmp:=TBitmap.Create;
        DestBmp.Width:=NewWidth;
        DestBmp.Height:=NewHeight;
        DestBmp.PixelFormat:=pf32bit;
     
        if FiltreAA='none' then DestBmp.Canvas.StretchDraw( RECT( 0, 0, NewWidth, NewHeight), TempBmp)
        else
        begin
          Stretch32(TempBmp, DestBmp);
        end;
     
        with Bmp32ToPng(DestBmp) do
        try
          SaveToFile(DestPathTemp+'\TempSup3D\New-'+PFilename);
        finally
          Free;
        end;
        DestBmp.Free;
        TempBmp.Free;
        SourceBmp.Free;
        SourcePng.Free;

  6. #106
    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
    Est-ce qu'il serait possible d'utiliser Bitmap32 de Graphics32 au lieu de Bitmap ? Apparemment Bitmap32 utilise pas mal d'optimisations CPU pour améliorer la vitesse.

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