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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)