2009-08-17 15 views
8

Vorrei disegnare un testo antialias in una bitmap trasparente e avere l'antialiasing disegnato come pixel alfa miscelati. In questo modo, posso disegnare la bitmap su qualsiasi superficie di colore (o un'immagine, per quella materia) e l'antialiasing sembra ancora a posto.Testo con antialiasing sulla bitmap trasparente

Ecco un esempio semplificato che mostra il 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)); 
} 

Ed ecco il risultato:

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

L'obiettivo finale di questo è quello di utilizzare UpdateLayeredWindow per disegnare la mia alfa trasparente mescolato finestra. Sto creando un'applicazione simile a Conky e mi piacerebbe essere in grado di usare il rendering ClearType per il testo (questo è facile senza antialiasing, ovviamente).

Attualmente, afferro lo schermo dietro il modulo, lo disegna e quindi disegno il mio testo. Sembra buono, ma deve essere aggiornato ed è lento a disegnare. Sarebbe inoltre gradita qualsiasi altra idea per realizzare un disegno sul desktop.

risposta

15

Il testo viene visualizzato così com'è perché è abilitata la modalità anti-aliasing di ClearType subpixel (che è l'impostazione predefinita su Vista e sopra). ClearType, per definizione, non può essere piacevole con il canale alfa, poiché mescola i colori e quindi non è indipendente dal contesto. Quindi ignora il canale alfa e si fonde in nero (che altrimenti è il tuo colore trasparente). È necessario abilitare pianura in scala di grigi anti-aliasing per l'effetto desiderato:

g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; 
+0

Questo ha funzionato bene, grazie! Non è abbastanza bello come ClearType, ma anche i font progettati per ClearType (ex Consolas) sembrano ancora buoni. – iano

+0

Stranamente, per me 'AntiAliasGridFit' produce testo con anti-aliasing zero. 'AntiAlias', tuttavia, funziona. –

+0

'AntiAliasGridFit' potrebbe non eseguire l'anti-aliasing se la dimensione del carattere è troppo piccola. A tali dimensioni dei caratteri, 'AntiAlias' fornisce comunque un brutto risultato. –

1

io non sono sicuro se è davvero necessario, ma se si vuole fare alpha-blending, è necessario specificare un'immagine a 32-bit:

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

Usando il tuo esempio, sono stato in grado di fare il testo guardare decente con l'aggiunta di un testo di rendering suggerimento:

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)); 

È questo a fare ciò che si vuole, o semplicemente nascondere il problema?

+3

Se si omette '' di Bitmap' PixelFormat', il valore predefinito è 'Format32bppArgb' comunque. –

Problemi correlati