2012-05-31 3 views
6

Я использую следующий код для рисования текста на растровом изображении:Можно ли определить точный размер шрифта при рисовании текста с помощью 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); 
} 

Он работает хорошо. Здесь визуализируется текст:

enter image description here

Я хочу, чтобы сделать текст немного больше. Если установить 11 как размер шрифта, вот что я получаю:

enter image description here

Это слишком большой для того, что я хочу. Я попытался 10.25, 10.5 и такие, но это дает такой же результат, как 10.

Я также попытаться установить GraphicsUnit к Pixel, но он не ведет себя так же (нет возможности установить пользовательский размер шрифта).

Вот мой вопрос:

При рисовании текста с помощью GDI + (C#), есть Possiblity для "тонкой настройки" размер оказанной текста?


EDIT: более полный фрагмент кода (по запросу):

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

Try 'TextRenderingHint.ClearTypeGridFit' – leppie

+0

Я попытался graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit, но он дает те же результаты – tigrou

+1

Я подозреваю, ваш' StringFormat' неправильно. IIRC, я успешно использовал «FitBlackBox». Фактически я изменял ширину шрифта, чтобы быть точно целым числом, основанным на очень специфических настройках высоты. – leppie

ответ

3

Я не знаю, C# или библиотеки .Net, но, глядя на this page, кажется, что при выборе AntiAlias для TextRenderingHint следует отключить намекая и включить сглаживание. Это даст вам дополнительные промежуточные размеры, но, возможно, более сумасшедший текст.

Проблема - это шрифт, намекающий. Когда детали шрифта, такие как ширина штриха или размер засечки, находятся в том же порядке, что и разрешение целевого устройства, простое масштабирование единиц дизайна на устройствах может вызвать однобокий, неравномерный текст, особенно если нет сглаживания каких-либо своего рода.

Чтобы избежать этого, у большинства шрифтов есть «подсказки», которые дают специальные правила для округления, когда разрешение ограничено. Эффект заключается в том, что вы видите «шаги» в размере.

Если вы хотите избежать шагов, вам нужно отключить «намек». Это приведет к тому, что растеризатор игнорирует специальные правила округления и просто масштабирует проектные единицы непосредственно на устройствах. Это позволяет иметь действительно линейно масштабируемый текст. Компромисс заключается в том, что текст может выглядеть не так хорошо при небольших размерах. Сглаживание может улучшить симметрию, но для многих людей текст может выглядеть нечетким.

4

Graphics.DrawString() имеет серьезные и неразрешимые проблемы точности, он подходит только для устройств с высоким разрешением, таких как принтеры.

Используйте вместо этого метод .NET 2.0 TextRenderer.DrawText().

+0

Одна вещь, которую я забыл упомянуть: код используется в службе .ashx, в приложении ASP.NET 3.5. безопасно использовать Систему.Сборка Windows.Forms (не включена по умолчанию)? – tigrou

+0

Да, не проблема. –

+1

Я пробовал метод TextRenderer.DrawText(). размер шрифта 9.7 отображает первую фотографию в моем вопросе, а 9.8 - второй. Так что в принципе это не работает. Есть ли какие-то флаги/опции для установки? Я попытался настроить GraphicsUnit на Pixel и предложение leppie, но не удачу. – tigrou

Смежные вопросы