2009-08-27 18 views
8

He creado un mapa de bits usando GDI +. Estoy dibujando texto en ese mapa de bits usando GDI Drawtext. Al utilizar Drawtext no puedo aplicar la transparencia. Cualquier ayuda o código será apreciado.Transparencia al texto en GDI

+1

¿Idioma preferido? C, C++, VB.net, C# ?? –

+0

Preferido será simple API de Windows/C++ – VideoDev

+1

¿Es GDI + un error tipográfico? –

Respuesta

13

Si desea dibujar texto sin relleno de fondo, SetBkMode(hdc,TRANSPARENT) le indicará a GDI que deje el fondo al dibujar el texto.


Para representar realmente el color de primer plano del texto con alfa ... va a ser más complicado. GDI en realidad no es compatible con los canales alfa todo eso ampliamente en sus API. Fuera de AlphaBlend en realidad todo lo que hace es preservar el canal. En realidad, no es válido para establecer los bits superiores de un COLOREF a los valores alfa ya que el byte alto se usa realmente para que las banderas indiquen si el COLOREF es (en lugar de un valor RGB) una entrada de paleta.

Así que, por desgracia, su único verdadero camino a seguir es:

  1. Crear una DIBSection de 32 bits. (CreateDIBSection). Esto le da un HBITMAP que garantiza que puede contener información alfa. Si crea un mapa de bits a través de una de las otras funciones de creación de mapas de bits, estará en el colordepth del dispositivo que podría no ser 32bpp.
  2. Dibuje el texto en la DIBSección.
  3. Cuando creó DIBSection, obtuvo un puntero a la memoria real. En este punto, necesita ir a través de la memoria y establecer los valores alfa. No creo que DrawText vaya a hacer nada al canal alfa por sí solo. Estoy pensando en una simple comprobación de los componentes RGB de cada DWORD del mapa de bits: si son el color original, reescriba el DWORD con un 50% (o lo que sea) alfa en el byte alfa, si son el color de fondo, reescriba con un 100% alfa en el byte alfa. *
  4. AlphaBlend el mapa de bits en el destino final. AlphaBlend requiere que el canal alfa en la fuente se pre-multiplique.

* Podría ser suficiente simplemente Memset la DIBSection con un alfa de 50% antes de hacer el DrawText, y asegurar que el BKColor es negro. Sin embargo, no sé lo que DrawText podría hacer con el canal alfa. Se requiere algo de experimentación.

+0

Gracias por su respuesta.He utilizado este método.Utilizando esto, el texto se dibuja en un rectángulo transparente.Pero quiero aplicar transparencia (alfa) al texto dibujado que no es posible usando el método SetTextColor. Como SetTextColor ignora el valor alfa de un Color. He pasado por alguna aplicación que utiliza un mapa de bits enmascarado para aplicar la transparencia, pero no he obtenido los resultados deseados. y no quiero aplicar tranparency al mapa de bits, quiero aplicar transparencia al texto dibujado en el mapa de bits. Cualquier ayuda es apreciada – VideoDev

+0

La idea es dibujar sobre un mapa de bits negro, no un mapa de bits con información contenida en él. Después de abrir el texto, puede escanear el mapa de bits para los píxeles que no sean negros y ajustar el canal alfa para cada píxel en función de si es o no parte del texto. –

0

Hmmmm - tratando de hacer lo mismo aquí - preguntándome - Veo que cuando crea una sección dib, usted especifica las "máscaras" que son una máscara R, G, B (y alfa).

SI y eso es un gran si realmente no altera el canal alfa, entonces puede especificar la máscara de manera diferente para dos encabezados de mapa de bits. ONe especifica thr RGB en los lugares correctos, el otro hace que todos tengan sus bits asignados al canal alfa. (establezca el color del texto en blanco en este caso) luego renderice en dos pasadas, una para cargar los valores de color, la otra para cargar los valores alfa.

???? de todos modos solo reflexionando :)

0

Si bien esta pregunta se trata de hacer que el texto sea semitransparente, tuve el problema opuesto.

DrawText era haciendo el texto en mi ventana en capas (UpdateLayeredWindow) semitransparente ... y no quería que fuera.

Eche un vistazo a este otro question ... ya que en la otra pregunta publico un código que podría modificar fácilmente ...y es casi exactamente lo que Chris Becke sugiere en su respuesta.

7

SIMPLE y solución fácil :)

Tenía este problema, i trataron de cambiar los valores de alfa y premultiplicar, pero no había otro problema - fuentes suavizadas y ClearType donde no mostrados correctamente (bordes feo). Así que lo que hice ...

  1. Encuadre la escena (mapas de bits, gráficos, etc.)
  2. BitBlt rectángulo requerida de esta escena (igual que el rectángulo de texto, desde el lugar donde desea que el texto sea) a la memoria DC con un mapa de bits compatible seleccionado en 0,0 coordenadas de destino
  3. Dibuje Su texto a ese rectángulo en la memoria DC.
  4. Ahora AlphaBlend ese rectángulo sin AC_SRC_ALPHA en BLENDFUNCTION y con SourceConstantAlpha deseado desde esta memoria DC de vuelta a su escena DC.

creo que lo tienes :)

0

Una respuesta limitada para una situación específica:

Si tienes un gráfico con el canal alfa y desea dibujar texto sobre un fondo opaco localmente opaco, primero prepare su mapa de bits de 32 bits con pinceles de 32 bits creados con CreateDIBPatternBrushPt. Luego explore los bits del mapa de bits que invierten el canal alfa, dibuje su texto como lo haría normalmente (incluyendo SetBkMode a TRANSPARENT), luego invierta el alfa en el mapa de bits nuevamente. Puede saltear la primera inversión si invierte el alfa de sus pinceles.

Cuestiones relacionadas