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 FMX Delphi Discussion :

Sauvegarde de l'image d'un TPath


Sujet :

Composants FMX Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 658
    Billets dans le blog
    65
    Par défaut Sauvegarde de l'image d'un TPath
    Bonjour,

    je finalise avec mon utilisation de TPath, après les questions qui se posaient sur la partie gradient, une question sur la sauvegarde.

    Pour l'instant le code est simplissime et bien sûr j'y ajouterai un TSaveDialog
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TMainForm.SauveClick(Sender: TObject);
    var ABitmap : TBitmap;
    begin
    ABitmap:= Path1.MakeScreenshot;
    try
      ABitmap.SaveToFile('Test.png'); // 
    finally
      ABitmap.Free;
    end;
    end;
    Le problème est le suivant, si je sauve en format PNG j'ai bien la transparence
    Nom : Test.png
Affichages : 287
Taille : 4,5 Ko
    mais au format BMP j'obtiens un fond noir
    Nom : Capture.PNG
Affichages : 292
Taille : 3,8 Ko

    Comment garder la transparence à partir de mon code ?
    Il y a aussi l'histoire du paramètre SaveParams et de son BitmapCodec que j'aimerais éclaircir

    Merci

  2. #2
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    (sous réserve que ma mémoire vive le soit plus que moi aujourd'hui je crois me souvenir que) le format BMP ne gère pas de transparence , je ne vois pas trop comment tu pourrais l'obtenir.

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 658
    Billets dans le blog
    65
    Par défaut
    Oui, bon, peut être me suis-je mal exprimé.
    Comment on peut sauvegarder une image bmp en 32 bits ?
    Comment transformer ensuite une couleur en Alpha

    ma mémoire vive le soit plus que moi
    ce n'est pas ton poste qui surchauffe aujourd'hui

  4. #4
    Membre Expert
    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 : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Par défaut
    Salut,

    J'ai trouvé ça, mais je n'ai pas testé. Donc à voir si ça fonctionne :

    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
    procedure TForm1.SetBMPTransparent(oBmp:Tbitmap);
    var
      bmpData:TBitmapData;
      colorToMakeTransparent:TAlphaColor;
      transparentColor:TAlphaColor;
      Color:TAlphaColor;
      x: Integer;
      y: Integer;
    begin
      oBmp.Map(TMapAccess.ReadWrite,bmpData);
     
      colorToMakeTransparent := bmpData.GetPixel (0, 0);
      TransparentColor := claNull;
     
      for x := 0 to bmpData.Width do
      begin
        for y := 0 to bmpData.Height do
        begin
          Color := bmpData.GetPixel(x,y);
          if Color = colorToMakeTransparent then
          begin
            bmpData.SetPixel(x,y,transparentColor);
          end;
        end;
      end;
      oBmp.Unmap(bmpData);
    end;

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 658
    Billets dans le blog
    65
    Par défaut
    Bonjour Thierry,

    j'en étais arrivé presque au même point après avoir lu cette discussion prè-FMX 2

    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
      procedure SetCouleur(aBmp: TBitmap;
        FromColor: TAlphaColor = TAlphaColors.Null;
        ToColor: TAlphaColor = TAlphaColors.Null);
      var
        Data: TBitmapData;
        X, Y: Integer;
      begin
        aBmp.Map(TMapAccess.ReadWrite, Data);
        if FromColor = TAlphaColors.Null then  // changement inspiré  
          FromColor := Data.GetPixel(0, 0);
        for X := 0 to aBmp.Height  do
          for Y := 0 to aBmp.Width  do
            if Data.GetPixel(Y,X) = FromColor then
              Data.SetPixel(Y,X, ToColor);
        abmp.Unmap(Data);
      end;
    Ta solution à l'avantage de ne pas se faire "suer" avec les fromcolor/tocolor de la mienne

    [Edit]je désespérais car mon image ne se modifiait pas il manquait une instruction abmp.Unmap(Data); conclusion Map est un peu comme un BeginUpdate et UnMap son EndUpdate
    Encore quelques essais et je pourrais cliquer sur

  6. #6
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 159
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 159
    Par défaut
    Bonsoir,

    Citation Envoyé par pprem Voir le message
    (sous réserve que ma mémoire vive le soit plus que moi aujourd'hui je crois me souvenir que) le format BMP ne gère pas de transparence , je ne vois pas trop comment tu pourrais l'obtenir.


    Bien sûr que oui que le BMP gère la transparence, c'est Windows qui ne la gère pas. Il n'y a qu'à regarder la boîte de dialogue d'enregistrement d'un fichier au format BMP sous The Gimp pour en être convaincu.
    Nom : bdd_export_bmp_gimp.png
Affichages : 292
Taille : 30,8 Ko

    On notera que l'ovale orange est transparent (opacité à 60 %), il a été réalisé sur un calque, qui a le canal alpha activé par défaut.

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 658
    Billets dans le blog
    65
    Par défaut
    Oui et non, ce n'est pas le format de fichier bitmap qui ne gère pas la transparence (pour peu que ce soit en 32bits) le vieux TBitmap VCL. pour FMX la question ne se pose pas c'est bien du 32bits (ce que j'ai vérifié en utilisant Data.PixelFormat pour vérifier même si j'ai ensuite supprimé ce test

    pour en finir (ou presque car j'ai été obligé d'utiliser if FromColor = TAlphaColors.Null then FromColor := Data.GetPixel(abmp.Width-4,abmp.Height-4); pour avoir ma couleur de référence
    Nom : Capture.PNG
Affichages : 274
Taille : 7,1 Ko
    le fond de test2.bmp a été modifié via l'instruction ChangeCouleur(ABitmap,TAlphaColors.Null,TAlphaColors.White);Rien d'insurmontable si :
    1 - je mets mon composant TPath dans un Layout (avec padding)
    2- je fais un ScreenShot de ce Layout au lieu du TPath

    Sinon la transformation de couleur fonctionne. Donc excepté amélioration de la procedure ? c'est résolu

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

Discussions similaires

  1. Sauvegarde d'une image après traitement
    Par Nates dans le forum Images
    Réponses: 4
    Dernier message: 25/06/2008, 15h39
  2. Réponses: 3
    Dernier message: 23/06/2006, 12h15
  3. sauvegarde d'ne image dans un fichier?
    Par waiso dans le forum OpenGL
    Réponses: 3
    Dernier message: 12/05/2006, 08h33
  4. Sauvegarde d'une image jpeg modifiée
    Par tomfoot dans le forum Composants VCL
    Réponses: 1
    Dernier message: 05/04/2006, 16h02
  5. Sauvegarde d'une image sous un autre format
    Par gandf dans le forum C++Builder
    Réponses: 4
    Dernier message: 24/02/2004, 09h50

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