9
votes

Transparence au texte dans GDI

J'ai créé un bitmap à l'aide de GDI + Toute aide ou code sera appréciée.


2 commentaires

Langue préférée? C, c ++, vb.net, c # ??


Préféré sera une simple windows api / c ++


5 Réponses :


13
votes

Si vous souhaitez dessiner du texte sans formation de fond, setbkmode (HDC, transparent) dira à GDI de quitter le fond lors du dessin du texte.


Pour rendre la couleur de premier plan du texte avec alpha ... va être plus compliqué. GDI ne supporte pas réellement les canaux alpha tout cela largement dans ses API. En dehors de AlphaBend en fait tout ce qu'il fait est de préserver le canaliser. Il n'est en fait pas valide pour définir les bits supérieurs d'une valeur de Coloref sur alpha, car l'octet élevé est réellement utilisé pour les indicateurs pour indiquer si le Coloref est (plutôt qu'une valeur RGB) une entrée de palette.

Alors, malheureusement, votre seule voie à suivre est de:

  1. créer une dibsection 32bit. ( Carebsection ). Cela vous donne un HBITMAP garantit pour pouvoir contenir des informations alpha. Si vous créez un bitmap via l'une des autres fonctions de création bitmap, il va être à l'appareil Colordepth qui pourrait ne pas être 32BPP.
  2. TRAITEXTER sur le DIBSECTION.
  3. Lorsque vous avez créé le dibsection, vous avez un pointeur à la mémoire réelle. À ce stade, vous devez passer par la mémoire et définir les valeurs alpha. Je ne pense pas que ce tructexte va faire quoi que ce soit au canal alpha par lui-même. Je pense à une simple vérification des composants RVB de chaque DWORD du bitmap - si elles sont la couleur de la structure, réécrivez le DWORD avec une alpha à 50% (ou autre) alpha dans l'octet alpha, si elles sont la couleur de fond, réécrivez avec un 100% alpha dans l'octet alpha. *
  4. AlphaBend le bitmap sur la destination finale . AlphaBend nécessite le canal alpha dans la source d'être pré-multiplié.

    * Il peut être suffisant de simplement memsser la dibsection avec un alpha 50% avant de faire le trucstexte et assurez-vous que le BKColor est noir. Je ne sais pas ce que le tructexte pourrait bien faire sur le canal alpha. Certaines expérimentations sont appelées.


2 commentaires

Merci pour votre réponse.Je avez utilisé cette méthode.Utiliser ce texte est dessiné sur le rectangle de manière transparente. Mais je veux appliquer la transparence (alpha) au texte dessiné qui n'est pas possible à l'aide de la méthode de SettextColor. Comme SettextColor ignore la valeur alpha d'une couleur.Je ont suivi une application qui utilise un bitmap masque pour appliquer une transparence, mais je n'ai pas eu les résultats souhaités. Et je ne veux pas appliquer transparence au bitmap, je souhaite appliquer la transparence au texte tiré sur le bitmap. Toute aide est appréciée


Çnement d'une idée est, dessine sur un bitmap noir, pas un bitmap avec des informations encore. Après avoir blindé le texte, vous pouvez ensuite numériser le bitmap pour les pixels non noirs et régler le canal alpha pour chaque pixel sur la base de sa partie du texte.



0
votes

hmmmm - essayant de faire la même chose ici - je vois que lorsque vous créez une section de DIB, vous spécifiez les "masques" qui sont un masque R, G, B (et alpha).

Si et c'est un gros s'il ne modifie pas vraiment l'alpha chhannel, vous pouvez spécifier le masque différemment pour deux en-têtes bitmap. On spécifie le THR RVB dans les endroits appropriés, l'autre les fait tous avoir leurs bits attribués au canal alpha. (Définissez la couleur du texte sur blanc dans ce cas) puis rendu en deux passes, une pour charger les valeurs de couleur, l'autre pour charger les valeurs alpha.

???? Quoi qu'il en soit, juste la raison :)


0 commentaires

0
votes

Bien que cette question consiste à faire du texte semi-transparent, j'ai eu le problème opposé.

tire-poste était faisant le texte dans ma fenêtre en couches (UpdateLayeredWindow) semi-transparent ... et je ne voulais pas que ce soit.

Regardez cet autre Question ... depuis dans l'autre question que je poster Quelqu'un code que vous pourriez facilement modifier ... et est presque exactement ce que Chris BeCke suggère dans sa réponse.


0 commentaires

8
votes

solution simple et facile :)

Avait ce problème, j'ai essayé de changer de valeurs alpha et de prémultiplier, mais il y avait un autre problème - des polices antialiasées et ClearType où ne figurent pas correctement (bords laids). Alors qu'est-ce que j'ai fait ...

  1. Composez votre scène (bitmaps, graphiques, etc.)
  2. BitBlt Requéra rectangle de cette scène (identique à votre rectangle de texte, à partir de l'endroit où vous souhaitez que votre texte soit) à mémoire DC avec bitmap compatible sélectionné à 0,0 coordonnées de destination
  3. Dessinez votre texte à ce rectangle en mémoire DC.
  4. Maintenant, alphaBendez ce rectangle sans AC_SRC_ALPHA dans le mélange et avec SOURCECONSTANTALPHA souhaitée de cette mémoire DC à votre scène DC.

    Je pense que vous l'avez eu :)


0 commentaires

0
votes

Une réponse limitée pour une situation spécifique:

Si vous avez un graphique avec un canal alpha et que vous souhaitez dessiner du texte opaque sur un fond opaque localement, préparez d'abord votre feuille bitmap 32 bits avec des brosses 32 bits créées avec créateibpatternBrushpt . Ensuite, numérisez via les bits bitmap Inverser le canal alpha, dessinez votre texte comme vous le feriez normalement (y compris SetBkmode sur transparent ), puis invert l'alpha dans le bitmap. Vous pouvez ignorer la première inversion si vous inverser l'alpha de vos pinceaux.


0 commentaires