AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Canvas.TextOut mit Text Shadow-Erweiterung

Ein Thema von s.h.a.r.k · begonnen am 25. Jul 2011 · letzter Beitrag vom 29. Jul 2011
Antwort Antwort
Sailor

Registriert seit: 20. Jul 2008
Ort: Balaton
112 Beiträge
 
Delphi 2010 Professional
 
#1

AW: Canvas.TextOut mit Text Shadow-Erweiterung

  Alt 26. Jul 2011, 11:20
Verstehe ich nicht, das Weichzeichnen ist doch schon auf dem Bitmap erfolgt.
Der wird jetzt auf den Canvas gezeichnet und dann anschließend an die gleiche
Position nochmals den Text auf den Canvas mit transparentem Hintergrund ausgeben.
Oder habe ich da was nicht mitgekriegt?
  Mit Zitat antworten Zitat
Sailor

Registriert seit: 20. Jul 2008
Ort: Balaton
112 Beiträge
 
Delphi 2010 Professional
 
#2

AW: Canvas.TextOut mit Text Shadow-Erweiterung

  Alt 26. Jul 2011, 11:37
Anbei noch eine kleine Demo
Angehängte Grafiken
Dateityp: jpg Test.JPG (17,7 KB, 76x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

AW: Canvas.TextOut mit Text Shadow-Erweiterung

  Alt 26. Jul 2011, 11:48
Achso, du meintest den zweiten TextOut-Befehl auf dem eigentlichen Canvas. Dabei setze ich den Brush-Style auf bsClear, was ja den selben Effekt hat.

Mein Problem ist eigentlich nur, dass dieser geblurrte Puffer-Bitmap eine Hintergrundfarbe hat und diese beim Pinsel auf dem Canvas übernommen wird. Was ich damit meine ist klar?

Bin gerade dabei das hier umzusetzen, nur klappts noch nicht so recht...
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.689 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: Canvas.TextOut mit Text Shadow-Erweiterung

  Alt 26. Jul 2011, 12:18
Wenn du beim Blur den Alphakanal mit verarbeitest, hast du doch schon die richtigen Transparenzwerte. Du musst nur darauf achten, dass das Alpha vom weichzuzeichnenden Bitmap 255 bei der Schrift ist, und 0 sonst.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#5

AW: Canvas.TextOut mit Text Shadow-Erweiterung

  Alt 26. Jul 2011, 12:27
Wenn du beim Blur den Alphakanal mit verarbeitest, hast du doch schon die richtigen Transparenzwerte. Du musst nur darauf achten, dass das Alpha vom weichzuzeichnenden Bitmap 255 bei der Schrift ist, und 0 sonst.
Wenn du mir nun noch sagst, wie ich das anstellen soll, dann wäre ich glücklich Den Gaussian Blur, den ich implementiert habe, der beachtet den Alpha-Kanal, in so fern das Pixel-Format pf32bit ist.

Canvas.TextOut() setzt jedenfalls keinerlei Alpha-Kanal, denn ich hatte schon testweise den Alpha-Kanal alles Pixel auf 0 gesetzt und darauf dann ein TextOut() gemacht.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.494 Beiträge
 
Delphi 12 Athens
 
#6

AW: Canvas.TextOut mit Text Shadow-Erweiterung

  Alt 26. Jul 2011, 12:55
Die Unit TransparentText im Anhang ist eine kleine Spielerei von mir:
Delphi-Quellcode:
uses
  TransparentText;

var
  iBlur: Integer;
  lBlur: IBitmapFilter;
  X, Y: Integer;
  s: string;
  dTransp: Double;
begin
{...}

  if iBlur > 0 then
    lBlur := TBlurFilter.Create(iBlur);
// Image.Canvas.Font.Name :=
  Image.Canvas.Font.Style := [fsBold{, fsItalic}];
  Image.Canvas.Font.Size := 48;
  Image.Canvas.Font.Color := clRed;
  TransparentTextOut(Image.Canvas, X, Y, s, dTransp, lBlur);
end;
Angehängte Dateien
Dateityp: pas TransparentText.pas (7,5 KB, 41x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#7

AW: Canvas.TextOut mit Text Shadow-Erweiterung

  Alt 26. Jul 2011, 13:23
Danke dir schon mal. Das mit dem vorherigen Kopieren wollte ich bisher umgehen, aber wie mir so scheint, da ich dann ja evtl. Probleme wegen dem Blur bekomme.

Meine Idee, um den geblurrten Text, der evtl. semitransparent ist, auf ein Canvas zu bekommen, war nun die folgende, die auch theoretisch funktionieren müsste:
  • Erzeuge ein Bitmap A und fülle es mit der gewünschten Textfarbe, also der Farbe, in der später der Text-Shadow erscheinen soll. Dieses Bitmap muss 32bit haben, da Alpha-Kanal vorhanden sein muss.
  • Erzeuge ein weiteres Bitmap B, welches keinen Alpha-Kanal benötigt, fülle es mit schwarzer Farbe und drucke darauf in weißer Schrift den gewünschten Text. Die Farben schwarz und weiß sind hier wichtig, siehe folgender Schritt.
  • Gehe Pixel für Pixel von Bitmap A durch und setze den Alpha-Kanal der folgenden Formel nach:
    BitmapAPixel.rgbReserved := EnsureRange((BitmapBPixel.rgbtRed + BitmapBPixel.rgbtGreen + BitmapBPixel.rgbtBlue) div 3, 0, 255); Im Anhang findet ihr einen Screenshot der entstehenden Alpha-Werte.
  • Via Windows.AlphaBlend() kann man dann das geänderte Bitmap A auf ein gewünschtes Canvas kopieren.
Aber wer glaubt, dass der Spass auf Anhieb funktionieren würde, der ist leider im Irrtum Also entweder hab ich einen dummen Fehler in meinem Code, oder AlphaBlend() macht etwas, was ich so nicht weiß oder was es so nicht machen soll. Links im Screenshot seht ihr ganz oben das Bitmap A, darunter Bitmap B mit Text (hier eine nicht geblurrte Variante) und darunter die "Grafik" die AlphaBlend() auf die Form zeichnet. Wenn ihr genau hinseht, dann entdeckt ihr in der untersten Grafik, dass der Text einen Hintergrund hat, was ja so nicht sein sollte, da die Alpha-Werte an der Stelle ja gleich 0 sind. Der Farbwert an dieser Stelle ist: $fff0f0, also ein ganz leichtes rot.

Anbei findet ihr mal das aktuelle Projekt, falls da mal jemand reinschauen will.
Angehängte Grafiken
Dateityp: jpg screenshot.jpg (148,7 KB, 52x aufgerufen)
Angehängte Dateien
Dateityp: rar v2.rar (562,9 KB, 20x aufgerufen)
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  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:36 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