Entwickler-Ecke
Windows API - PlgBlt, hbmmask: Schriftzug schräg in Bitmap.Canvas
GuaAck - Di 29.11.22 23:50
Titel: PlgBlt, hbmmask: Schriftzug schräg in Bitmap.Canvas
Hallo,
ich möchte in einer
Bitmap.Canvas einen Text schreiben, der z. B. nach rechts oben läuft. Für horizontalen Text nutze ich
Canvas.TextOut, geht bestens.
Für einen nicht horizontalen Text nutze ich die Funktion
PlgBlt der Windows API. Ich schreibe meinen Text in ein neues Hilfs-Bitmap und kopiere dann den Textbereich in einen schiefen Bereich meiner Haupt-Bitmap. Geht einwandfrei.
Nun möchte ich, dass nur die eigentlichen Buchstaben kopiert werden, der Hintergrund des Textes in meiner Hilfs-Bitmap soll also als transparent interpretiert werden. Dafür gibt es in
PlgBlt einen Parameter zur Maskierung(
hbmmask) und bei der Bitmap Methoden
mask() und die Eigenschaft
maskhandle. Leider ist die Hilfe dazu in der Windows-SDK sehr dürftig und Google findet auch kaum was. Meine Versuche waren auch erfolglos.
Es wäre für mich einfach, die Farbe jeden Pixels der Zielfläche selbst zu berechnen und selbst einzufärben oder für den Hintergrund eben nicht. Aber wenn
PglBlt das kann, dann würde ich diese Möglichkeit auch gerne nutzen.
Kennt jemand einen Link zu einer Erläuterung, wie das mit
hbmmask funktioniert oder hat ein paar Zeilen Code dazu?
Wohl eine eher exotische Frage, aber vielleicht habe ich ja Glück, so wie ich schon mehrfach bei wenig Hoffnung Tipps hier erhalten habe, die mich ans Ziel gebracht haben.
Viele Grüße
GuaAck
Moderiert von Th69: Delphi-Tags hinzugefügt
Th69 - Mi 30.11.22 09:25
Hallo,
du meinst
PlgBit [
https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-plgblt]?
So wie ich das verstehe ist
hbmMask eine komplette Bitmap (gleiche Größe wie die Quell-Bitmap), nur eben monochrom, d.h. nur schwarz (0) oder weiß (1) - und nur die "weißen" Pixel würden dann kopiert.
Du mußt also dann die Pixel deiner Quell-Bitmap iterieren und für den transparenten Hintergrund eine 0 eintragen, ansonsten 1.
GuaAck - Mi 30.11.22 16:24
Danke zunächst.
Ja, so habe ich das auch verstanden und hatte es auch so probiert, aber ohne Erfolg. Vielleicht habe ich da irgendwo einen Fehler gemacht, werde es noch einmal probieren und melde mich dann.
Gruß
GuaAck
GuaAck - Di 06.12.22 00:24
Hallo,
Danke für die Tipps. ich habe es jetzt auch mit
PlgBlt und Maske hinbekommen. Es gibt ja die Funktion
TBitmap.mask(Transparentcolor:TColor), da darf man nicht die Hintergrundfarbe (die man nicht haben will) sondern die Textfarbe einsetzen, dann geht es.
Also:
Alternative A):
Bitmap.Mask(Textfarbe) und
Bitmap.maskhandle als Maske einsetzen. (Besseres Schriftbild)
Alternative B):
Bitmap.Mask(Hintergrundfarbe), dann Bitmap invertieren und
Bitmap.handle als Maske einsetzen. (Schlechteres Schriftbild)
SetWorldTransformation ist ein toller Tipp, werde ich mir merken und bei Gelegenheit probieren. (Sinus und Cosinus kann ich.)
Danke nochmals,
Gruß GuaAck
Moderiert von Th69: Delphi-Tags hinzugefügt
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!