Transparenz für Text in GDI

8

Ich habe eine Bitmap mit GDI + erstellt. Ich zeichne Text mit GDI-Drawtext auf diese Bitmap. Mit Hilfe von Drawtext kann ich keine Transparenz anwenden.                   Jede Hilfe oder Code wird geschätzt.

    
VideoDev 27.08.2009, 10:25
quelle

5 Antworten

13

Wenn Sie Text ohne Hintergrundfüllung zeichnen möchten, SetBkMode(hdc,TRANSPARENT) sagt GDI, den Hintergrund beim Zeichnen von Text zu verlassen.

Um die Vordergrundfarbe des Textes mit Alpha zu rendern, wird es komplizierter. GDI unterstützt die Alpha-Kanäle nicht wirklich umfassend in seinen APIs. Außerhalb von AlphaBlend ist eigentlich nur der Kanal erhalten. Es ist eigentlich nicht gültig, die oberen Bits eines COLLEF auf Alpha-Werte zu setzen, da das High-Byte tatsächlich für Flags verwendet wird, um anzuzeigen, ob der COLLEF ein Paletteneintrag ist (und nicht ein RGB-Wert).

Ihr unglücklicher Weg ist also:

  1. Erstellen Sie eine 32bit DIBSection. ( CreateDIBSection ). Dies gibt Ihnen einen HBITMAP, der garantiert Alpha-Informationen speichern kann. Wenn Sie ein Bitmap über eine der anderen Bitmap-Erstellungsfunktionen erstellen, wird es auf dem Gerät Farbtiefe, die möglicherweise nicht 32bpp sein.
  2. DrawText auf die DIBSection.
  3. Wenn Sie die DIBSection erstellt haben, haben Sie einen Zeiger auf den tatsächlichen Speicher erhalten. An diesem Punkt müssen Sie durch den Speicher gehen und die Alpha-Werte einstellen. Ich glaube nicht, dass DrawText irgendetwas überhaupt mit dem Alpha-Kanal tun wird. Ich denke, eine einfache Überprüfung der RGB-Komponenten jedes DWORD der Bitmap - wenn sie die Forground-Farbe sind, schreiben Sie das DWORD mit einem 50% (oder was auch immer) Alpha im Alpha-Byte, wenn sie die Hintergrundfarbe, neu schreiben mit einem 100% Alpha im Alpha-Byte. *
  4. AlphaBlend die Bitmap auf das endgültige Ziel. AlphaBlend erfordert, dass der Alpha-Kanal in der Quelle vormultipliziert wird.

*  Es kann ausreichen, den DIBSection einfach mit einem 50% Alpha zu memsen, bevor Sie den DrawText ausführen, und sicherstellen, dass der BKColor schwarz ist. Ich weiß nicht, was DrawText mit dem Alpha-Kanal machen könnte. Einige Experimente sind erforderlich.

    
Chris Becke 27.08.2009, 20:21
quelle
7

Einfache und einfache Lösung:)

Hatte dieses Problem, ich versuchte, Alpha-Werte und Premultiply zu ändern, aber es gab ein anderes Problem - Antialiased und Cleartype Schriftarten, die nicht korrekt angezeigt wurden (hässliche Kanten). Also was ich getan habe ...

  1. Verfassen Sie Ihre Szene (Bitmaps, Grafiken, etc.)
  2. BitBlt benötigte ein Rechteck von dieser Szene (dasselbe wie Ihr Textrechteck von der Stelle, an der Sie Ihren Text haben möchten) in den Speicher DC mit kompatibler Bitmap, die an 0,0 Zielkoordinaten ausgewählt wurde
  3. Zeichnen Sie Ihren Text zu diesem Rechteck im Speicher DC.
  4. Nun AlphaBlendiere das Rechteck ohne AC_SRC_ALPHA in der BLENDFUNCTION und mit der gewünschten SourceConstantAlpha aus diesem Speicher DC zurück in deine DC-Szene.

Ich denke du hast es verstanden:)

    
Manul 04.01.2013 12:10
quelle
0

Hmmmm - ich versuche, das gleiche hier zu tun - wundernd - Ich sehe, dass Sie beim Erstellen eines dib-Abschnitts die "Masken" angeben, die eine R-, G-, B- (und Alpha) -Maske sind.

IF und das ist ein großes, wenn es wirklich nicht den Alpha chhannel ändert, dann könnten Sie die Maske für zwei Bitmap-Header anders angeben. ONe spezifiziert RGB an den richtigen Stellen, der andere macht alle Bits dem Alphakanal zugewiesen. (Setzen Sie in diesem Fall die Textfarbe auf Weiß.) Rendern Sie dann in zwei Durchgängen, einen zum Laden der Farbwerte, den anderen zum Laden der Alpha-Werte.

???? sowieso nur grübeln:)

    
peterk 15.01.2011 03:05
quelle
0

Während es bei dieser Frage darum geht, Text halbtransparent zu machen, hatte ich das umgekehrte Problem.

DrawText war , wodurch der Text in meinem Layer-Fenster (UpdateLayeredWindow) halbtransparent wurde ... und ich wollte es nicht haben.

Sehen Sie sich diese andere Frage an, da ich in der anderen Frage posten muss etwas Code, den Sie leicht ändern könnten ... und ist fast genau das, was Chris Becke in seiner Antwort vorschlägt.

    
cplotts 13.04.2012 22:16
quelle
0

Eine begrenzte Antwort für eine bestimmte Situation:

Wenn Sie eine Grafik mit Alpha-Kanal haben und über einen lokal undurchsichtigen Hintergrund undurchsichtigen Text zeichnen möchten, bereiten Sie zuerst Ihre 32-Bit-Bitmap mit 32-Bit-Pinseln vor, die mit CreateDIBPatternBrushPt erstellt wurden. Durchsuchen Sie dann die Bitmap-Bits, die den Alpha-Kanal invertieren, zeichnen Sie Ihren Text wie gewohnt (einschließlich SetBkMode bis TRANSPARENT ) und invertieren Sie dann das Alpha in der Bitmap erneut. Sie können die erste Inversion überspringen, wenn Sie das Alpha Ihrer Pinsel invertieren.

    
Renate 10.04.2014 18:42
quelle

Tags und Links