[GELÖST] Schriftfarbe zuweisen funktioniert nicht

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Nukualofa
Beiträge: 3
Registriert: So 22. Jan 2017, 12:32

[GELÖST] Schriftfarbe zuweisen funktioniert nicht

Beitrag von Nukualofa »

Ich will auf einer Form ein Bild, das auch transparente Bereiche enthält, anzeigen und darauf noch einen Text schreiben. Bisher mache ich das so:

Code: Alles auswählen

    bild:= TImage.Create(Self);
      bild.Parent, Left, Top, Height, Width etc setzen
      png:= TPortableNetworkGraphic.Create;
      png.LoadFromFile('xyz.png');
      png.Canvas.Brush.Style:= bsClear;
      png.Canvas.Font.Size:= 14;
      png.Canvas.Font.Color:= clBlack;
      png.Canvas.Font.Style:= [fsBold];
      png.Canvas.TextOut(12, 8, 'Test');
      bild.Picture.Assign(png);


Das Problem ist, dass der Befehl png.Canvas.Font.Color:= clBlack scheinbar ignoriert wird. Stattdessen entspricht die Schriftfarbe der Hintergrundfarbe der Form, auf der das Image platziert ist, es wird also quasi transparent geschrieben. Ersetze ich den letzten Befehl durch bild.Canvas.Draw(0, 0, png) ist die Schrift zwar schwarz, dafür aber auch alle (anderen) transparenten Bereiche von bild.

Meine Fragen lauten:

1. Woran liegt das bzw. wie lässt sich das ändern?
2. Mir erscheint mein Ansatz irgendwie doppelt gemoppelt, weil ich zur Anzeige des Bildes ein Image (bild) und das Objekt png benötige. Geht das nicht irgendwie einfacher?

Bin für jede Hilfe dankbar!
Zuletzt geändert von Lori am Mo 23. Jan 2017, 18:34, insgesamt 2-mal geändert.
Grund: Highlighter

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

Re: Schriftfarbe zuweisen funktioniert nicht

Beitrag von Mathias »

Suchst du so was ?

Code: Alles auswählen

  TForm1 = class(TForm)
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure Image1Paint(Sender: TObject);
 
.......
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Image1.Picture.LoadFromFile('project1.ico');
end;
 
procedure TForm1.Image1Paint(Sender: TObject);
begin
  Image1.Canvas.Brush.Style := bsClear;
  Image1.Canvas.TextOut(10, 10, 'Hello world');
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Schriftfarbe zuweisen funktioniert nicht

Beitrag von wp_xyz »

Der Hex-Wert von clBlack ist $00000000. Bei einem transparenten png wird das oberste Halbbyte als Alpha (=Deckkraft) interpretiert - 0 bedeutet hier: voll transparent. Daher erscheint die Schrift transparent. Naheliegend wäre nun, den Alpha-Wert auf $FF zu setzen, also statt clBlack die Farbe $FF000000 zu verwenden. Aber auch dies geht schief, weil die LCL das oberste Halbbyte für die Systemfarben reserviert und je nach Wert in eine andere Farbe umkodiert.

Das LazInterfaceImage dagegen unterstützt den Alpha-Kanal. Nur weicht die Anwendung etwas von der LCL ab - am besten schaust du dir das im wiki an:
- http://wiki.lazarus.freepascal.org/Fast ... zIntfImage
- http://wiki.freepascal.org/Developing_w ... zIntfImage

Und die Textausgabe macht es noch etwas komplizierter. Aber der folgende Code funktioniert:

Code: Alles auswählen

uses
  GraphType, FpImage, intfGraphics, EasyLazFreeType, LazFreeTypeIntfDrawer;
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var
  png: TPortableNetworkGraphic;
  intfImg: TLazIntfImage;
  drw: TIntfFreeTypeDrawer;
  fnt: TFreeTypeFont;
begin
  png := TPortableNetworkGraphic.Create;
  try
    png.LoadFromFile('transparent.png');
    intfImg := png.CreateIntfImage;
    drw := TIntfFreeTypeDrawer.Create(intfImg);
    fnt := TFreeTypeFont.Create;
    try
      fnt.Name := 'c:\Windows\fonts\Arial.ttf';
      fnt.SizeInPixels := 36;
      fnt.Hinted := true;
      fnt.ClearType := true;
      fnt.Quality := grqHighQuality;
      drw.DrawText('Lazarus', fnt, 0, 100, colBlack);
      png.LoadFromIntfImage(intfImg);
      Image1.Picture.Assign(png);
    finally
      fnt.Free;
      drw.Free;
      intfImg.Free;
    end;
  finally
    png.Free;
  end;
end;
Dateianhänge
transparent_png.zip
(48.94 KiB) 124-mal heruntergeladen

Nukualofa
Beiträge: 3
Registriert: So 22. Jan 2017, 12:32

Re: Schriftfarbe zuweisen funktioniert nicht

Beitrag von Nukualofa »

Vielen Dank für eure schnellen Antworten!

Ich hab gerade im englischen Lazarus-Forum auch noch eine andere Lösungsmöglichkeit gefunden, siehe http://forum.lazarus.freepascal.org/ind ... 01.15.html, 2. Beitrag von oben.

Antworten