[GELÖST] Schriftfarbe zuweisen funktioniert nicht

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...

[GELÖST] Schriftfarbe zuweisen funktioniert nicht

Beitragvon Nukualofa » 22. Jan 2017, 13:13 [GELÖST] Schriftfarbe zuweisen funktioniert nicht

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 23. Jan 2017, 18:34, insgesamt 2-mal geändert.
Grund: Highlighter
Nukualofa
 
Beiträge: 2
Registriert: 22. Jan 2017, 12:32

Beitragvon Mathias » 22. Jan 2017, 17:57 Re: Schriftfarbe zuweisen funktioniert nicht

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 22. Jan 2017, 18:08 Re: Schriftfarbe zuweisen funktioniert nicht

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;
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
wp_xyz
 
Beiträge: 2670
Registriert: 8. Apr 2011, 08:01

Beitragvon Nukualofa » 22. Jan 2017, 18:55 Re: Schriftfarbe zuweisen funktioniert nicht

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.
Nukualofa
 
Beiträge: 2
Registriert: 22. Jan 2017, 12:32

• Themenende •

Zurück zu Multimedia



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried