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

Composants VCL Delphi Discussion :

[Timage] Transparence lorsque l'on charge un BMP, ou PNG ?


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut [Timage] Transparence lorsque l'on charge un BMP, ou PNG ?
    salut

    je suis sous D7 et j'ai un petit soucis avec mon Timage : j'aimerais (comme beaucoup d'ailleurs :p) utiliser la transparence

    j'ai donc une couleur sur le pixel bas, coté gauche, et lorsque je lance l'exécutable, ça fonctionne bien

    sauf que si je décide de changer l'image (qui a aussi les mêmes couleurs) et bien ça ne fonctionne plus

    je pensais que j'avais merdé quelque part sauf que je suis tombé sur ce post :

    Citation Envoyé par Tardiff Jean-François Voir le message
    Bonjour,

    Il faut déjà savoir que les fichier '.BMP' ne gèrent pas les transparence.

    Dans les TImages "transparent", Delphi utilise une astuce. Le pixel enBas, a gauche de l'image sert de couleur de référence au Timage comme couleur de transparence. Si ce pixel est blanc, les pixels blanc seront"transparent".
    Attention, si le chargement se fait à la volé (durant l'exécution et non lors de la programmation) cela ne fonctionne pas.
    donc mon problème est normal ... sauf que je ne veux pas m'arrêter à ça ... il y a t il un moyen de contourner ou c'est perdu d'avance ?

    je parle de png dans mon titre, car j'ai pensé à passer par le png (j'ai installé la lib sans prob) mais 2 choses me bloquaient :

    1/ on charge un BMP dans un Timage plus facilement qu'un png (l'image est en ressource)

    2/ j'ai essayé car j'en avait marre du BMP, et lorsque j'ai chargé mon png, la transparence n'était pas géré, et je voyais du blanc ...

    pouvez vous me conseillez svp ?

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Salut Jeff,

    Coussati :
    1/ on charge un BMP dans un Timage plus facilement qu'un png (l'image est en ressource)
    2/ j'ai essayé car j'en avait marre du BMP, et lorsque j'ai chargé mon png, la transparence n'était pas géré, et je voyais du blanc ...
    Comme il est plus facile de charger un BMP dans un Timage qu'un png
    et qu'il est facile de convertir en BMP les divers types de formats-image autant en profiter pour laisser toute cette pléthore de formats sur le disque
    ce qui après conversion permet de n'avoir à gérer dans les codes que du BMP.
    Puis après avoir éventuellement modifié ce BMP on le re-convertit dans son format d'origine si on veut le sauver sur le disque :

    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
    // Avec pngimage dans le uses
     
    function BMPdePNG(const nomFichierPNG: string): TBitmap; 
    var P: TpngObject;
    begin
      Result := TBitmap.Create;
      try
        P := TPngObject.Create;
        try
          P.LoadFromFile(nomFichierPNG);
          Result.Assign(P);
        finally P.Free; end;
      finally end;
    end; // BMPdeJPEG
     
    procedure SauverBMPsousPNG(const nomFichierPNG: string; const Bmp: tBitMap);
    var P: TpngObject;
    begin
      P := TPngObject.Create;
      try
        try
          P.Assign(Bmp);
          P.SaveToFile(nomFichierPNG);
        finally end;
      finally P.Free; end;
    end; // SauverBMPsousPNG
    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    Oui mais avec un simple Assign, tu perds le canal alpha

  4. #4
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 512
    Par défaut
    Bonjour,
    je ne sais pas si cela répond à la question, mais avec les bitmaps cela fonctionne à l'exécution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Procedure TForm2.Btn_ChargerClick(Sender: TObject);
    Var
       R,G,B : Byte ;
       CouleurPixel : tColor ;
    Begin
      If OpenPictureDialog1.Execute Then
         Begin
            Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
            CouleurPixel := Image1.Picture.bitmap.Canvas.Pixels[10,15];
            Image1.Picture.Bitmap.TransparentColor := CouleurPixel ;
            Image1.Transparent := True ;
         End ;
    End;
    Il faut choisir un pixel et affecter Transparentcolor à la couleur du pixel. Tu peux choisir le pixel du coin bas gauche, comme Delphi si tu veux.

    A+
    Charly

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Re-bonjour,

    Andnotor : Oui mais avec un simple Assign, tu perds le canal alpha
    Et ne peut-on récupérer le canal alpha en effectuant les conversions PNG <> BMP autrement qu'avec un simple Assign ???

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Et ne peut-on récupérer le canal alpha en effectuant les conversions PNG <> BMP autrement qu'avec un simple Assign ???
    Oui ! Avec un simple AssignTo

    Si la destination est un TBitmap, TPngImage l'adapte au plus juste de sa propre configuration.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure LoadPng(aBitmap :TBitmap; aFileName :TFileName);
    begin
      with TPngImage.Create do
      try
        LoadFromFile(aFileName);
        AssignTo(aBitmap);
      finally
        Free;
      end;
    end;
    et donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LoadPng(Image1.Picture.Bitmap,'C:\Image.png');
    Intéressant de savoir que TPngImage.Draw dessine aussi en fonction de la destination (mais ne l'adapte pas cette fois-ci). Pour le meilleur rendu, le bitmap doit être configuré ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Bmp.PixelFormat := pf32bit;
    Bmp.AlphaFormat := afDefined;
    ZeroMemory(Bmp.ScanLine[Bmp.Height -1], Bmp.Height *Bmp.Width *SizeOf(TRGBQuad));
    Il est important de reseter l'image (ZeroMemory). noir égal transparence, sinon le fond est blanc

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AJAX] Afficher une page lorsque tout est chargé
    Par Prettyletter dans le forum jQuery
    Réponses: 4
    Dernier message: 28/01/2014, 15h44
  2. TImage transparence Builder 6 c++
    Par beubeu51 dans le forum C++Builder
    Réponses: 1
    Dernier message: 01/05/2013, 12h38
  3. Le TImage transparent est bien opaque !
    Par peter27x dans le forum Langage
    Réponses: 2
    Dernier message: 09/10/2008, 09h08
  4. Garder la transparence lorsque les fenêtres sont maximisées
    Par pepito62 dans le forum Windows Vista
    Réponses: 5
    Dernier message: 10/07/2007, 09h40
  5. Comment convertir une image bmp en png??
    Par Leclair2000 dans le forum Langage
    Réponses: 2
    Dernier message: 03/05/2005, 08h15

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