Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Canvas.TextOut mit Text Shadow-Erweiterung (https://www.delphipraxis.net/161879-canvas-textout-mit-text-shadow-erweiterung.html)

s.h.a.r.k 26. Jul 2011 12:27

AW: Canvas.TextOut mit Text Shadow-Erweiterung
 
Zitat:

Zitat von Medium (Beitrag 1113587)
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 :mrgreen: 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.

Blup 26. Jul 2011 12:55

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;

s.h.a.r.k 26. Jul 2011 13:23

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:
  • 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:
    Delphi-Quellcode:
    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 :wall: 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.

Blup 26. Jul 2011 15:12

AW: Canvas.TextOut mit Text Shadow-Erweiterung
 
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Lies mal den Komentar:
Zitat:

I hope developer who designed this method is fired already?
:)

s.h.a.r.k 26. Jul 2011 15:26

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:

Blup 26. Jul 2011 15:55

AW: Canvas.TextOut mit Text Shadow-Erweiterung
 
Zitat:

Zitat von s.h.a.r.k (Beitrag 1113656)
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.

Teste mal TBlurFilter aus meiner Unit, der ist eigentlich recht flott.

Namenloser 26. Jul 2011 17:03

AW: Canvas.TextOut mit Text Shadow-Erweiterung
 
[OT]
Zitat:

Zitat von Blup (Beitrag 1113653)
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Lies mal den Komentar:
Zitat:

I hope developer who designed this method is fired already?
:)

Lies auch die Antwort darüber ;)
PS: Premultiplied Alpha rules
[/OT]

stOrM 26. Jul 2011 18:59

AW: Canvas.TextOut mit Text Shadow-Erweiterung
 
Zitat:

Zitat von s.h.a.r.k (Beitrag 1113656)
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:

Könntest Du den Democode ggf. mal mit anhängen das ganze sieht seht interessant aus leider fehlen ein paar Dinge wie: ApLib.Collections

Viele Grüße

s.h.a.r.k 26. Jul 2011 19:34

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 hier neu angehängt.

Namenloser 26. Jul 2011 19:39

AW: Canvas.TextOut mit Text Shadow-Erweiterung
 
Die Exe-Demo funktioniert leider auch nicht:
Zitat:

---------------------------
Project1.exe - Komponente nicht gefunden
---------------------------
Die Anwendung konnte nicht gestartet werden, weil FastMM_FullDebugMode.dll nicht gefunden wurde. Neuinstallation der Anwendung könnte das Problem beheben.
---------------------------
OK
---------------------------
PS: Wäre schön, wenn du für Archive ein offenes Format wie 7zip oder ZIP statt RAR verwenden würdest.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:56 Uhr.
Seite 2 von 3     12 3      

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