![]() |
Canvas.TextOut mit Text Shadow-Erweiterung
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 ![]() 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 ( ![]() 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 :wall: |
AW: Canvas.TextOut mit Text Shadow-Erweiterung
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) |
AW: Canvas.TextOut mit Text Shadow-Erweiterung
[edit]irrelevant[/edit]
|
AW: Canvas.TextOut mit Text Shadow-Erweiterung
Zitat:
-- Edit: Bin evtl. doch fündig geworden -> ![]() ![]() |
AW: Canvas.TextOut mit Text Shadow-Erweiterung
Setze vor dem Textout den Hintergrund auf Transparent:
SetBkMode(Canvas.Handle,Windows.Transparent) Dann bleibt der Hintergrund unter dem Text erhalten. |
AW: Canvas.TextOut mit Text Shadow-Erweiterung
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.
|
AW: Canvas.TextOut mit Text Shadow-Erweiterung
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? |
AW: Canvas.TextOut mit Text Shadow-Erweiterung
Liste der Anhänge anzeigen (Anzahl: 1)
Anbei noch eine kleine Demo
|
AW: Canvas.TextOut mit Text Shadow-Erweiterung
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 ![]() |
AW: Canvas.TextOut mit Text Shadow-Erweiterung
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.
|
AW: Canvas.TextOut mit Text Shadow-Erweiterung
Zitat:
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. |
AW: Canvas.TextOut mit Text Shadow-Erweiterung
Liste der Anhänge anzeigen (Anzahl: 1)
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; |
AW: Canvas.TextOut mit Text Shadow-Erweiterung
Liste der Anhänge anzeigen (Anzahl: 2)
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:
Anbei findet ihr mal das aktuelle Projekt, falls da mal jemand reinschauen will. |
AW: Canvas.TextOut mit Text Shadow-Erweiterung
![]() Lies mal den Komentar: Zitat:
|
AW: Canvas.TextOut mit Text Shadow-Erweiterung
Liste der Anhänge anzeigen (Anzahl: 2)
Okay :mrgreen:
Habs nun schon anders gelöst. Allein mein Gaussian Blur ist leider noch etwas langsam, weswegen es bei größeren Font-Größen etwas dauert (~500ms) bist das Bild da ist. Anbei mal eine Demo und der Source. Für meine Zwecke reicht das aber schon vollkommen :stupid: |
AW: Canvas.TextOut mit Text Shadow-Erweiterung
Zitat:
|
AW: Canvas.TextOut mit Text Shadow-Erweiterung
[OT]
Zitat:
PS: ![]() [/OT] |
AW: Canvas.TextOut mit Text Shadow-Erweiterung
Zitat:
Viele Grüße |
AW: Canvas.TextOut mit Text Shadow-Erweiterung
Oh Schande... Hab ich die da mit eincompiliert?! Das war nicht erwünscht, sorry. Ist alles Bestandteil meiner eigenen Library, die ich gerade aufbaue und bald mal freigeben werde. Ich schau mal, dass ich das so reduziere, dass es nur noch das Pinseln umfasst. Einene Moment...
-- Edit: Anbei einfach mal die aktuelle Version meinen Sammlung. -- Edit: Anhang entfernt und im 7z-Format ![]() |
AW: Canvas.TextOut mit Text Shadow-Erweiterung
Die Exe-Demo funktioniert leider auch nicht:
Zitat:
|
AW: Canvas.TextOut mit Text Shadow-Erweiterung
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
So, anbei das Paket im 7z-Format und im Examples-Ordner befindet sich eine gefixte Version, ohne Einbindung von FastMM. |
AW: Canvas.TextOut mit Text Shadow-Erweiterung
Btw. Ich teste grad mal ein wenig rum, ganz nette Sachen bei:thumb:
Btw. sowas funzt ned?
Code:
Label1.Canvas.ShadowedTextOut(8, 8, 'Test!', 2, 2, 4, 0, 255);
|
AW: Canvas.TextOut mit Text Shadow-Erweiterung
Hm, da stimmt wohl eine Berechnung eines Rechtecks nicht so recht :gruebel:
-- Edit: Doch, ist alles korrekt imho. Schau mal in die Zeile 200 der ApLib.ClassHelpers. Dort pinsel ich via TextOut die Schrit auf das Canvas und das genau an die Stelle, die du via X und Y Koordinaten übergibst. Und nachdem das hier eine Frage war. Zitat:
|
AW: Canvas.TextOut mit Text Shadow-Erweiterung
Naja so tief bin ich nicht eingestiegen in die Sourcen fiehl mir nur grad auf weil genau für nen Label könnt ich den Shadowtext gut brauchen. Gibts ein SVN zu deinen Sourcen falls es Opensource bleibt bzw. Du Sachen fixt?
|
AW: Canvas.TextOut mit Text Shadow-Erweiterung
Zitat:
Jedenfalls hoffe ich, dass ich das binnen ein bis zwei Monate endlich mal eine Beta veröffentlichen kann. Dann erfährst du definitiv hier davon ;) Hin und wieder poste ich ein Version der Lib in einem Beitrag, da ich sonst die Lib auseinandere nehmen müsste, wenn ich eine Demo oder dergleichen poste -- so wie es eben hier der Fall ist. Somit, in alter Blizzard-Manier: It's done, when it's done! :stupid: PS: Es bleibt auf jedenfall Opensource, da mir die DP schon so viel gegeben hat, dass man so einer Community auch was zurückgeben muss. Werde wohl auch die MIT Lizenz nutzen, da diese recht kurz und frei gehalten ist. |
AW: Canvas.TextOut mit Text Shadow-Erweiterung
Ja würd mich freuen wenn Du mir eine Info zukommen läßt wenns mal soweit ist mit der Beta...
Was ich vorschlagen würde wäre ggf. Wenn Du halt Demos machst nutz wenn Du kannst Hauptsächlich standart VCL für Einstellungen und der gleichen. (Beispiel ShadowText man will ja nicht immer ne Komplette Sammlung installieren um eine Sache anzusehen.) Was die Sache mit dem gerade besprochenen TLabel anbelangt also bisher funzt es nicht bei mir, muß ich mir noch mal genauer ansehen an den Coords sollte es eigentlich nicht liegen, da die nun auf 0, 0 stehen anstelle von 8,8 also sollte die im Rect liegen) |
AW: Canvas.TextOut mit Text Shadow-Erweiterung
Pass aber auf die AutoSize-Eigenschaft deines Labels auf. Ich habe vorher einfach die Caption entfernt, dann die Größe via Designer gesetzt und AutoSize gleich False gesetzt. Hat dann eben wunderbar geklappt gehabt.
Bzgl. den Demos: Jup, da hast du wohl Recht :thumb: Dieses BMSpinEdit nutze ich nur sehr gerne, da es von der Usability her klasse ist, ebenso die (Sp-)TBX-Komponenten. |
AW: Canvas.TextOut mit Text Shadow-Erweiterung
Zitat:
|
AW: Canvas.TextOut mit Text Shadow-Erweiterung
Für alle die sich mit AlphaBlend rumärgern müssen, hier noch die Änderung am urspünglichen Code:
Delphi-Quellcode:
var
Alpha: word; {...} for Col in [0 .. Buffer.Width - 1] do begin BufferPixel := @BufferScanline[Col]; MaskPixel := @MaskScanline[Col]; Alpha := (MaskPixel.rgbtRed + MaskPixel.rgbtGreen + MaskPixel.rgbtBlue) div 3; // premultiplied alpha, red, green and blue channel BufferPixel.rgbRed := (BufferPixel.rgbRed * Alpha) shr 8; BufferPixel.rgbGreen := (BufferPixel.rgbGreen * Alpha) shr 8; BufferPixel.rgbBlue := (BufferPixel.rgbBlue * Alpha) shr 8; BufferPixel.rgbReserved := Alpha; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:50 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 by Thomas Breitkreuz