AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls [Firemonkey] Canvas als PNG mit Transparenz speichern
Thema durchsuchen
Ansicht
Themen-Optionen

[Firemonkey] Canvas als PNG mit Transparenz speichern

Ein Thema von milos · begonnen am 11. Apr 2016 · letzter Beitrag vom 12. Apr 2016
Antwort Antwort
Rollo62

Registriert seit: 15. Mär 2007
4.240 Beiträge
 
Delphi 12 Athens
 
#1

AW: [Firemonkey] Canvas als PNG mit Transparenz speichern

  Alt 12. Apr 2016, 06:15
Wenn du ein Bmp hast könntest du damit Speichern
Delphi-Quellcode:
procedure S4Bmp_ToStream( bmpSrc : TBitmap;
                          strmDst : TStream;
                          sExt : String;
                          iQuality : Integer);
var
  Surf : TBitmapSurface;
  vBitMapData : TBitmapData;
  saveParams : TBitmapCodecSaveParams;

begin
  Surf := TBitmapSurface.Create;

  // lock and get the bitmap pixels
  if bmpSrc.Map(TMapAccess.Read, vBitMapData) then
  begin

      try
        Surf.Assign(bmpSrc);

        saveparams.Quality := iQuality; // 85;

        if not TBitmapCodecManager.SaveToStream(strmDst, Surf, sExt, @saveParams) then //'.jpg') then
            raise EBitmapSavingFailed.Create(
                  'Error saving Bitmap to ' + sExt);
    // raise EBitmapSavingFailed.Create(SBitmapSavingFailed);
      finally
        Surf.Free;
      end;


      bmpSrc.Unmap(vBitMapData); // unlock the bitmap

  end;

end;


// Aufruf mit Quality in %
S4Bmp_ToStream( bmpSrc, FileStream_als_Beispiel, '.png', 85);
Info: Den äussere Scope mit Bitmap.Map()... könnte man wohl auch weglassen,
ich hatte das noch von einem Test mit drin, aber ich denke das schadet auch nicht wenn es drin bleibt.


Eigentlich sollte das Canvas-Bitmap die Transparenz richtig drinhaben, müsstest du mal Testen.

Rollo

Geändert von Rollo62 (12. Apr 2016 um 06:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
512 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: [Firemonkey] Canvas als PNG mit Transparenz speichern

  Alt 12. Apr 2016, 14:12
Hallo,

danke für die antwort!
Leider bekomme ich damit wieder eine Leere Datei die aber die richtige grösse hat, jedoch keine gezeichneten Pixel enthält.

Ich zeichne nun direkt auf ein Bitmap und rufe deine Funktion so auf:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  LBitmap : TBitmap;
  LStream : TFileStream;
begin
  LBitmap := TBitmap.Create; // erstelle bitmap
  LBitmap.Width := 50; // setze grösse
  LBitmap.Height := 50;

  LBitmap.Canvas.Fill.Color := $FFFF0000; // brush color auf rot setzen

  LBitmap.Canvas.DrawRect(RectF(0,0,10,50),0,0,[],1); // rectangle zeichnen

  LStream := TFileStream.Create('./DP.png', fmCreate or fmOpenWrite); // file stream erstellen

  S4Bmp_ToStream( LBitmap, LStream, '.png', 85); // funktionsaufruf
end;
Mache ich was falsch?

Im Anhang habe ich noch die DP.png angehängt die erzeugt wird. Sie ist da, aber eben halt ein leeres Bild... :/

Freundliche Grüsse und vielen dank für die Hilfe
Angehängte Grafiken
Dateityp: png DP.png (152 Bytes, 54x aufgerufen)
Milos
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.561 Beiträge
 
Delphi 12 Athens
 
#3

AW: [Firemonkey] Canvas als PNG mit Transparenz speichern

  Alt 12. Apr 2016, 17: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.
Angehängte Grafiken
Dateityp: jpg Testbild.jpg (116,4 KB, 17x aufgerufen)
Dateityp: jpg Progi.jpg (15,9 KB, 14x aufgerufen)

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

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
512 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: [Firemonkey] Canvas als PNG mit Transparenz speichern

  Alt 12. Apr 2016, 17:58
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).
Danke Harry, das war der entscheidende Tipp und es funktioniert nun einwandfrei!

Vielen vielen dank, dachte mir schon das da etwas kleines aber wichtiges fehlt... Mir standen schon die Haare zu berge!

Freundliche Grüsse
Milos
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.240 Beiträge
 
Delphi 12 Athens
 
#5

AW: [Firemonkey] Canvas als PNG mit Transparenz speichern

  Alt 12. Apr 2016, 18:07
Du solltest dir meinen Vorschlag auch nochmal ansehen, denn nicht alle Plattformen unterstützen alle Formate.

http://docwiki.embarcadero.com/Libra...aphics.TBitmap

http://docwiki.embarcadero.com/Libra...te_Bildformate

Rollo
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
512 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: [Firemonkey] Canvas als PNG mit Transparenz speichern

  Alt 12. Apr 2016, 20:04
Du solltest dir meinen Vorschlag auch nochmal ansehen, denn nicht alle Plattformen unterstützen alle Formate.

http://docwiki.embarcadero.com/Libra...aphics.TBitmap

http://docwiki.embarcadero.com/Libra...te_Bildformate

Rollo
Guter Hinweis.

Sobald ich mit Begin/EndScene arbeite kann ich auch ohne Probleme mit TBitmapSufrace das Canvas abspeichern. Danke!

Freundliche Grüsse
Milos
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz