Как создать правильные растровые изображения для шрифта? - PullRequest
0 голосов
/ 07 апреля 2011

У меня есть вопрос, касающийся растровых шрифтов. Мне нужно создать шрифты для экрана устройства. Он должен состоять из растровых изображений всех печатных символов. Чтобы получить растровые изображения всех символов, я использую следующий подход:

public MFont(Font font, int first = 32, int last = 126)
{        
    var characters = new List<Character>();
    Bitmap objBmpImage = new Bitmap(1, 1);

    // Create a graphics object to measure the text's width and height.
    Graphics objGraphics = Graphics.FromImage(objBmpImage);

    for (int i = first; i <= last; i++)
    {
        char c = Convert.ToChar(i);
        int intWidth;
        int intHeight;
        string s = "" + c;

        // This is where the bitmap size is determined.                
        intWidth = (int)objGraphics.MeasureString(s, font).Width;
        intHeight = (int)objGraphics.MeasureString(s, font).Height;

        // Create the bmpImage again with the correct size for the text and font.
        objBmpImage = new Bitmap(objBmpImage, new Size(intWidth, intHeight));    

        objGraphics = Graphics.FromImage(objBmpImage);    
        // Set Background color
        objGraphics.Clear(Color.White);
        objGraphics.SmoothingMode = SmoothingMode.None;
        objGraphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;
        objGraphics.DrawString(s, font, new SolidBrush(Color.Black), 0, 0);           
        objGraphics.Flush();                  

        characters.Add(
            new Character
                {
                    Bitmap = objBmpImage,
                    Code = i,
                    Size = objBmpImage.Size                        

                }
            );
    }
}

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

Ответы [ 2 ]

2 голосов
/ 07 апреля 2011

Это дополнительное пространство с обеих сторон является отступом.Вы должны указать NoPadding для флагов.Прочитайте следующую ссылку:

http://msdn.microsoft.com/en-us/magazine/cc751527.aspx

Также имейте в виду, что при измерении строки может учитываться пространство, необходимое для текста, выделенного курсивом - поэтому у вас может быть дополнительный интервал справа от каждогосимвол.

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

Вы должны реализовать свой собственный «кернинг» для плотной упаковки символов (для пропорциональных шрифтов).В противном случае вы всегда будете выглядеть неоптимально.

Существуют способы укротить кернинг, но для этого требуется некоторая постобработка ваших растровых изображений.

2 голосов
/ 07 апреля 2011

Попробуйте использовать TextRenderer.MeasureText() вместо Graphics.MeasureString(). Это позволяет вам указать TextFormatFlags, который будет использоваться во время измерения. Я подозреваю, что отступы добавляются по умолчанию, поэтому попробуйте передать TextFormatFlags.NoPadding методу и посмотреть, изменится ли ваш результат.

...