C # Рендеринг символов шрифта (ошибка GDI)? - PullRequest
2 голосов
/ 01 января 2011

Я пытаюсь нарисовать символ "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();
    }
}

1 Ответ

4 голосов
/ 01 января 2011

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

graphic.DrawString("t", font, Brushes.White, new Point(0, 0), StringFormat.GenericTypographic);
...