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. #1
    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 Resize d'un PNG avec transparence
    Bonjour

    Je souhaite resizer un PNG (sous titre d'un blu ray) composé d'un texte et d'un fond transparent. J'ai déjà trouvé quelques pistes qui fonctionnent mais lors de la conversion, des pixels blancs sont ajoutés autour des caractères ce qui est assez gênant. Ce problème ne semble pas se produire lorsque j'utilise un simple StretchDraw mais la qualité de resize est assez faible je trouve...

    Merci pour votre aide !

    Message d'origine :
    J'utilise la fonction Stretch32 qui a été developpé par sub0 et portée sur Delphi par sur_uix, et je rencontre un problème :
    J'ai des PNG que j'essaye de resizer avec la fonction Stretch32, ces PNG ont un fond transparent et quand je le resize, le fond est transparent mais il y a des pixels blancs autour des éléments resizés. Je pense que ce problème est du à l'anti-aliasing qui est fait par la fonction. Je ne retrouve pas ce problème avec la fonction StretchDraw de Delphi (mais le resize est moins propre).
    Auriez-vous une idée ou une solution pour résoudre ce problème ?
    Merci !

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    StretchDraw ignore le canal alpha. Utilise AlphaBlend à la place.

  3. #3
    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 la réponse, mais j'ai bien un fond transparent en utilisant StretchDraw.
    Le problème est avec les autres fonctions que j'ai pu trouver, pour toutes j'ai toujours des pixels blancs...

    Pour donner un cas concret, j'ai des fichiers de sous-titres en format PNG avec un fond transparent. J'aimerais resizer ce PNG en gardant le fond transparent mais j'ai toujours des pixels autour des caractères alors que je ne les ai pas sur l'image d'origine.

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    AlphaBlend est la seule fonction GDI gérant correctement le 32 bits RGBA (A = canal alpha = transparence).
    Sinon il faudra passer par des bibliothèques plus évoluées comme GDI+ ou DirectX.

  5. #5
    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 Andnotor Voir le message
    AlphaBlend est la seule fonction GDI gérant correctement le 32 bits RGBA (A = canal alpha = transparence).
    Sinon il faudra passer par des bibliothèques plus évoluées comme GDI+ ou DirectX.
    tout à fait, précision aussi qu'il n'est pas question d'une simple transparence (visible/non visible) mais d'un niveau de transparence allant de "pas du tout" à "complètement" en passant par translucide, etc...blend = mélange
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    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
    Vous n'auriez pas à tout hasard un petit exemple de resize PNG avec AlphaBlend ?
    Je n'ai jamais travaillé sur de l'image avec Delphi, de plus je dois faire tourner cette application en mode console (mais ca ca fonctionne).
    Merci !

  7. #7
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 418
    Points
    1 418
    Par défaut
    Moi j'utilise sa :
    Code pascal : 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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    Procedure SmoothResize(APNG: TPngImage; ANuWidth, ANuHeight: Integer);
    Var
      xscale, yscale: Single;
      sfrom_y, sfrom_x: Single;
      ifrom_y, ifrom_x: Integer;
      to_y, to_x: Integer;
      weight_x, weight_y: Array [0 .. 1] Of Single;
      weight: Single;
      new_red, new_green: Integer;
      new_blue, new_alpha: Integer;
      new_colortype: Integer;
      total_red, total_green: Single;
      total_blue, total_alpha: Single;
      IsAlpha: Boolean;
      ix, iy: Integer;
      bTmp: TPngImage;
      sli, slo: pRGBLine;
      ali, alo: pbytearray;
    Begin
      If (ANuWidth = APNG.Width) And (ANuHeight = APNG.Height) Then
        Exit;
     
      If Not(APNG.Header.ColorType In [COLOR_RGBALPHA, COLOR_RGB]) Then
        Raise Exception.Create('Only COLOR_RGBALPHA and COLOR_RGB formats' +
          ' are supported');
     
      IsAlpha               := APNG.Header.ColorType In [COLOR_RGBALPHA];
      If IsAlpha Then
        new_colortype       := COLOR_RGBALPHA
      Else
        new_colortype       := COLOR_RGB;
      bTmp                  := TPngImage.CreateBlank(new_colortype, 8, ANuWidth, ANuHeight);
      xscale                := bTmp.Width / (APNG.Width - 1);
      yscale                := bTmp.Height / (APNG.Height - 1);
      For to_y              := 0 To bTmp.Height - 1 Do
      Begin
        sfrom_y             := to_y / yscale;
        ifrom_y             := Trunc(sfrom_y);
        weight_y[1]         := sfrom_y - ifrom_y;
        weight_y[0]         := 1 - weight_y[1];
        For to_x            := 0 To bTmp.Width - 1 Do
        Begin
          sfrom_x           := to_x / xscale;
          ifrom_x           := Trunc(sfrom_x);
          weight_x[1]       := sfrom_x - ifrom_x;
          weight_x[0]       := 1 - weight_x[1];
     
          total_red         := 0.0;
          total_green       := 0.0;
          total_blue        := 0.0;
          total_alpha       := 0.0;
          For ix            := 0 To 1 Do
          Begin
            For iy          := 0 To 1 Do
            Begin
              sli           := APNG.Scanline[ifrom_y + iy];
              new_red       := sli[ifrom_x + ix].rgbtRed;
              new_green     := sli[ifrom_x + ix].rgbtGreen;
              new_blue      := sli[ifrom_x + ix].rgbtBlue;
              weight        := weight_x[ix] * weight_y[iy];
              total_red     := total_red + new_red * weight;
              total_green   := total_green + new_green * weight;
              total_blue    := total_blue + new_blue * weight;
              If IsAlpha Then
              Begin
                ali         := APNG.AlphaScanline[ifrom_y + iy];
                new_alpha   := ali[ifrom_x + ix];
                total_alpha := total_alpha + new_alpha * weight;
              End;
            End;
          End;
          slo                 := bTmp.Scanline[to_y];
          slo[to_x].rgbtRed   := Round(total_red);
          slo[to_x].rgbtGreen := Round(total_green);
          slo[to_x].rgbtBlue  := Round(total_blue);
          If IsAlpha Then
          Begin
            alo               := bTmp.AlphaScanline[to_y];
            alo[to_x]         := Round(total_alpha);
          End;
        End;
      End;
      APNG.Assign(bTmp);
      bTmp.Free;
    End;
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

  8. #8
    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 pour cet exemple que je vais essayer dès que possible (il faut que je trouve comment coller 2 PNG côte à côte avant de redimensionner le tout).

  9. #9
    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 je viens d'essayer la fonction ci-dessus et j'ai le message d'erreur suivante :
    Only COLOR_RGBALPHA and COLOR_RGB formats are supported
    Donc mon fichier image ne semble pas être compatible avec la fonction...

  10. #10
    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
    Pour donner un exemple concret voici ce que je cherche à faire : je colle 2 images PNG identiques côte à côte avec un certain écart entre les 2, puis je divise cet assemblage par 2 au niveau de la largeur, ce qui donne quelque chose comme ci-dessous.

    Source :
    Nom : x09f.png
Affichages : 1042
Taille : 50,8 Ko
    Destination :
    Nom : k6bh.png
Affichages : 955
Taille : 14,4 Ko

  11. #11
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Et que vaut APNG.Header.ColorType ?
    Quel est le type de ces png ouverts dans un viewer ? Quels canaux couleurs, quel ordre, etc ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  12. #12
    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
    Comment avoir ces infos ?
    Pour le PNG avec un simple WriteLn j'obtiens les valeurs suivantes (le type Byte du APNG.Header.ColorType doit être converti par le WriteLn donc je ne saurais pas trop interpréter les résultats) :
    - COLOR_RGBALPHA donne 6
    - COLOR_RGB donne 2
    - APNG.Header.ColorType donne 3 pour mon fichier
    Pour le reste je peux installer GIMP si ca peut faire l'affaire ou fournir un fichier d'exemple...
    Merci !

  13. #13
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    http://www.w3.org/TR/PNG-Chunks.html nous dit que APNG.Header.ColorType vaut 3 pour une image palettisée. Faut-il passer par un intermédiaire en changeant d'espace de couleur ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  14. #14
    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
    Je n'ai malheureusement pas assez de connaissance sur le PNG pour répondre, mais je souhaite que les couleurs soit identiques entre la source et la destination. Par contre si cela nécessite un intermédiaire pourquoi pas.

  15. #15
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    2 liens trouvés récemment sur GDI+

    http://www.mitov.com/products/igdi+#features

    http://www.bilsen.com/gdiplus/index.shtml

    Il y a peut-être des solutions GDI+ sur un de ces sites, comme conseillé par Andnotor.

  16. #16
    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 les liens, je vais regarder plus en détails mais à première vue je n'ai rien trouvé sur les PNG

  17. #17
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Dans le second lien, je vois :
    Image Encoders and Decoders

    Saving an image in a certain format (such as JPEG or PNG) takes a couple of steps in the C++ version. You would have to enumerate all encoders that are installed on the system to find the encoder you are interested in. This enumeration would also take a couple of steps. For standard formats like BMP, GIF, JPEG, PNG and TIFF, this library allows you the specify the format directly without any encoder enumeration:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
      Bitmap: IGPBitmap;
    begin
      Bitmap := TGPBitmap.Create(200, 100);
      Bitmap.Save('Output.png', TGPImageFormat.Png);
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  18. #18
    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
    Je vais tester ce point afin de vérifier qu'il y est une prise en charge des PNG en ouverture (avec gestion de la transparence et de l'indexation) et pas seulement en enregistrement.

  19. #19
    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 un peu commencé à regarder, il y a des choses pas mal mais pour le moment pas ce que je souhaite faire. Je continue à regarder un peu même si ca manque de doc.
    Si quelqu'un a une autre solution je suis preneur

  20. #20
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Bonjour,

    J'ai trouvé ce lien :

    http://cc.embarcadero.com/Item/25631

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