2015-08-09 2 views
-2

Я рисую несколько текстов на графическом объекте. С некоторыми шрифтами нарисованный текст имеет некоторое нежелательное вертикальное смещение.DrawString - нежелательное вертикальное смещение в некоторых шрифтах

Вот код:

Bitmap img = new Bitmap(Width, Height); 
Graphics GraphicObject = Graphics.FromImage(img); 
GraphicObject.TextRenderingHint = TextRenderingHint.AntiAlias; 
GraphicObject.DrawRectangle(Pens.Red, X, Y, Width, Height); 
StringFormat format = new StringFormat(); 
format.FormatFlags = StringFormatFlags.NoClip; 

GraphicObject.DrawString(
    "SampleText", 
    new FontFamily("Font_Name"), 
    Color.White, 
    new RectangleF(X, Y, Width, Height), 
    format 
); 

И вот результат: enter image description here

Как вы видите, позиция двух шрифтов неверны

Как я могу решить эту проблему?

+2

Просьба предоставить некоторые рабочий фрагмент кода, чтобы люди могли испытать его. – tia

+2

Не уверен, что это действительно неправильно; если вы посмотрите поближе, вы увидите, что в примере четыре также позволяют спускателям идти ниже прямоугольника. Я предполагаю, что все зависит от того, как шрифты определяют его свойства. - Также: попробуйте значительно улучшить способ рисования текста с помощью [TextRenderer] (https://msdn.microsoft.com/de-de/library/system .windows.forms.textrenderer% 28v = vs.110% 29.aspx) !! – TaW

+0

@tia: фрагмент кода Обновлено. @TaW: Естественно, что если текст не может поместиться в прямоугольник, он выходит из окна ('StringFormatFlags.NoClip'). Моя проблема заключается в смещении текста от вершины прямоугольника! –

ответ

0

После некоторых трудных работ я исправил проблему с помощью небольшого грязного решения.

Сначала я нарисую текст на пустой объект Graphics. то я буду сканировать первый пиксель текста по оси y. Эта точка является смещением y шрифта. Тогда я буду рисовать текст в моем Graphics объекта в y - yOffset

Bitmap img = new Bitmap(Width, Height); 
Graphics GraphicObject = Graphics.FromImage(img); 
GraphicObject.TextRenderingHint = TextRenderingHint.AntiAlias; 
GraphicObject.DrawRectangle(Pens.Red, X, Y, layer.Width, layer.Height); 
StringFormat format = new StringFormat(); 
format.FormatFlags = StringFormatFlags.NoClip; 

int yOffset = GetYOffset(layer.Width,layer.Height,TextFont,layer.Text, format); 

GraphicObject.DrawString(
    "SampleText", 
    new FontFamily("Font_Name"), 
    Color.White, 
    new RectangleF(X, Y - yOffset, layer.Width, layer.Height), 
    format 
); 

... 

private int GetYOffset(int Width, int Height, System.Drawing.Font TextFont, string Text, StringFormat format) 
{ 
    Bitmap img = new Bitmap(1000, 1000); 
    Graphics testGaraphic = null; 
    testGaraphic = Graphics.FromImage(img); 

    testGaraphic.FillRectangle(Brushes.White, 0, 0, Width, Height); 
    testGaraphic.DrawString(Text, TextFont, Brushes.Black, 0, 0, format); 
    for (int y = 0; y < Height; y++) 
     for (int x = 0; x < Width; x++) 
      if (img.GetPixel(x, y).Name != "ffffffff") 
       return y; 
    return 0; 
} 

Результат: enter image description here

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