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

Langage Delphi Discussion :

Traitements d'image sur PNG avec transparence [Archives]


Sujet :

Langage Delphi

  1. #1
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut Traitements d'image sur PNG avec transparence
    Bonjour à tous ...

    Ma question est simple, j'ai une image (bleue par exemple) et j'ai une couleur TColor, je voudrais que mon image devienne de cette couleur là, comme quand on modifie le Hue dans photoshop ou qu'on ajoute un calque en mode Color ...
    De plus, il s'agit d'une image PNG, avec niveaux de transparence (j'utilise PNGimage) :-?

    J'ai essayé les JanFX, il y'a Saturation mais pas Hue Si quelqu'un sait faire ca facilement en delphi ...

    Merci d'avance !

    Ingham

  2. #2
    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!

    Tu trouveras tout ce dont tu as besoin avec
    http://www.efg2.com/Lab/Graphics/Colors/HSV.htm
    _________________
    Merci de lire les règles du forum!
    Merci de chercher un peu avant de poster dans le forum...
    Ne poster qu'en dernier recours!
    N'oubliez pas d'ajouter le tag [résolu]!
    De retour parmis vous après 10 ans!!

  3. #3
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut
    Salut

    Tout d'abord merci pour ta réponse mais je crois que j'avais mal exprimé ma question, je ne veux pas simplement coloriser un carré avec une valeur HSV, ce que je voudrais, voici un exemple en image:

    J'ai une image bleue comme ceci:

    Et si l'utilisateur désigne un couleur verte, j'aimerais que mon image se colorise de cette facon:


    A savoir que l'utilisateur peut choisir vraiment n'importe quelle couleur, donc l'idée de stocker la même image avec différentes couleurs est exclue

    Un peu comme le Hue ou le Layer Color de Photoshop, j'espère que j'arrive a exprimer ma question correctement :-?

    Merci par avance

    Ingham

  4. #4
    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
    La méthode consiste à récupérer la luminosité de chaque pixel et à choisir la teinte et la saturation.
    Il faut donc dissocier les valeurs HSL du pixel. Ces valeurs vont de 0 à 240.

    http://sub0.developpez.com/delphi/changehue.zip

    Dans cette démo, j'ai utilisé ScanLine pour gagner en performance.
    "Form1.DoubleBuffered:=True;" permet de gagner en fluidité.
    Il faudra penser à convertir les images JPEG en BMP avant le traitement...

    • N'oubliez pas d'ajouter le tag [résolu]!

    à+
    De retour parmis vous après 10 ans!!

  5. #5
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut
    Ok merci ca marche vraimen nickel !!!

    Juste un dernier soucis, oui ca ne marche qu'avec les BMP, alors lorsqu'il s'agit d'un JPEG par exemple ce n'est pas un probleme, mais dans le cas d'un PNG, si je le convertit en BMP j'y perds la transparence, hors j'en ai besoin vu que le fond sur lequel est posée mon image est un dégradé, dont les couleurs sont aussi reglés par l'utilisateur (Vous l'aurez surement compris: il s'agit d'une application skinnable et j'aimerais que le logo prenne les couleurs du skins ;-))

    Encore merci pour votre aide très précieuse et précise

    Ingham

    PS: Je met résolu car le probleme principal du topic est résolu, meme s'il me reste une petite question

  6. #6
    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 n'ai pas trouvé de compo ou sources permettant de travailler avec des PNG. Cependant, j'ai trouvé comment sont conçus ces images 24 bits, en particulier, la transparence progressive. La couche alpha qui donne un effet plus ou moins transparent peut être codée sur 8 ou 16 bits. Le format PNG est compressé.

    D'après ces informations, il serait donc possible de créer sa propre unité de traitement. Je pense par exemple à dissocier l'image PNG en 2 images BMP: Une image 24 bits pour les couleurs normales, et une seconde image BMP 16 bits pour la transparence alpha. Ainsi, on traiterait la 1ère image, puis refusionnerait les 2 images pour obtenir le PNG modifié. Je continu cependant à rechercher une source qui évitera de devoir élaborer soi-même l'unité, mais j'ai peu d'espoir de trouver quelque chose qui pourrait convenir, à+
    De retour parmis vous après 10 ans!!

  7. #7
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut
    L'idée de dissocier le PNG en 2 BMP (couleur et masque) n'est vraiment pas idiote

    Je vais chercher une idée pour coder ca de manière assez courte, je te tiens au courant si je trouve quelque chose Toi aussi j'espère

  8. #8
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut
    J'ai cherché un peu, je réussi, à partir d'un PNG, d'extraire en Bitmap son "canal" couleur et son "canal" alpha, je me retrouve donc avec 2 images BMP, une en couleur, l'autre en niveaux de gris ...

    Mon seul problème maintenant reste pour réassembler les 2 pour reformer un PNG, mais j'y penche actuellement

    Extraire la couleur, très simple:
    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
     
    var
      Bitmap: TBitmap;
      PNG: TPNGObject;
    begin
      PNG := TPNGObject.Create;
      Bitmap := TBitmap.Create;
     
      try
        PNG.LoadFromFile(Source);
     
        Bitmap.Assign(PNG);  
        Bitmap.SaveToFile(Dest);
      finally
        PNG.Free;
        Bitmap.Free;
      end
    Ce qui sort donc un fichier .bmp ne contenant que les couleurs

    Et le canal alpha, simple aussi:
    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
     
    var
      Bitmap: TBitmap;
      PNG: TPNGObject;
      i,j:    Integer;
    begin
      PNG := TPNGObject.Create;
      Bitmap := TBitmap.Create;
     
      try
        PNG.LoadFromFile(Source);
     
        Bitmap.Height := PNG.Height;
        Bitmap.Width  := PNG.Width;
     
        For i := 0 To PNG.Height-1 Do
        Begin
          For j := 0 To PNG.Width-1 Do
          Begin
            If PNG.AlphaScanline[i][j] > 239 Then
            Bitmap.Canvas.Pixels[j,i] := clWhite
            Else
            Bitmap.Canvas.Pixels[j,i] := HSLRangeToRGB(0,0,PNG.AlphaScanline[i][j]);
          End;
        End;
        Bitmap.SaveToFile(Dest);
     
      finally
        PNG.Free;
        Bitmap.Free;
      end
    Il suffit donc d'effectuer le traitement sur le Bitmap Color, et ensuite de réassembler les deux canaux ... Ce sur quoi je penche en ce moment même

    PS: Je pense pas qu'il soit utile de créer un topic pour ca maintenant que j'ai presque fini Je vais simplement changer le titre de celui ci

  9. #9
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut
    Et voilà qui devrait clore pour de bon le sujet

    Réassembler les deux:
    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
     
    PNG := TPNGObject.Create;
    PNG.Assign(bmpCanalCouleur);
     
    PNG.Header.ColorType := COLOR_RGB;
    PNG.CreateAlpha;
    For j := 0 To PNG.Header.Height - 1 Do
    For i := 0 To PNG.Header.Width - 1 Do
    Begin
        RGBtoHSLRange(bmpCanalAlpha.Canvas.Pixels[i,j],H,S,L);
        PNG.AlphaScanline[j]^[i] := L;
    End;
     
    imgBMPTotal.Picture.Assign(PNG);
    PNG.Free;
    bmpCanalCouleur étant le Bitmap contenant le canal couleur et bmpCanalAlpha celui contenant le canal alpha en niveau de gris précédement créé

    A partir de tout ça je vais créer ma procédure ColorizePicture(), je la poste et c'est fini

  10. #10
    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!

    Pourrais-tu donner le lien de téléchargement des unités?
    J'ai télécharger pngimage143.zip ...

    ???

    J'ai l'impression que ton utilisation des fonctions HSL ne sont pas correctes...
    L = luminosité allant de 0 à 240 ce qui est différent d'une color 8 bit (0..255).

    Rien à voir!
    De retour parmis vous après 10 ans!!

  11. #11
    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
    Attention, le masque alpha peut-être codé sur 8 ou 16 bits!!
    De retour parmis vous après 10 ans!!

  12. #12
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut
    Oui je sais bien, pourtant ainsi ca marche très très bien !
    Enfin il y a surement une meilleure solution mais en attendant de la trouver je vais me contenter de ca

    Pour ce qui est des unités, il faut juste PNGimage et HSLUtils (ne pas oublier de mettre leurs paths dans Tools > Environment )

    Voila le lien du programme avec les sources (Je n'ai pas encore mis la fonction de colorisation mais juste la "décomposition" du PNG):
    http://ingham.free.fr/stjuilaug/pngcanal.zip

    Par contre ce que je comprends pas, c'est pourquoi, lorsque je remet les Bitmap.Free; il me renvoie des Bitmap vide, alors que je les fais APRES avoir renvoyé le resultat
    Je me souviens être déjà tombé sur un probleme de ce genre a mes débuts en Delphi mais je me souviens plus comment j'avais fais, trou de mémoire lol

    Je ne doute pas que tu sauras améliorer ce petit morceau de code

    Merci pour ton aide !

    Ingham

  13. #13
    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
    pourtant ainsi ca marche très très bien
    Non, pas du tout! Ton algo est faux malgré que ton appli fonctionne!
    Ainsi, tu n'arriveras pas à modifier la teinte de ton image.
    De plus, l'unité pngimage nécessite les unités pnglang et pngzlib pour fonctionner,
    et donc le dossier obj et ses fichiers...

    à+
    De retour parmis vous après 10 ans!!

  14. #14
    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 m'inspirant directement de ton code, j'ai réalisé 2 fonctions:

    - Decompose
    - Recompose

    Sauf que j'utilise Scanline, ce qui beaucoups plus rapide!

    Voici les sources complètes: http://sub0.developpez.com/delphi/mypng.zip

    Souviens toi de ce que j'ai dis précédemment:
    1) Décompresser l'image PNG
    2) Extraire le masque de transparence alpha vers un bitmap
    3) Extraire l'image restante vers un second bitmap
    4) Appliquer les traitements souhaités aux bitmaps
    5) Refusionner les images
    6) Recompresser au format PNG
    Il faut appliquer le traitement de teinte aux 2 bitmaps avant de les refusionner en PNG.
    Toi, ce que tu fais, c'est que tu récupères la luminosité de l'image qui correspond à peu près à la valeur du pixel 8 bits...

    Le bon algo est:
    - Décomposer le PNG
    - Changer la teinte des bitmaps
    - Recomposer le PNG

    Je te passe le code une fois fini...
    1ère chose, je dois régler le problème de l'alpha en 16 bits, car là il est en 8 bits!

    à+
    De retour parmis vous après 10 ans!!

  15. #15
    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
    Voilà la fonction terminée!

    http://sub0.developpez.com/delphi/mypng2.zip

    Pour l'alpha, je n'ai pas pu utiliser Scanline finalement...
    Je l'utilise seulement pour le traitement de l'autre bitmap.
    J'aurai bien aimé pouvoir changer la couleur de l'ombre,
    mais je n'y suis pas arrivé!

    J'ai trouvé certains fichiers PNG qui une fois traîtés, s'affichaient mal avec mon prog...
    Donc, il ya probablement des erreurs quelque part.
    Avec ton code, c'est pire (message d'erreur à l'ouverture du fichier).
    http://sub0.developpez.com/delphi/testpng.zip

    à+
    De retour parmis vous après 10 ans!!

  16. #16
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut
    En effet
    Certains fichiers buguent a l'ouverture c'est donc encore a paufiner mais finalement on y est arrivés

    Un grand merci pour ton aide ! 8)

  17. #17
    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 ya certains fichiers, soit qui n'ont pas de masque alpha, soit qui ne possèdent qu'un masque alpha...
    C'est avec ces fichiers qui il ya un problème.
    Je suis arrivé à le contourner, mais je n'ai pas encore la solution parfaite.

    à+
    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. Image PNG avec transparence
    Par BlackStorm dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 11/09/2007, 15h00
  3. Réponses: 18
    Dernier message: 19/03/2007, 09h56
  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. enregistrer image sur disque avec URL
    Par meufeu dans le forum Langage
    Réponses: 8
    Dernier message: 26/10/2005, 12h55

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