Alguém conhece algum algoritmo que calcule o kerning automático de caracteres com base em formas de glifo quando o usuário digita texto?
Não me refiro a cálculos triviais de larguras avançadas ou similares, mas a analisar a forma dos glifos para estimar a distância visualmente ideal entre os caracteres. Por exemplo, se colocarmos três caracteres seqüencialmente em uma linha, o caractere do meio deverá parecer estar no centro da linha, apesar das formas do personagem. Um exemplo ilustra a funcionalidade do kerning-on-the-fly:
Um exemplo de kerning-on-the-fly:
Na imagem acima a
parece estar muito certo. Ele deve ser deslocado uma certa quantidade para T
que pareça estar no meio de T
e g
. O algoritmo deve examinar as formas T
e a
(e possivelmente outras letras também) e decidir quanto a
deve ser deslocado para a esquerda. Essa quantia é o que o algoritmo deve calcular - SEM EXAMINAR OS PARES KERNING POSSÍVEIS DA PIA BATISMAL.
Estou pensando em codificar um programa javascript (+ svg + html) que usa fontes desenhadas à mão e muitas delas não possuem pares de kerning. Os campos de texto serão editáveis e podem incluir texto de várias fontes. Eu acho que o kerning-on-the-fly pode ser uma maneira de garantir um fluxo médio de texto nesse caso.
EDIT: Um ponto de partida para isso pode ser o uso da fonte svg, por isso é fácil obter valores de caminho. Na fonte svg, o caminho é definido desta maneira:
<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"/>
O algoritmo (ou código javascript) deve examinar esses caminhos de alguma maneira e determinar a distância ideal entre eles.
fonte
Respostas:
Eu sei que isso é velho. Estou trabalhando nisso agora em uma implementação WebGL de texto instável (tanto faz). A solução em que estou trabalhando é assim:
Dessa forma, a 'área' vazia entre as letras deve ser reduzida a uma média bastante comum. Especifique o intervalo mínimo e a área mínima usando tentativa e erro e seu próprio gosto, e talvez permita que esses parâmetros sejam ajustados por outro agente também ... como um valor de kerning manual.
yay :)
Edit: Eu implementei isso com sucesso agora e funciona muito bem :)
fonte
Este é um algoritmo bastante simples que eu tentei uma vez e pode ser bom o suficiente.
Renderize os caracteres em baixa resolução - diga seis ou sete pixels de altura (altura do capital típico) aproximadamente na mesma horizontalmente. Você deseja um mapa binário simples de onde há espaço vazio versus partes da carta, em uma grade simples de baixa resolução.
"Engorda" esses mapas de letras. Ou seja, preencha cada célula vazia adjacente a uma célula preenchida. Isso significa reivindicar um território vazio mais próximo das bordas da letra, para que a letra vizinha não chegue muito perto.
Jogue "Tetris horizontal" com os mapas de letras resultantes. Deixe a gravidade agir para a esquerda. A "barriga" esquerda abaulada do "a" cairá na cavidade sob a barra do "T". Quantas células o "a" moveu? Aumente isso proporcionalmente ao tamanho real das letras e é até onde o kern de alta resolução é "a" para a esquerda.
fonte
Já existem algoritmos para auto-kerning. Nenhum é à prova de idiotas e eles tendem a precisar de um pouco de manipulação manual e correção manual de certos aspectos, especialmente se o seu rastreamento for relativamente apertado.
Mas esses algoritmos são para aplicar o kerning ao arquivo de fonte , não às letras, pois são gerados a partir do arquivo de fonte.
Você já pensou em aplicar o kerning automático ao arquivo de fonte?
Fontforge (código aberto) e Fontlab (comercial) contêm algoritmos de kerning automático. Eles teriam uma curva de aprendizado relativamente íngreme - você precisa estar familiarizado com aspectos técnicos de como as fontes funcionam.
Há também iKern que é um cara que oferece um comercial-kerning fonte de serviços pelo qual ele Kerns sua fonte para você e faz um excelente trabalho em vez. Não sei quanto custaria.
fonte
Não tenho tempo para refletir completamente ou desenhar ilustrações, mas tive uma meia ideia baseada em dividir primeiro cada glifo verticalmente.
Em seguida, para cada metade, determine dois eixos verticais: - a bissetriz - exatamente metade entre os extremos esquerdo e direito - o eixo "peso" - exatamente metade da tinta de cada lado
Em seguida, mova o glifo vizinho adjacente na direção ou para longe do meio-glifo de teste com base nas posições relativas dos dois eixos.
Assim, por exemplo, no par "AV", a metade direita do A é pesada para a esquerda e "atrai" o V; a metade esquerda do V é pesada à direita "atrai" o A, assim eles são unidos significativamente.
No entanto, tenho certeza de que há uma falha no "AA" ser agrupado tanto quanto "AV".
fonte
Considerando maiúsculas e minúsculas, há
56X55=2652
situações de par de fontes que você deve se preocupar; todas as soluções podem ser facilmente quebradas , pois se você alterar o estilo da fonte, todas as regras foram cumpridas.A melhor maneira é usar a técnica de aprendizado de máquina, tentar estabelecer um modelo de estudo de rede neural e importar várias imagens ou vetores de texto kerned ou coisas assim, treinar esse modelo e usar esse modelo treinado para ajustar inteligentemente qualquer tipo de fonte.
Como não há algoritmo estático para ajustar perfeitamente a fonte na raiz, o aprendizado de máquina seria uma boa solução para esse tipo de problema!
fonte