2012-05-31 13 views
6

Sto usando il codice seguente per disegnare il testo su una bitmap:È possibile definire una dimensione precisa del carattere quando si disegna il testo utilizzando GDI +?

using (Font font = new Font("Arial", 10.0f, FontStyle.Bold, GraphicsUnit.Point)) 
{ 
    //draw the text 
    graphics.DrawString("Some text", font, Brushes.White, rect, stringFormat); 
} 

Funziona bello. Qui il testo è reso:

enter image description here

voglio rendere il testo un po 'più grande. Se ho impostato 11 come dimensione del carattere, ecco cosa ottengo:

enter image description here

E 'troppo grande per quello che voglio. Ho provato 10,25, 10,5 e tale ma dà stesso risultato 10.

cerco anche di impostare GraphicsUnit a Pixel ma si comporta lo stesso (senza possibilità di impostare la dimensione di carattere personalizzato).

Ecco la mia domanda:

Nella formulazione del testo utilizzando GDI + (C#), c'è un possiblity per "sintonizzare" dimensione del testo reso?


EDIT: codice più completo frammento (come richiesto):

using (Bitmap bitmap = new Bitmap(width, height)) 
using (Graphics graphics = Graphics.FromImage(bitmap))  
using (Font font = new Font("Arial", 10.0f, FontStyle.Bold, GraphicsUnit.Point)) 
{ 
    graphics.SmoothingMode = SmoothingMode.AntiAlias; 
    graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 

    Rectangle rect = new Rectangle(0, 0, width, height); 

    //method 1 
    StringFormat stringFormat = new StringFormat(); 
    stringFormat.Alignment = StringAlignment.Center; 
    stringFormat.LineAlignment = StringAlignment.Center; 
    graphics.DrawString("Some text", font, Brushes.White, rect, stringFormat); 

    //method 2 
    TextFormatFlags flags = TextFormatFlags.HorizontalCenter | 
     TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak;  
    TextRenderer.DrawText(graphics, "Some text", font, rect, Color.White, flags); 

    bitmap.Save(stream, ImageFormat.Png);   
} 
+0

Prova 'TextRenderingHint.ClearTypeGridFit' – leppie

+0

ho provato graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit, ma dà gli stessi risultati – tigrou

+1

ho il sospetto che il vostro' StringFormat' è sbagliato. IIRC, ho usato 'FitBlackBox' con successo. In effetti ho ottimizzato la larghezza del font per essere esattamente un numero intero, basato su impostazioni di altezza molto specifiche. – leppie

risposta

3

non so C# o le librerie .Net, ma, guardando this page, sembra che la selezione AntiAlias per TextRenderingHint deve spegnere e accendere alludendo antialiasing. Questo ti darà più dimensioni intermedie, ma probabilmente un testo più sfocato.

Il problema è il suggerimento sui font. Quando i dettagli di un font, come la larghezza del tratto o la dimensione di un serif, sono nello stesso ordine della risoluzione del dispositivo di destinazione, semplicemente ridimensionare le unità di progettazione in unità di dispositivo può causare testo irregolare, in particolare quando non c'è antialiasing di alcun genere.

Per evitare questo, la maggior parte dei caratteri ha "suggerimenti" che forniscono regole del caso speciale per l'arrotondamento quando la risoluzione è limitata. L'effetto è che vedi "passi" nella dimensione.

Se si desidera evitare i passaggi, è necessario disattivare "suggerimento". Ciò farà sì che il rasterizzatore ignori le speciali regole di arrotondamento e riduca direttamente le unità di progetto alle unità del dispositivo direttamente. Ciò consente di avere un testo in scala lineare. Il compromesso è che il testo potrebbe non sembrare buono a piccole dimensioni. L'antialiasing può migliorare la simmetria, ma, per molte persone, il testo può sembrare sfocato.

4

Graphics.DrawString() ha problemi di precisione gravi e irrisolvibili, è adatto solo per i dispositivi ad alta risoluzione come stampanti.

Utilizzare invece il metodo .NET 2.0 TextRenderer.DrawText().

+0

Una cosa che ho dimenticato di menzionare: il codice viene utilizzato in un servizio .ashx, nell'applicazione ASP.NET 3.5. è sicuro usare il sistema.Assemblaggio Windows.Forms (non incluso di default)? – tigrou

+0

Sì, nessun problema. –

+1

Ho provato il metodo TextRenderer.DrawText(). la dimensione del carattere 9.7 viene visualizzata come la prima immagine nella mia domanda, mentre la 9.8 viene visualizzata come seconda. Quindi in pratica non funziona. Ci sono alcune bandiere/opzioni da impostare? Ho provato a impostare GraphicsUnit su Pixel e suggerimento leppie ma non fortuna. – tigrou

Problemi correlati