Рендеринг символов шрифта С# (ошибка GDI)?

Я пытаюсь нарисовать символ «t» в растровом изображении в месте (0,0), а затем сохранить растровое изображение. Однако всякий раз, когда я это делаю, персонаж отображается с x = 8 (для размера 42). Смещение может быть разным в зависимости от размера шрифта, оно равно 6, когда размер равен 36. Похоже, это ошибка, связанная с GDI. Как я могу запросить это значение, которое создает это смещение? Я попробовал «GetCharABCWidthsFloat», но левый и правый пеленги будут равны нулю. Я пробовал "GetTextMetrics", но это не помогает. Я заметил, что в этой статье это упоминается, но не упоминается, как это исправить http://support.microsoft.com/kb/307208

В качестве меры тестирования я попытался отрендерить t в (-8, 0), и в итоге он отрендерился в (0, 0). Кто-нибудь знает, как я могу получить это значение смещения? Я не заинтересован в том, чтобы взломать что-то вместе, но реально жизнеспособное решение.

GetMeasureString, GetLineSpacing не помогают.

Пример кода:

static class Program
{
    static void Main(string[] args)
    {
        FontStyle style = FontStyle.Regular;
        FontFamily fontFamily = new FontFamily("Times New Roman");
        Font font = new Font("Times New Roman", 48, style);

        Bitmap bitmap = new Bitmap(64, 64);
        Graphics graphic = Graphics.FromImage(bitmap);

        SolidBrush blackBrush = new SolidBrush(Color.Black);
        graphic.FillRectangle(blackBrush, 0, 0, 64, 64);
        graphic.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;

        SizeF size = graphic.MeasureString("t", font);
        float lineSpacing = fontFamily.GetLineSpacing(FontStyle.Regular);

        graphic.DrawString("t", font, Brushes.White, new Point(0, 0));
        bitmap.Save("t.png");
        graphic.Dispose();
    }
}

person jack    schedule 31.12.2010    source источник


Ответы (1)


Попробуйте StringFormat.GenericTypographic:

graphic.DrawString("t", font, Brushes.White, new Point(0, 0), StringFormat.GenericTypographic);
person max    schedule 31.12.2010
comment
Это сделало трюк! Любая идея, почему он не делает этого по умолчанию? - person jack; 01.01.2011