Czy ktoś zna jakiś algorytm, który automatycznie obliczałby kerning znaków na podstawie kształtów glifów, gdy użytkownik wpisuje tekst?
Nie mam na myśli trywialnych obliczeń szerokości posunięć itp., Mam na myśli analizę kształtu glifów w celu oszacowania optymalnej wizualnie odległości między postaciami. Na przykład, jeśli ułożymy trzy znaki sekwencyjnie w linii, środkowy znak powinien WIDZIĆ SIĘ, aby znajdować się na środku linii, pomimo kształtów postaci. Przykład oświeca funkcjonalność kerningu w locie:
Przykład kerningu w locie:
Na powyższym zdjęciu a
wydaje się być zbyt poprawne. Powinien być przesunięty o określoną wartość w kierunku, T
tak aby wydawał się znajdować w środku T
i g
. Algorytm powinien zbadać kształty T
i a
(i ewentualnie także inne litery) oraz zdecydować, o ile a
należy przesunąć w lewo. Algorytm powinien obliczyć tę pewną ilość - BEZ BADANIA MOŻLIWYCH PAR PAROWYCH CZCIONKI.
Zastanawiam się nad kodowaniem programu javascript (+ svg + html), który używa ręcznie rysowanych czcionek i wielu z nich nie ma par kerningu. Pola tekstowe będą edytowalne i mogą zawierać tekst wielu czcionek. Myślę, że kerning w locie może być jednym ze sposobów zapewnienia średniego przepływu tekstu w tym przypadku.
EDYCJA: Jednym z punktów wyjścia może być użycie czcionki svg, więc łatwo jest uzyskać wartości ścieżki. W czcionce svg ścieżka jest zdefiniowana w następujący sposób:
<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"/>
Algorytm (lub kod javascript) powinien w jakiś sposób zbadać te ścieżki i określić optymalną odległość między nimi.
źródło
Odpowiedzi:
Wiem, że to jest stare. Pracuję nad tym teraz w implementacji niestabilnego tekstu WebGL (cokolwiek). Rozwiązanie, nad którym pracuję, wygląda następująco:
W ten sposób pusty „obszar” między literami powinien zostać ściśnięty do dość powszechnej średniej. Określ minimalną przerwę i minimalny obszar, używając metody prób i błędów oraz własnego gustu, i może pozwól, aby parametry te zostały również dostosowane przez innego agenta ... jak np. Wartość ręcznego kerningu.
tak :)
Edycja: Zaimplementowałem to teraz pomyślnie i działa naprawdę dobrze :)
źródło
Jest to dość prosty algorytm, który wypróbowałem raz i może być wystarczająco dobry.
Renderuj postacie w niskiej rozdzielczości - powiedzmy sześć lub siedem pikseli wysokości (wysokość typowego kapitału) mniej więcej tak samo w poziomie. Chcesz prostą binarną mapę miejsca, w którym jest pusta przestrzeń względem części litery, na prostej siatce niskiej rozdzielczości.
„Tucz” te mapy literowe. Oznacza to, że wypełnij każdą pustą komórkę, która sąsiaduje z wypełnioną komórką. Ma to na celu zajęcie pustego terytorium najbliższego krawędziom liter, aby sąsiednia litera nie zbliżyła się zbyt blisko.
Zagraj w „horizontal Tetris” z wynikowymi mapami liter. Niech grawitacja działa w lewo. Wypukły lewy „brzuch” „a” „wpadnie” do wnęki pod górną częścią „T”. Ile komórek poruszyło się „a”? Skaluj to w górę proporcjonalnie do rzeczywistego rozmiaru liter i to, jak daleko jest kernowanie rzeczywistej wysokiej rozdzielczości litery „a” w lewo.
źródło
Algorytmy automatycznego kerningu już istnieją. Żadne z nich nie jest głupie i zwykle wymaga trochę trzymania za rękę i ręcznej korekty niektórych aspektów, szczególnie jeśli twoje śledzenie jest stosunkowo ścisłe.
Ale te algorytmy służą do zastosowania kerningu do pliku czcionek , a nie do liter, które są generowane z pliku czcionek.
Czy rozważałeś zastosowanie automatycznego kerningu w pliku czcionek?
Fontforge (open source) i Fontlab (komercyjny) zawierają algorytmy automatycznego kerningu. Miałyby one stosunkowo stromą krzywą uczenia się - musisz znać techniczne aspekty działania czcionek.
Istnieje również iKern, który jest facetem, który oferuje komercyjną usługę kerningu czcionek , w której kernuje twoją czcionkę za ciebie i wykonuje dość dobrą robotę. Nie wiem, ile by to kosztowało.
źródło
Nie mam czasu, aby przemyśleć to w pełni lub narysować ilustracje, ale miałem półpomysł oparty na pierwszym przecięciu każdego glifu w pionie.
Następnie dla każdej połowy określ dwie osie pionowe: - dwusieczną - dokładnie połowę między skrajną lewą i prawą - oś „ciężaru” - dokładnie połowę atramentu z każdej strony
Następnie przesuń sąsiadujący glif w kierunku lub od pół-glifu testowego w oparciu o względne położenia dwóch osi.
Na przykład w parze „AV” prawa połowa litery A jest ciężka z lewej strony i „przyciąga” V; lewa połowa litery V jest ciężka, „przyciąga” literę A, dzięki czemu są one znacznie skręcone razem.
Jestem jednak pewien, że wada „AA” byłaby zmiażdżona razem tak samo jak „AV”.
źródło
Biorąc pod uwagę duże i małe litery, są
56X55=2652
sytuacje, w których należy wziąć pod uwagę parę czcionek, wszystkie rozwiązania mogą być zepsute, ponieważ jeśli zmienisz styl czcionki, wszystkie reguły znikną.Najlepszym sposobem jest użycie techniki uczenia maszynowego, próba ustanowienia modelu badania sieci neuronowej i zaimportowanie wielu tekstów obrazu jądra lub wektora lub podobnych rzeczy, wytrenowanie tego modelu i użycie tego wyuczonego modelu w celu inteligentnego dostosowania dowolnego rodzaju czcionki.
ponieważ nie ma statycznego algorytmu do idealnego dopasowania czcionki w katalogu głównym, uczenie maszynowe byłoby dobrym rozwiązaniem tego rodzaju problemu!
źródło