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. #41
    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
    Non effectivement c'est moi qui avait mal compris. J'étais resté sur le sujet de l'horloge et je pensais que le lien donné était pour sauvegarder le résultat.
    En attendant je viens d'essayer ton code inclus dans mypng.zip et j'ai une erreur et aucun résultat dans l'image recomposée
    Merci !

    Edit : Au temps pour moi, je n'avais pas vu le mypng2.zip, je vais réessayer avec celui là

  2. #42
    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 viens d'essayer avec l'exe contenu dans mypng2.zip mais j'ai une erreur lorsque j'ouvre l'image et au final le résultat n'est pas le bon.
    Je commence à désespérer, j'ai l'impression que mon fichier png est dans un format impossible à traiter

  3. #43
    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
    En effet, c'est peut-être au niveau du format du PNG qu'il faudrait creuser...
    Déjà, j'ai 2 petites questions pour toi :

    -> As-tu essayé avec une autre image (récupérée dans les sources des exemples que je t'ai donné) ?

    -> Le code qui décompose l'image RGBA en 4 masques puis les refusionne ne peut pas t'aider à créer un PNG au bon format ?

    Selon moi, le fait de pouvoir ouvrir ton image avec la méthode LoadPNGBitmap devrait aussi te permettre de pouvoir la sauvegarder en utilisant un simple saveToFile...

    bon courage!
    De retour parmis vous après 10 ans!!

  4. #44
    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 trouvé le code suivant sur le net, mais je ne peux pas le tester sur mon poste...
    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
     
    uses GR32, GR32_PNG, GR32_PortableNetworkGraphic;
     
    var
      Y: Integer;
      X: Integer;
      Png: TPortableNetworkGraphic32;
     
      function IsWhite(Color32: TColor32): Boolean;
      begin
        Result:= (TColor32Entry(Color32).B = 255) and
                 (TColor32Entry(Color32).G = 255) and
                 (TColor32Entry(Color32).R = 255);
      end;
     
    begin
      with Image321 do
      begin
        Bitmap.ResetAlpha;
        for Y := 0 to Bitmap.Height-1 do
          for X := 0 to Bitmap.Width-1 do
          begin
            if IsWhite(Bitmap.Pixel[X, Y]) then
              Bitmap.Pixel[X,Y]:=Color32(255,255,255,0);
          end;
        Png:= TPortableNetworkGraphic32.Create;
        Png.Assign(Bitmap);
        Png.SaveToFile('C:\Temp\NowTransparent.png');
        Png.Free;
      end;
    end;
    A toi de jouer!
    De retour parmis vous après 10 ans!!

  5. #45
    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
    Malheureusement ces fichiers sont extraits et créés par un logiciel donc je ne pourrai pas en changer le format

    Sinon oui j'ai essayé ton exe avec l'image de test fournie (sphere) et tout fonctionne normalement.
    Pour le code RGBA non il ne semble pas fonctionner avec mon image, j'ai toujours une erreur.

    Je vais réessayer le code de LoadPNGBitmap mais il me semble que j'avais une erreur aussi...

    La seule méthode qui avance un peu pour le moment c'est avec Graphics32 et 2 fonctions PNG que j'ai trouvé en parallèle de Graphics32. Ces fonctions sont censées permettre d'ouvrir un PNG en Bitmap32 et d'enregistrer un Bitmap32 en PNG mais le problème est que j'ai toujours un background noir au lieu de transparent.

    Je sèche un peu, je n'ai pas l'habitude de travailler avec du PNG et de la transparence.

  6. #46
    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
    Ok, je commence à y voir plus clair.
    J'ai déjà rencontré ce problème avec des images de logiciels et effectivement, la modification et l'enregistrement de l'image peut devenir difficile, voir impossible.
    Essaye avec le code donné dans mon message précédent car il semble qu'il faille reprogrammer la transparence pour la sauvegarde...
    Je sais que je l'ai déjà fait avec du PNG et du GIF, donc ne désespère pas.
    De retour parmis vous après 10 ans!!

  7. #47
    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 je viens de tester mais même résultat. J'utilise déjà GR32_PNG et GR32_PortableNetworkGraphic mais j'ai un background noir (même chose si je change les 255 en 0 dans mon code).
    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
    function IsWhite(Color32: TColor32): Boolean;
      begin
        Result:= (TColor32Entry(Color32).B = 255) and
                 (TColor32Entry(Color32).G = 255) and
                 (TColor32Entry(Color32).R = 255);
      end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      PNGSource,PNGDest: TPortableNetworkGraphic32;
      BMPTemp: TBitmap32;
      Y: Integer;
      X: Integer;
    begin
      PNGSource:=TPortableNetworkGraphic32.Create;
      PNGDest:=TPortableNetworkGraphic32.Create;
      BMPTemp:=TBitmap32.Create;
     
      PNGSource.LoadFromFile('D:\Test\Output_0001.png');
     
      BMPTemp.Width:=PNGSource.Width;
      BMPTemp.Height:=PNGSource.Height;
     
      PNGSource.DrawToBitmap32(BMPTemp);
     
      BMPTemp.ResetAlpha;
      for Y := 0 to BMPTemp.Height-1 do
        for X := 0 to BMPTemp.Width-1 do
        begin
          if IsWhite(BMPTemp.Pixel[X, Y]) then BMPTemp.Pixel[X,Y]:=Color32(255,255,255,0);
        end;
     
      PNGDest.Assign(BMPTemp);
      PNGDest.SaveToFile('D:\Test\Output_0001_New.png');
     
      PNGSource.Free;
      PNGDest.Free;
      BMPTemp.Free;
    end;

  8. #48
    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
    Je sèche aussi. Et je n'ai pas Delphi sur ce poste pour lancer des tests...
    Dans le pire des cas, tu devras essayer de dissocier les 4 masques et de refusionner ton image :
    http://www.developpez.net/forums/d15...ransparence/#8

    Il n'y a pas de mystère : 4 masques de 8 bits formeront un PNG 32 bits...

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

  9. #49
    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 essayer, le code de Ingham fonctionne ?

    Sinon je crois que le PNG a une palette, ca peut influencer ?

  10. #50
    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
    Le code pour extraire la couleur me donne un rectangle complètement noir, et le code pour extraire le canal alpha me donne une erreur.

  11. #51
    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
    Il existe différents format de PNG. En général :
    • 8 bits = niveau de gris ou couleurs palettisées (1 couleur transparente possible).
    • 16 bits = en couleur avec palette
    • 24 bits = en couleur sans palette
    • 32 bits = en couleur et un masque de transparence

    Mais j'imagine que d'autres combinaisons doivent être possibles, par exemple :
    • 16 bits (couleurs) et 16 bits (masque alpha)

    La difficulté sera de déterminer le format de ton image d'entrée car on peut avoir une image et un code qui fonctionne malgré que le format ne soit pas exactement celui qu'on attendait...
    Peux-tu paramétrer le format de l'image de sortie avec ton logiciel ?
    De retour parmis vous après 10 ans!!

  12. #52
    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
    Non je ne peux malheureusement rien choisir, le logiciel est en fait un logiciel qui extrait des fichiers de sous-titres .sup en xml/png.

    J'ai essayé le code de Ingham avec ton image de test Sphere et pas de souci, mais avec mon image j'ai un rectangle noir seulement.

    J'ai mis un exemple de fichier ici : http://dl.free.fr/nzNp2G5FY

  13. #53
    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
    Ok, c'est bien le format qui est à l'origine de ton problème. J'aurai du commencer par là (ça m'apprendra à ne pas lire jusqu'au bout l’annoncé du problème). Bref, je t'explique ton souci : D'après mes tests, il s'agirait d'une image au format 8 bits. C'est-à-dire qu'il y a une palette dont 1 seule couleur est transparente. Je donc vais pouvoir t'aider : Il faut charger ton image et créer de toutes pièces les 4 masques RGBA avant de pouvoir redimensionner et d'enregistrer.

    Je reviens avec plus d'infos. Peut-être qu'il existe une solution avec GR32...
    De retour parmis vous après 10 ans!!

  14. #54
    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 ton aide sub0 !!

  15. #55
    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 430
    Points
    28 430
    Par défaut
    Citation Envoyé par Sub0 Voir le message
    Ok, c'est bien le format qui est à l'origine de ton problème. J'aurai du commencer par là (ça m'apprendra à ne pas lire jusqu'au bout l’annoncé du problème). Bref, je t'explique ton souci : D'après mes tests, il s'agirait d'une image au format 8 bits. C'est-à-dire qu'il y a une palette dont 1 seule couleur est transparente. Je donc vais pouvoir t'aider : Il faut charger ton image et créer de toutes pièces les 4 masques RGBA avant de pouvoir redimensionner et d'enregistrer.

    Je reviens avec plus d'infos. Peut-être qu'il existe une solution avec GR32...
    en fait je viens de vérifier, je ne savais pas que c'était possible mais en PNG tu peux avoir une image 8bits avec un canal alpha dans la palette

    d'ailleurs ce site propose de convertir un PNG24+Alpha en PNG8+Alpha http://www.8bitalpha.com/

    Or donc il y a peut-être un problème de gestion de ce mode dans le composant PNG.
    Images attachées Images attachées  
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  16. #56
    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 ne connaissais pas non plus, j'ai espoir que sub0 trouve une solution

  17. #57
    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
    Dans ton image, il n'y a qu'une seule couleur transparente, il s'agit de la 1ère couleur de la palette. Ainsi, il est possible de reconstruire les différents masques du RGBA. J’espérais trouver une solution directe plutôt que de devoir retraiter les pixels uns à uns. Mais bon, je vais faire ça. Je reviens dès que j'ai un code à te proposer.
    De retour parmis vous après 10 ans!!

  18. #58
    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
    En attendant, regarde donc l'exemple donné dans Gr32 : General/Image32_Ex/MainUnit.pas
    Il semblerait qu'ils proposent une solution pour ce format...
    Pour ma part, il faut que je réinstalle tous ces composants et delphi sur mon poste.

    [EDIT] Voilà l'idée : Reprendre le code donné dans ce sujet afin de décomposer l'image et récupérer la couleur RGB de chaque pixel tout en sachant que la couleur transparente se trouve à l'index 0 de la palette et ainsi pouvoir créer le masque alpha...
    http://www.developpez.net/forums/d57...bits-24bits/#9
    De retour parmis vous après 10 ans!!

  19. #59
    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 encore de t'intéresser à ce sujet, et OK pour l'exemple je vais regarder ce que je vois

  20. #60
    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 viens d'essayer le code dans le lien donné mais j'obtiens une image finale avec un background noir et surtout en niveau de gris.
    Je regarde tout à l'heure du côté de Graphics32

    Edit : si je remplace bmpg.assign(png) par bmpg.draw(0,0,png) j'obtiens toujours du niveau de gris mais avec background blanc.

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