Autor Beitrag
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Di 29.11.22 23:50 
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 user profile iconTh69: Delphi-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 30.11.22 09:25 
Hallo,

du meinst PlgBit?
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: 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
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 30.11.22 17:19 
Monochrome Bitmaps werden mit 1 BPP dargestellt, s.a. BITMAP structure (wingdi.h) (unter "Remarks") - außerdem muß diese dann eine Farbpalette beinhalten (laut Windows Bitmap).

Wenn du aber die Delphi-Bitmap verwendest, sollte diese intern alles richtig umsetzen.
Ansonsten mußt du mal deinen Code dazu zeigen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 05.12.22 10:35 
Das Schriftbild sieht finde ich etwas besser aus, wenn du es direkt gedreht auf der Zeichenfläche ausgibst. Vor allem ist es aber deutlich einfacher, weil du keine Zwischenbitmap brauchst.

Das geht mit SetWorldTransform. Ich habe damit vor FMX ein entsprechendes GUI-Framework umgesetzt, bei dem man die Controls drehen, transparent machen usw. konnte.
GuaAck Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: 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 user profile iconTh69: Delphi-Tags hinzugefügt