2012-01-27 6 views
7

Dato che ho provato a disegnare stringhe con ogni combinazione di levigatura e rendering con Graphics.DrawString(), pensavo che il renderer di testo avrebbe fatto un lavoro migliore disegnando le stringhe, ma penso che fosse sbagliato.ASP.NET TextRenderer.DrawText Immagini di testo terribili

Questo è come si suppone per assomigliare:

enter image description here

E questo è come sembra:

enter image description here

Ecco il mio codice:

Graphics objGraphics2 = Graphics.FromImage(objBitmap); 

objGraphics2.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
objGraphics2.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; 
objGraphics2.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
objGraphics2.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear; 

Font textFont = new Font(textFontFamily, PxtoEm(textSize)); 

SolidBrush b = new SolidBrush(textColor); 

TextRenderer.DrawText(objGraphics2, textValue, textFont, new Rectangle(0, 0, Width, Height), textColor); 

È il mio PxtoEm metodo sbagliato?

public float PxtoEm(int px) 
{ 
     float em = (float)(Convert.ToDouble(Convert.ToDouble(px) * Convert.ToDouble(72)/Convert.ToDouble(objBitmap.HorizontalResolution))); 
     return em; 
} 

Ho bisogno di alcuni suggerimenti perché questo è davvero terribile, c'è di peggio con caratteri più grandi e le immagini non vengono ridotti.

UPDATE: ottenuto che funziona con i font più grandi (cioè 20 px.), Ma con caratteri più piccoli si ottiene tipo di cancellati su alcune lettere:

Ecco come si suppone sia con font Arial 10px:

enter image description here

Questo è risultato con Graphics.DrawString()

enter image description here

Come potete vedere, non è molto buono ma più vicino ho ottenuto. Ho fatto alcune modifiche al codice e ottenuto risultati migliori con carattere più grande:

Ecco come si suppone sia con font 20px Arial:

enter image description here

Questo risultato è il disegno:

enter image description here

E qui è il codice modificato (ho eliminato il metodo em e pixel utilizzati direttamente, passati a Graphics.DrawString() anziché TextRenderer.DrawText()

Se qualcuno ha qualche suggerimento di scrivere un metodo diverso per le dimensioni del testo più piccole e utilizzare il codice sopra per ingrandirlo, come funziona bene, postarlo e ci proverò!

UPDATE 3: Finalmente ho trovato la soluzione per tutto, e la soluzione è stata piuttosto semplice: NON UTILIZZARE sfondo trasparente!

e le impostazioni sono:

objGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
objGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; // <-- important! 
objGraphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
objGraphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
objGraphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; 
      objGraphics.TextContrast = 0; 

Qui è un'immagine finale con queste impostazioni su sfondo bianco:

enter image description here

Esattamente lo stesso, grazie per i suggerimenti e le risposte.

+0

In quale formato grafico viene riprodotto l'immagine? –

+0

Il formato è Png perché e lo sfondo è trasparente. Sto attualmente provando tutte le altre proposte suggerite di seguito finora non è cambiato nulla quando si utilizza TextRenderer invece sono tornato a Graphics.DrawString e i risultati sono un po 'migliori. Pubblicherò agian quando avrò la combo giusta. – formatc

+0

Fantastico, è sufficiente verificare che non si stia tentando di utilizzare GIF, in quanto ciò perderebbe il canale alfa e offrirà risultati brutti simili. –

risposta

2

ho costruito qualcosa per creare pulsanti di immagine utilizzando una funzionalità simile e ho avuto problemi con kerneling e il carattere non si estende al desiderato con. Le seguenti impostazioni mi hanno davvero avvicinato a quello che volevo ma non ancora al 100%.

objGraphics2.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; 
objGraphics2.TextRenderingHint = System.Drawing.Drawing2D.TextRenderingHint.AntiAliasGridFit; 
+0

Questo funziona, ma solo per caratteri più grandi (ad esempio 20px), comunque più vicino che ho ottenuto finora. Proverò a giocare un po 'di più per vedere se potrei ottenere risultati migliori con caratteri più piccoli. – formatc

0

Non sono sicuro se questo risolverà il problema, ma ho avuto un problema simile con il disegno di testo in Direct3D, controlla PixelOffsetMode, impostalo su Half.

+0

Ho provato, diventa disordinato con caratteri più grandi e lo stesso di HighQuality su più piccoli. – formatc

2

Impostare Graphics.TextRenderingHint a SingleBitPerPixelGridFit.

3

io non sono sicuro che vi aiuterà, ma perché non creare il vostro font senza la chiamata di funzione, in questo modo:

Font textFont = new Font(textFontFamily, textSize, GraphicsUnit.Pixel); 
+0

Questo mi ha aiutato a renderlo più facile ma sempre lo stesso, grazie comunque ho trascurato questo. – formatc

+0

n.p. Non pensavo che sarebbe stato d'aiuto con la qualità del rendering, ma il codice più semplice è sempre un: D – Hogan

Problemi correlati