Основной рендеринг растровых шрифтов - PullRequest
0 голосов
/ 11 января 2011

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

Хотя это длинный пост, если ошибка № 1 будет исправлена, она может исправить все. Этот вопрос касается C # (Ошибка № 1) и C ++ (Ошибка № 2, Ошибка № 3).

Для рендеринга растровых шрифтов я делаю две вещи

1) Создание растрового изображения размером 2056x2056 в C #. Сначала я рисую символ на изображении 512x512, затем меняю его размер до 128. Причина, по которой я это делаю, состоит в том, чтобы я мог добавить эффекты к тексту позже. Это также приводит к ошибке # 1 (см. Ниже).

2) Визуализация отдельного прямоугольника для каждого символа (см. Ошибка № 2 и Ошибка № 3).

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

Ошибка № 1: Размер шрифта Шрифт, который я отрисовываю на графике 512 пикселей, равен 120. Размер, на который будет изменен размер графики, равен 128, что в 4 раза меньше. Для этого я бы ожидал, что размер шрифта будет равен 30. После сохранения растрового изображения я посмотрю его в GIMP для исследования. Одна вещь, которую я сделаю, это нарисует символ из GIMP поверх символа в моем растровом изображении. Это даст интересные результаты, хотя я не уверен, что это неправильно или нет. Как видно из рисунка ниже, правильное перерисовывание - это чтобы GIMP рисовал символ на «30 pt», однако, если я нарисую его на «30px», он будет значительно меньше. Причина, по которой это так важно, заключается в том, что позже в C ++ я установлю режим карты на «SetMapMode (dc, MM_TEXT);». Хотя, согласно MSDN, MM_TEXT - это «Каждая логическая единица отображается в один пиксель устройства».

Оказывается, GIMP переводит "30pt" в "40px". В результате для моего кода C ++ я буду создавать шрифты с размером «40», так как я устанавливаю в MapMode настройку текста в пикселях. Вот почему так важно, чтобы ошибка исправлялась первой. Если бы эта ошибка была исправлена, она могла бы исправить ошибки # 1 и # 2.

Мой вопрос об ошибке № 1, что не так? Должен ли я установить режим карты на что-то еще? Я нарисую символ на графике 512 пикселей, а затем изменим его размер. Это важный шаг, поэтому я могу применить эффекты к большей версии персонажа.

Ошибка № 2: УФ Поскольку я храню свои символы каждые 128 пикселей, очень легко получить значения X / Y для каждого символа. Тем не менее, я не уверен, как далеко продвинуть УФ, чтобы правильно нарисовать их. Я попытался сделать что-то вроде Promit, размещенного для рендеринга растровых шрифтов AngelCode, однако, поскольку я не уверен, как они генерируют свои значения, я могу ошибаться здесь. Вы можете видеть на двух изображениях ниже, что я неправильно вычисляю УФ-излучение.

Мой вопрос к ошибке # 2, как я могу правильно продвигать свои ультрафиолетовые лучи? Нет ничего плохого в том, как я нахожу растровое изображение X / Y, только в том, как я перемещаю их для рендеринга.

Ошибка № 3: Размещение письма Я не уверен, как правильно передвигать своих персонажей или даже правильно получать дистанцию. В настоящее время я просто делаю "A + B + C". Эта карта кажется правильной, однако, если вы посмотрите на изображение Arial ниже, «j» выглядит неуместно между «n» и «f». Есть также проблемы с «b» и «y» для Arial, а также некоторые проблемы для Times New Roman.

Мой вопрос об ошибке № 3, как мне правильно продвигать своих персонажей?

Arial Rendering:

Times New Roman:

Стоит отметить, что я не заинтересован в использовании каких-либо внешних библиотек (таких как FreeType) или каких-либо «хаков» для этого. Я хочу, чтобы это было сделано правильно с помощью Windows API. Выполнение любого из них не подлежит обсуждению, если бы я хотел их использовать, я мог бы закончить с этим давным-давно.

Так как исходные теги на доске не работают, я опубликую пример источника в pastebins.

C # (растровое изображение): http://pastebin.com/zpPPZVm0C ++ (рендеринг шрифтов): http://pastebin.com/mHrUatEb

1 Ответ

1 голос
/ 11 января 2011

1 - точки и пиксели - это разные единицы. Так что там нет ошибки. Поиск "точек шрифта пикселей" для объяснения.

3 - Для пропорциональных шрифтов (например, Arial) каждый символ имеет разную ширину. В более продвинутых sceanrios комбинации символов могут иметь различную ширину по сравнению с суммой их отдельных ширин. Вы можете начать чтение с MeasureString (http://msdn.microsoft.com/en-us/library/system.drawing.graphics.measurestring.aspx) и прочитать соответствующие статьи о рендеринге шрифтов.

...