Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Rand für Canvas TextOut Schrift (https://www.delphipraxis.net/168760-rand-fuer-canvas-textout-schrift.html)

Popov 8. Jun 2012 16:10

Rand für Canvas TextOut Schrift
 
Ich möchte meinem Text, den ich über Canvas.TextOut ausgebe, einen Rand um die Buchstaben spendieren, zwecks besserer Lesbarkeit. Was ich bisher mache ist eine neunfache Ausgabe das Textes, zuerst um einen Pixel zu allen Seiten versetzt in Farbe X, und zuletzt noch einmal in die Mitte mit Farbe Y. Klappt eigentlich relativ gut, zumindest optisch kann man nichts dagegen sagen. Nur gefällt mir das so allgemein nicht. Neun mal einen Text ausgeben ist Quatsch. Gibt es was besseres?

p80286 8. Jun 2012 16:30

AW: Rand für Canvas TextOut Schrift
 
Wie wäre es mit dem "richtigen" Font? (ich glaube shaded ist das Stichwort)
oder habe ich da etwas falsch verstanden?
Deine Methode der Ausgabe finde ich etwas seltsam, da doch im allgemeinen immer ein Buchstabe mit Hintergrund gezeichnet wird?

Gruß
K-H

Popov 8. Jun 2012 16:36

AW: Rand für Canvas TextOut Schrift
 
Wenn man Brush auf bsClear stellt, dann nicht.

Thom 8. Jun 2012 16:39

AW: Rand für Canvas TextOut Schrift
 
Such mal nach den Begriffen "Draw Text Outline". Dazu gibt es etliche Lösungen. Hier ist eine unter Benutzung eines Pfades. Der Nachteil der Pfad-Variante ist allerdings, daß die Umrandung kein Antialiasing besitzt und es sich um einen Vektor-Font handeln muß.

Popov 8. Jun 2012 17:12

AW: Rand für Canvas TextOut Schrift
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das Beispiel ist schon mal interessant, zeichnet aber soweit ich es erkennen kann nur den Rand.

Das (Anlage) ist das Ergebnis meines Codes. Hier mal der Code, nur finde ich den etwas übertrieben.

Delphi-Quellcode:
procedure TextOutFontBorder(Canvas: TCanvas; x, y: Integer; Text: String;
  ColorFont, ColorFontBorder: TColor; FontBorder: Boolean);
var
  bx, by: Integer;
begin
  if FontBorder then
  begin
    Canvas.Font.Color := ColorFontBorder;
    for bx := 0 to 2 do //Font-Rand zeichnen
      for by := 0 to 2 do
        Canvas.TextOut(x + (1 - bx), y + (1 - by), Text);
  end;
  Canvas.Font.Color := ColorFont;
  Canvas.TextOut(x, y, Text);
end;
Aber ich gucke mir an was es unter den Begriffen gibt.

Thom 8. Jun 2012 18:48

AW: Rand für Canvas TextOut Schrift
 
Du mußt vorher dem Pinsel noch eine Farbe zuweisen - dann wird der Pfad auch gefüllt. Allerdings sieht das Ergebnis durch die fehlende Kantenglättung etwas ... unschön aus.

Nutzt Du Graphics32? Dafür gibt es eine schöne Erweiterung, die auch umrandeten Text beherrscht.

Bummi 8. Jun 2012 20:29

AW: Rand für Canvas TextOut Schrift
 
Liste der Anhänge anzeigen (Anzahl: 2)
ich wiederhole mich, sorry, mit GDI+ und Path recht einfach, im Beispiel der Text "Test"
Delphi-Quellcode:
  Graphics := TGPGraphics.Create(BackImage.Canvas.Handle);
  graphics.SetSmoothingMode(SmoothingModeHighQuality);
  graphics.SetTextRenderingHint(TextRenderingHintAntiAlias);
  Brush:=TGPSolidBrush.Create(ColorToTGPColor(clRed,200));
  FontFamily := TGPFontFamily.Create('Arial narrow');
  aFont := TGPFont.Create(FontFamily,80);
  Pen:=TGPPen.Create(ColorToTGPColor(clRed,200));
  fmt:=TGPStringFormat.Create;
  try
  path := TGPGraphicsPath.Create;
  path.AddString('Test',-1,FontFamily,1,150,MakePoint(100,100),fmt);
  Graphics.DrawPath(pen,path);
  // Graphics.FillPath(brush,path);
  path.Free;
  pen.Free;
  Graphics.DrawString(FormatDateTime('hh:nn:ss',now),-1,aFont,MakePoint(0.0,0),Brush);

Popov 9. Jun 2012 08:13

AW: Rand für Canvas TextOut Schrift
 
Danke, gucke ich mir an, aber wieso sorry, hast du es mir gegenüber schon mal erwähnt?

Bummi 9. Jun 2012 08:36

AW: Rand für Canvas TextOut Schrift
 
Nein, aber ich preise die Vorzüge ständig an wenn es um Grafikausgaben geht ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz