2009-08-17 15 views
8

Me gustaría dibujar texto antialias en un mapa de bits transparente y tener el antialiasing dibujado como píxeles combinados alfa. De esta manera, puedo dibujar el mapa de bits en cualquier superficie de color (o una imagen, para el caso) y el antialiasing aún se ve bien.Texto antialias en el mapa de bits transparente

Este es un ejemplo simplificado que muestra el problema:

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 
    Bitmap bitmap = new Bitmap(this.Width, this.Height); 
    Graphics g = Graphics.FromImage(bitmap); 
    g.Clear(Color.Empty); 
    g.DrawString("hello world", new Font(this.Font.FontFamily, 24), Brushes.Blue, new Point(50, 50)); 
    e.Graphics.DrawImage(bitmap, new Point(0, 0)); 
} 

Y aquí está el resultado:

alt text http://img194.imageshack.us/img194/9065/captureotd.png

El objetivo final de esta es el uso de UpdateLayeredWindow dibujar mi alfa transparente mezclado ventana. Estoy creando una aplicación similar a Conky, y me gustaría poder usar el renderizado ClearType para texto (esto es fácil sin antialiasing, por supuesto).

Actualmente, tomo la pantalla detrás del formulario, dibujo eso y luego dibujo mi texto. Se ve bien, pero tiene que actualizarse y es lento para dibujar. Cualquier otra idea para lograr el texto de dibujo en el escritorio también sería bienvenida.

Respuesta

15

Su texto aparece tal como está, porque tiene habilitado el modo de suavizado de subpixel de ClearType (que es el predeterminado en Vista y superior). ClearType, por definición, no puede jugar bien con el canal alfa, ya que combina colores y, por lo tanto, no es agnóstico. Por lo tanto, ignora el canal alfa y se mezcla con el negro (que es, de otro modo, su color transparente). Necesita habilitar llanura escala de grises anti-aliasing para el efecto deseado:

g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; 
+0

Esto funcionó bien, ¡gracias! No es tan bonito como ClearType, pero incluso las fuentes diseñadas para ClearType (por ejemplo, Consolas) aún se ven bien. – iano

+0

Curiosamente, para mí 'AntiAliasGridFit' produce texto con cero anti-aliasing. 'AntiAlias', sin embargo, funciona. –

+0

'AntiAliasGridFit' podría no hacer anti-aliasing si el tamaño de fuente es demasiado pequeño. En tales tamaños de fuente, 'AntiAlias' da un resultado feo de todos modos. –

1

no estoy seguro de si es realmente necesario, pero si usted quiere hacer alfa-mezcla, se debe especificar una imagen de 32 bits:

Bitmap bitmap = new Bitmap(this.Width, this.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

Usando su ejemplo, yo era capaz de hacer el texto aspecto decente mediante la adición de una representación de texto de pista:

g.Clear(Color.Empty); 
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; 
g.DrawString("hello world", new Font(this.Font.FontFamily, 24), Brushes.Blue, new Point(50, 50)); 

¿Es esta haciendo lo que quiere, o simplemente ocultar el problema?

+3

Si omite '' PixelFormat', el valor predeterminado de Bitmap' a 'Format32bppArgb' de todos modos. –

Cuestiones relacionadas