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
Seite 1 von 3  1 23      
Benutzerbild von s.h.a.r.k
s.h.a.r.k

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

Canvas.TextOut mit Text Shadow-Erweiterung

  Alt 25. Jul 2011, 20:49
Einen wunderschönen guten Abend zusammen,

hatte mir vor ein paar Tagen gedacht, dass ich "schnell" mal eine TextOut-Methode schreibe, die mir einen Text auf ein Canvas druckt -- was das normale TextOut() bisher ja kann -- und eben dazu noch einen passenden Schatten, analog zum CSS text-shadow.

So, meine Idee war die folgende: ich drucke in ein Buffer-Bitmap (PixelFormat: pf32bit, AlphaFormat: afDefined) den Text (übliches TextOut), lasse einen Weichzeichner drüber laufen (Gaussian Blur), pinsel die Bitmap auf das Canvas und drucke dann via dem üblichen TextOut den Text drauf. Soweit, so gut, aber ich habe nicht bedacht, dass mit hier die fehlende Transparenz einen Strich durch die Rechnung macht.

Ich hatte mir überlegt, das Bitmap komplett auf transparent, also bei jedem Pixel den Alpha-Kanal auf 0, zu setzen. Drucke ich den Text dann drauf, bleibt jedes Pixel transparent -> schlecht. Den Text direkt auf das Canvas drucken und darauf blurren ist blöde, da ja schon vorher etwas auf dem Canvas sein kann.

Irgendwie fällt mir im Moment nichts ein, wie ich dem Problem beikommen könnte. Ich will doch einfach nur einen Text auf einen transparenten Layer drucken, diesen blurren und unter Beachtung des Alpha-Kanals diesen Layer auf ein Canvas bringen
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

AW: Canvas.TextOut mit Text Shadow-Erweiterung

  Alt 25. Jul 2011, 21:11
text auf ein Canvas malen, invertieren und als alphawerte für ein neues (komplett schwarzes) Bild hernehmen

Also quasi wie deine erste Lösung, nur statt einem schwarz/weiß übergang eben ein schwarz/transparent Übergang. (= statt einem Pixel mit wert 200 einen mit 0 und alpha = 55)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Canvas.TextOut mit Text Shadow-Erweiterung

  Alt 26. Jul 2011, 07:18
[edit]irrelevant[/edit]

Geändert von Namenloser (26. Jul 2011 um 07:19 Uhr) Grund: Sollte um diese Uhrzeit besser nicht posten...
  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
 
#4

AW: Canvas.TextOut mit Text Shadow-Erweiterung

  Alt 26. Jul 2011, 11:31
text auf ein Canvas malen, invertieren und als alphawerte für ein neues (komplett schwarzes) Bild hernehmen

Also quasi wie deine erste Lösung, nur statt einem schwarz/weiß übergang eben ein schwarz/transparent Übergang. (= statt einem Pixel mit wert 200 einen mit 0 und alpha = 55)
Okay, der Trick ist mir nicht wirklich eingefallen, danke dir! Aber wie genau pinsel ich das dann auf ein Canvas?! Ich habe keinerlei Methode gefunden, die mir das mit einer solchen Bitmaske zeichnet.

-- Edit: Bin evtl. doch fündig geworden -> AlphaBlend. MaskBlt ist ja scheinbar nur für "1-Bit-Transparenz".
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)

Geändert von s.h.a.r.k (26. Jul 2011 um 11:42 Uhr)
  Mit Zitat antworten Zitat
Sailor

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

AW: Canvas.TextOut mit Text Shadow-Erweiterung

  Alt 26. Jul 2011, 11:45
Setze vor dem Textout den Hintergrund auf Transparent:

SetBkMode(Canvas.Handle,Windows.Transparent)

Dann bleibt der Hintergrund unter dem Text erhalten.
  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
 
#6

AW: Canvas.TextOut mit Text Shadow-Erweiterung

  Alt 26. Jul 2011, 11:53
Wenn ich dann aber das den Gaussian Blur anwende, wird quasi alles geblurrt und das will ich ja nicht. Daher ja die Idee mit dem transparenten Puffer-Layer, der dann später auf das Canvas gepinselt werden soll.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Sailor

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

AW: Canvas.TextOut mit Text Shadow-Erweiterung

  Alt 26. Jul 2011, 12: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
 
#8

AW: Canvas.TextOut mit Text Shadow-Erweiterung

  Alt 26. Jul 2011, 12:37
Anbei noch eine kleine Demo
Miniaturansicht angehängter Grafiken
test.jpg  
  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
 
#9

AW: Canvas.TextOut mit Text Shadow-Erweiterung

  Alt 26. Jul 2011, 12: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.686 Beiträge
 
Delphi 2007 Enterprise
 
#10

AW: Canvas.TextOut mit Text Shadow-Erweiterung

  Alt 26. Jul 2011, 13: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
Antwort Antwort
Seite 1 von 3  1 23      


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 13:41 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