¿Alguien conoce algún algoritmo que calcule automáticamente el interletraje de caracteres basado en formas de glifo cuando el usuario escribe texto?
No me refiero al cálculo trivial de los anchos de avance o similares, me refiero a analizar la forma de los glifos para estimar la distancia visual óptima entre los caracteres. Por ejemplo, si colocamos tres caracteres secuencialmente en una línea, el personaje del medio debería PARECER estar en el centro de la línea a pesar de las formas del personaje. Un ejemplo ilumina la funcionalidad kerning-on-the-fly:
Un ejemplo de kerning-on-the-fly:
En la imagen de arriba a
parece ser demasiado correcta. Debería desplazarse una cierta cantidad hacia T
para que parezca estar en el medio de T
y g
. El algoritmo debe examinar las formas de T
y a
(y posiblemente otras letras también) y decidir cuánto a
se debe desplazar hacia la izquierda. Esta cierta cantidad es lo que debe calcular el algoritmo, SIN EXAMINAR LOS POSIBLES PARES DE KERNING DE LA FUENTE.
Estoy pensando en codificar un programa javascript (+ svg + html) que use fuentes dibujadas a mano y muchas de ellas carecen de pares de interletraje. Los campos de texto serán editables y pueden incluir texto de múltiples fuentes. Creo que el interletraje sobre la marcha podría ser una forma de garantizar el flujo de texto medio en este caso.
EDITAR: Un punto de partida para esto podría ser usar la fuente svg, por lo que es fácil obtener valores de ruta. En la fuente svg, la ruta se define de esta manera:
<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"/>
El algoritmo (o código javascript) debe examinar esas rutas de alguna manera y determinar la distancia óptima entre ellas.
fuente
Respuestas:
Sé que esto es viejo. Estoy trabajando en esto ahora mismo en una implementación WebGL de texto tambaleante (lo que sea). La solución en la que estoy trabajando es así:
De esa manera, el 'área' vacía entre letras debería exprimirse a un promedio bastante común. Especifique el espacio mínimo y el área mínima usando prueba y error y su propio gusto, y tal vez permita que esos parámetros sean ajustados por algún otro agente también ... como un valor de interletraje manual.
Hurra :)
Editar: He implementado esto con éxito ahora y funciona muy bien :)
fuente
Este es un algoritmo bastante simple que probé una vez, y puede ser lo suficientemente bueno.
Renderice los caracteres en baja resolución, digamos seis o siete píxeles de alto (altura del capital típico) aproximadamente igual horizontalmente. Desea un mapa binario simple de dónde hay espacio vacío frente a partes de la letra, en una cuadrícula simple de baja resolución.
"Engordar" estos mapas de letras. Es decir, llene cada celda vacía que está adyacente a una celda llena. Esto es para reclamar el territorio vacío más cercano a los bordes de la letra, para que la letra vecina no se acerque demasiado.
Juega "Tetris horizontal" con los mapas de letras resultantes. Deje que la gravedad actúe a la izquierda. El abultado "vientre" izquierdo de la "a" "caerá" en la cavidad debajo de la barra superior de la "T". ¿Cuántas células se movió la "a"? Escale eso en proporción al tamaño real de las letras y así de lejos es el núcleo de la alta resolución "a" hacia la izquierda.
fuente
Ya existen algoritmos para el kerning automático. Ninguno es infalible y tienden a necesitar un poco de agarre manual y corrección manual de ciertos aspectos, especialmente si su seguimiento es relativamente estrecho.
Pero esos algoritmos son para aplicar el interletraje al archivo de fuente , no a las letras, ya que se generan a partir del archivo de fuente.
¿Has considerado aplicar el kerning automático al archivo de fuente?
Fontforge (código abierto) y Fontlab (comercial) contienen algoritmos de interletraje automático. Tendrían una curva de aprendizaje relativamente pronunciada: debe estar familiarizado con los aspectos técnicos de cómo funcionan las fuentes.
También hay iKern que es un tipo que ofrece un comercial font-kerning de servicio por el que él interletraje su fuente para usted y hace un lugar excelente trabajo. No sé cuánto costaría.
fuente
No tengo tiempo para pensarlo completamente, o dibujar ilustraciones, pero tenía una idea a medias basada en la primera bisección vertical de cada glifo.
Luego, para cada mitad, determine dos ejes verticales: - la bisectriz - exactamente la mitad entre los extremos izquierdo y derecho - el eje de "peso" - exactamente la mitad de la tinta en cada lado
Luego mueva el glifo vecino adyacente hacia o lejos del medio glifo de prueba según las posiciones relativas de los dos ejes.
Entonces, por ejemplo, en el par "AV", la mitad derecha de la A es pesada y "atrae" la V; la mitad izquierda de la V es pesada y derecha "atrae" a la A, por lo tanto se agrupan significativamente.
Sin embargo, estoy seguro de que hay una falla en que "AA" se agruparía tanto como "AV".
fuente
Teniendo en cuenta mayúsculas y minúsculas, hay
56X55=2652
situaciones de pares de fuentes que debe preocupar, todas las soluciones pueden romperse fácilmente porque si cambia el estilo de fuente, todas las reglas desaparecen.La mejor manera es usar la técnica de aprendizaje automático, tratar de establecer un modelo de estudio de redes neuronales e importar múltiples imágenes de texto o vectores o cosas así, entrenar ese modelo y usar ese modelo entrenado para ajustar de manera inteligente cualquier tipo de fuente.
Debido a que no existe un algoritmo estático para ajustar la fuente perfectamente en la raíz, el aprendizaje automático sería una buena solución para este tipo de problema.
fuente