Transparente Bitmap mit clDefault

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
wennerer
Beiträge: 507
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Transparente Bitmap mit clDefault

Beitrag von wennerer »

Hallo Forum,
ich bin da auf ein Problem gestoßen bei dem ich nicht weiter komme. Ich erzeuge eine Bitmap und setzte Transparent auf true. TransparentColor soll die Farbe der Form sein (weil ich eigentlich das Bitmap mit CopyRect fülle). So lange ich als Form.Color nicht clDefault verwende klappt alles ohne Probleme. Verwende ich aber clDefault habe ich einen schwarzen Hintergrund. Ich vermute mal das clDefault irgendwie auf die Standardfarbe des Kontrolls (hier die Form) verweist und deshalb kein direkter Farbwert dahinter liegt. In der Unit Graphics ist es so deklariert:

Code: Alles auswählen

clDefault = TColor($20000000);
Die drei unteren Byte sind ja dann wohl jeweils 0 so das das schwarz wäre? Aber was macht das höchstwertige Byte? Gibt es eine Möglichkeit den Farbwert der tatsächlich ausgegebenen Farbe zu ermitteln? Oder hab ich gerade nur einen Denkfehler?

Ich habe hier noch einen minimal Code angehängt damit man sich besser vorstellen kann was ich meine:

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs,LclIntf;

type

  { TForm1 }

  TForm1 = class(TForm)
    MyBitmap : TBitmap;
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
 self.Color:= clSilver;//clDefault;

 MyBitmap := TBitmap.Create;
 MyBitmap.SetSize(400,400);
 MyBitmap.TransparentColor:=self.Color;
 MyBitmap.Transparent:=true;
 MyBitmap.Canvas.Pen.Color:=self.Color;
 MyBitmap.Canvas.Brush.Color:=self.Color;
 MyBitmap.Canvas.Rectangle(0,0,400,400);

 MyBitmap.Canvas.Pen.Color:=clyellow;
 MyBitmap.Canvas.Brush.Color:=clred;
 MyBitmap.Canvas.Ellipse(20,20,80,80);
end;

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
 MyBitmap.Free;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
 canvas.Brush.Color:=clgreen;
 canvas.Rectangle(150,10,200,500);
 canvas.Draw(100,100,MyBitmap);
end;

end.

Viele Grüße
Bernd

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Transparente Bitmap mit clDefault

Beitrag von Socke »

wennerer hat geschrieben:
Mo 8. Jun 2020, 21:21

Code: Alles auswählen

clDefault = TColor($20000000);
Die drei unteren Byte sind ja dann wohl jeweils 0 so das das schwarz wäre? Aber was macht das höchstwertige Byte? Gibt es eine Möglichkeit den Farbwert der tatsächlich ausgegebenen Farbe zu ermitteln? Oder hab ich gerade nur einen Denkfehler?
clDefault bzw. alle "magischen" Konstanten sind keine echten Farben und können vom Widgetset beim Zeichnen auch durch Texturen dargestellt werden. Daher wirst du es wohl nicht als Farbe für Transpararenz verwenden können.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Transparente Bitmap mit clDefault

Beitrag von Mathias »

Daher wirst du es wohl nicht als Farbe für Transpararenz verwenden können.
Da kann man sich die Zähne ausbeisen.
System intern, ist das 4. Byte der Alphawert. Aber leider ist es fast unmöglich dies TBitmap beizubringen.
Wen man TBitmap.LoadFromFile mit einer Alpha-Bitmap aufruft, ist alles bestens. Aber selbst solche Pixel zu setzen fast nicht möglich.
ZT. kann man dies mit TRawImage umgehen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wennerer
Beiträge: 507
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Transparente Bitmap mit clDefault

Beitrag von wennerer »

Vielen Dank für die Antworten.

Viele Grüße
Bernd

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Transparente Bitmap mit clDefault

Beitrag von Mathias »

Vielleicht hilft dir dies weiter. https://wiki.freepascal.org/BGRABitmap/de
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wennerer
Beiträge: 507
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Transparente Bitmap mit clDefault

Beitrag von wennerer »

Falls nach mir Jemand auf das gleiche Problem stößt möchte ich noch meine Lösung hier anfügen.
Da ich ja immer die Farbe der Form haben möchte habe ich einfach clDefault mit clForm ersetzt. Warum ich für die Lösung so lange benötigt habe weiß ich allerdings auch nicht. :lol:

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs,LclIntf;

type

  { TForm1 }

  TForm1 = class(TForm)
    MyBitmap : TBitmap;
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
var ClearColor : TColor;
begin
 self.Color:= clDefault;
 //self.Color:= clsilver;
 //self.Color:= clinfobk;

 if self.Color = cldefault then ClearColor:=clForm
 else ClearColor:=self.Color;

 MyBitmap := TBitmap.Create;
 MyBitmap.SetSize(400,400);
 MyBitmap.TransparentColor:=ClearColor;
 MyBitmap.Transparent:=true;
 MyBitmap.Canvas.Pen.Color:=ClearColor;
 MyBitmap.Canvas.Brush.Color:=ClearColor;
 MyBitmap.Canvas.Rectangle(0,0,400,400);

 MyBitmap.Canvas.Pen.Color:=clyellow;
 MyBitmap.Canvas.Brush.Color:=clred;
 MyBitmap.Canvas.Ellipse(20,20,80,80);
end;

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
 MyBitmap.Free;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
 canvas.Brush.Color:=clgreen;
 canvas.Rectangle(150,10,200,500);
 canvas.Draw(100,100,MyBitmap);
end;

end.
Viele Grüße Bernd

Antworten