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

  1. #1
    Rédacteur/Modérateur

    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

    mais au format BMP j'obtiens un fond noir


    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
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  2. #2
    Membre expérimenté
    (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

    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
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  4. #4
    Membre émérite
    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

    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
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  6. #6
    Expert éminent sénior
    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.


    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.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  7. #7
    Rédacteur/Modérateur

    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

    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
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

###raw>template_hook.ano_emploi###