Einzelnen Beitrag anzeigen

Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: [Firemonkey] Canvas als PNG mit Transparenz speichern

  Alt 12. Apr 2016, 18:32
Vielleicht erst mal was grundsätzliches: Intern verwendet FMX immer eine 32-bit Bitmap, also mit Transparenz. Wenn Du das speicherst, reicht es einen Dateityp zu wählen, der Transparenz kann (also z.B. '.png'), die Transparenz bleibt dann automatisch erhalten.

Zu Deinem Code: Ohne Beginscene und Endscene wirst Du i.d.R. nichts sehen.

Hier ein kleines Beispiel, das ein rotgefülltes Rundeck erzeugt. Wenn Du das dann mit dem Button "Speichere" speicherst und die Datei in einem Bildbearbeitungsprogramm öffnest, sieht das so wie in der Anlage aus (Transparenz wird durch das Schachmuster signalisiert).

Außerdem musst Du drauf achten, auf welchen Canvas Du Dich beziehst (also nicht den Form-Canvas verwenden).

Delphi-Quellcode:
unit Unit18;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects,
  FMX.StdCtrls, FMX.Edit, FMX.Controls.Presentation;

type
  TForm18 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form18: TForm18;

implementation

{$R *.fmx}

procedure TForm18.Button1Click(Sender: TObject);
begin
  with image1.Bitmap.Canvas do begin
    if beginscene then begin
      try
        Fill.Color := TAlphaColorRec.red;
        FillRect(rectF (20,20, 100,100), 30,30,AllCorners,100);
      finally
        endscene;
      end;
    end;
  end;
end;

procedure TForm18.Button2Click(Sender: TObject);
begin
  image1.Bitmap.SaveToFile('D:\Test.png');
end;

procedure TForm18.FormCreate(Sender: TObject);
begin
  image1.Bitmap.SetSize(Round (image1.Width), Round (image1.Height));
end;

end.
Miniaturansicht angehängter Grafiken
testbild.jpg   progi.jpg  

Geändert von Harry Stahl (12. Apr 2016 um 18:38 Uhr)
  Mit Zitat antworten Zitat