Кто-нибудь знает какой-либо алгоритм, который будет автоматически рассчитывать кернинг символов на основе глифов, когда пользователь вводит текст?
Я не имею в виду тривиальное вычисление ширины и т. Д., Я имею в виду анализ формы глифов для оценки визуально оптимального расстояния между символами. Например, если мы последовательно выкладываем три символа в строке, средний символ должен выглядеть так, как если бы он находился в центре строки, несмотря на формы символов. Пример раскрывает функциональность кернинга на лету:
Пример кернинга на лету:
На изображении выше, a
кажется, слишком правильно. Он должен быть смещен на определенную величину в сторону, T
чтобы он находился посередине T
и g
. Алгоритм должен изучить формы T
и a
(и, возможно, других букв) и решить, сколько a
должно быть смещено влево. Это определенное количество - это то, что алгоритм должен вычислять - БЕЗ ИЗУЧЕНИЯ ВОЗМОЖНЫХ ПАР КЕРНИНГА Шрифта.
Я думаю о кодировании javascript (+ svg + html) программы, которая использует шрифты, нарисованные от руки, и во многих из них отсутствуют пары кернинга. Текстовые поля будут редактируемыми и могут содержать текст нескольких шрифтов. Я думаю, что кернинг на лету может быть одним из способов обеспечения среднего потока текста в этом случае.
РЕДАКТИРОВАТЬ: Одна из отправных точек для этого может быть использование шрифта svg, поэтому легко получить значения пути. В шрифте svg путь определяется следующим образом:
<glyph glyph-name="T" unicode="T" horiz-adv-x="1251" d="M531 0v1293h
-483v173h1162v-173h-485v-1293h-194z"/>
<glyph glyph-name="a" unicode="a" horiz-adv-x="1139" d="M828 131q-100 -85
-192.5 -120t-198.5 -35q-175 0 -269 85.5t-94 218.5q0 78 35.5 142.5t93
103.5t129.5 59q53 14 160 27q218 26 321 62q1 37 1 47q0 110 -51 155q-69 61
-205 61q-127 0 -187.5 -44.5t-89.5 -157.5l-176 24q24 113 79 182.5t159
107t241 37.5 q136 0 221 -32t125 -80.5t56 -122.5q9 -46 9 -166v-240q0
-251 11.5 -317.5t45.5 -127.5h-188q-28 56 -36 131zM813 533q-98 -40 -294
-68q-111 -16 -157 -36t-71 -58.5t-25 -85.5q0 -72 54.5 -120t159.5 -48q104
0 185 45.5t119 124.5q29 61 29 180v66z"/>
Алгоритм (или код JavaScript) должен каким-то образом исследовать эти пути и определять оптимальное расстояние между ними.
источник
Ответы:
Я знаю, что это старый. Я работаю над этим прямо сейчас в реализации WebGL шаткого текста (что угодно). Решение, над которым я работаю, выглядит так:
Таким образом, пустая «область» между буквами должна сжиматься до довольно обычного среднего значения. Укажите минимальный зазор и минимальную площадь, используя метод проб и ошибок и свой собственный вкус, и, возможно, разрешите настройку этих параметров другим агентом ... например, значением ручного кернинга.
ура :)
Редактировать: я успешно реализовал это сейчас, и это работает очень хорошо :)
источник
Это довольно простой алгоритм, который я пробовал однажды, и может быть достаточно хорошим.
Рендеринг символов в низком разрешении - скажем, шесть или семь пикселей в высоту (высота обычной буквы) примерно одинаковы по горизонтали. Вы хотите простую двоичную карту, где есть пустое пространство против частей буквы, на простой сетке низкого разрешения.
"Откормить" эти буквы карты. То есть заполните каждую пустую ячейку, которая находится рядом с заполненной ячейкой. Это означает, что пустая территория ближе всего к краям буквы, поэтому соседняя буква не подходит слишком близко.
Сыграйте в «горизонтальный тетрис» с полученными буквами карт. Пусть гравитация действует влево. Выпуклый левый «живот» «а» «упадет» в полость под перекладиной «Т». Сколько клеток сдвинуло «а»? Масштабируйте это пропорционально фактическому размеру букв, и это - как далеко к реальному разрешению "a" влево.
источник
Алгоритмы автокернинга уже существуют. Ни один из них не защищен от ошибок, и им, как правило, требуется немного ручного и ручного исправления некоторых аспектов, особенно если ваше отслеживание относительно жесткое.
Но эти алгоритмы предназначены для применения кернинга к файлу шрифта , а не к буквам, поскольку они генерируются из файла шрифта.
Вы рассматривали возможность применения авто-кернинга к файлу шрифта?
Fontforge (с открытым исходным кодом) и Fontlab (коммерческий) содержат алгоритмы авто-кернинга. У них будет относительно крутая кривая обучения - вы должны быть знакомы с техническими аспектами работы шрифтов.
Есть также iKern, который предлагает коммерческий сервис кернинга шрифтов, посредством которого он кернует ваш шрифт для вас и делает довольно хорошую работу. Я не знаю, сколько это будет стоить.
источник
У меня нет времени полностью обдумать это или нарисовать иллюстрации, но у меня была полу-идея, основанная на первом разделении каждого глифа по вертикали.
Затем для каждой половины определите две вертикальные оси: - биссектриса - ровно половина между левой и правой крайностями - ось «веса» - ровно половина чернил на каждой стороне
Затем переместите соседний глиф соседа к тестовому полулифу или от него на основе относительных положений двух осей.
Так, например, в паре «AV» правая половина буквы A тяжелая слева и «притягивает» V; левая половина V тяжела справа "притягивает" A, таким образом, они значительно соединяются вместе.
Тем не менее, я уверен, что есть недостаток в том, что "AA" будет объединен так же, как "AV".
источник
Учитывая заглавные и строчные буквы, есть
56X55=2652
ситуации с парами шрифтов, которые вам следует учитывать, все решения могут быть легко нарушены, потому что если вы измените стиль шрифта, все правила исчезнут.Лучший способ - использовать технику машинного обучения, попытаться создать модель обучения нейронной сети и импортировать несколько текстовых изображений или векторов с кернингом или тому подобное, обучить эту модель и использовать эту обученную модель для разумной настройки любого типа шрифта.
Поскольку не существует статического алгоритма для точной настройки шрифта в корне, машинное обучение было бы хорошим решением для такого рода проблем!
источник