急转弯


10

是否有人知道用户键入文本时会根据字形形状自动计算字符字距的算法?

我的意思不是简单地计算超前宽度或类似宽度,而是分析字形的形状以估计字符之间的视觉上最佳距离。例如,如果我们在一行中依次排列三个字符,则尽管字符形状不同,但中间字符应SEEM位于行的中心。一个示例启发了即时调整功能:

即时调整示例:

屏幕截图

在上面的图像中a似乎太正确了。应该移动的一定量的走向T,以便它似乎是在中部Tg。该算法应该检查的形状Ta(可能还有其他的字母也可以),并决定多少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代码)应以某种方式检查这些路径并确定它们之间的最佳距离。


1
如果您正在寻找一种编码解决方案,那么最好在SO上提出。那是您要找的东西吗?如果是这样,我将把问题移到那里。
艾伦·吉尔伯特森

2
我同意这是一个问题。我在SO中问了同样的问题,但是这里没有主题。然后在math.stackexchange上询问,但发生了同样的关闭。这是第三名,也许是正确的地方,无论谁知道。
TimoKähkönen2012年

2
我不知道该算法的工作原理,但是InDesign可以做到这一点:“光学字距调整可根据相邻字符的形状来调整它们之间的间距。某些字体包括健壮的对对规格。但是,当字体仅包含最少的内置字符时字距调整或根本不字距调整,或者如果您在一行中的一个或多个单词中使用两种不同的字体或字号,则可能要使用光学字距调整选项。” help.adobe.com/zh_CN/indesign/cs/using/…– 2012
e100

2
我认为,就一般算法而言,这可能在范围内-解决问题需要执行的一系列步骤。但是我不认为以JS或其他语言实现的细节不属于任何东西,我正在编辑仅将JS作为背景用例。
e100 2012年

1
我认为首要任务是以一种对机器算法有用的方式定义“最优”。
horatio 2012年

Answers:


4

我知道这很旧。我现在正在通过摆动文本的WebGL实现(无论如何)进行此工作。我正在研究的解决方案是这样的:

  1. 获取字形对的位图版本(或根据需要使用向量)
  2. 对于每一行像素(如果使用矢量,则为任意垂直单位),请检查两个字形是否存在至少一个像素
  3. 对于通过步骤2的每一行,计算第一个字形的最右边像素和第二个字形的最左边像素之间的距离
  4. 在仍满足以下条件的同时,将第二个字形移到最左侧:
    • 该像素行中的间隙大于您指定的某个最小间隙
    • 总面积(忽略字形之一中没有像素的行)大于您指定的某个最小面积

这样,字母之间的空白“区域”应该被压缩到一个相当普通的平均值。使用反复试验和您自己的口味来指定最小间隙和最小面积,并可能允许其他代理程序来调整这些参数...例如手动字距调整值。

好极了 :)

编辑:我已经成功暗示了这一点,它真的很好用:)


好答案!欢迎GD.SE :)
Yisela

感谢您的欢迎:D !! 我应该补充一点,该区域应除以实际测试的行数(实际上只是使其成为平均差距,而不是真正的区域)。而且,最好测试行的间隙是否为统计异常值,并且如果有则忽略该行。这将有助于避免在'G'等大开口的情况下将字母挤得太近
2014年

到处都有似乎有问题的孩子,例如T-或o',例如某些字体的某些字体样式。T-让连字号与T的距离太近,而o'在同一行中没有共享任何像素,因此,我进行了一次后备操作,以在出现这种情况时使用最接近的行,每行一个像素。为了使上述算法更健壮,您需要以某种方式检查这些类型的问题。对我而言,这不是必需的。
2014年

3

这是我尝试过的相当简单的算法,可能已经足够了。

以低分辨率渲染字符-例如,水平放置大约六或七个像素(典型大写字母的高度)。您需要一个简单的二进制图,该图在一个简单的低分辨率网格上显示空白处和字母的各个部分。

将这些字母映射为“胖”。也就是说,填充与已填充单元格相邻的每个空单元格。这是为了声明最靠近字母边缘的空区域,因此相邻字母不会太靠近。

使用生成的字母图玩“水平俄罗斯方块”。让重力作用于左侧。凸起的“ a”的左手“腹部”将“掉入”“ T”的横杆下方的空腔中。“ a”移动了多少个单元格?与字母的实际大小成比例地将其按比例缩放,这是向左对齐实际高分辨率“ a”的距离。


1
谢谢!为了形象化您的算法,您可以使用Arial使用“ db”,“ AA”,“ Ta”和“ c-”对提供一些低分辨率图像示例。
2012年

良好的开端,但我认为这可能会受到限制,因为成对的突出字符不能一起“俄罗斯方块”,例如“ bd”,“ TT”,“ pq”,“ gj”
e100 2012年

@ e100:乍一看那些特定的配对不会有重叠的边界框...
horatio 2012年

但一般来说,它们的字距应该比“ MM”,“ NN”等更紧
2012年

2

自动字距调整算法已经存在。没有一个是万无一失的,它们往往需要某些方面的手动操作和手动校正,尤其是在您的跟踪相对紧张的情况下。

但是这些算法是将字距调整应用到字体文件,而不是字距,因为它们是从字体文件生成的。

您是否考虑过将自动字距调整应用于字体文件?

Fontforge(开源)和Fontlab(商业)包含自动字距调整算法。它们的学习曲线相对较陡-您必须熟悉字体如何工作的技术方面。

还有iKern这是一个人,提供了一个商业字体,字距服务,由此他克恩斯您的字体为你和做了相当出色的工作。我不知道要花多少钱。


但是问题实际上是“这样的算法将如何工作?” -您可以添加有关FontForge的工作方式的任何详细信息吗?
e100 2012年


0

我没有时间充分思考这个问题,也没有时间画插图,但是我有一个半想法,那就是首先将每个字形垂直平分。

然后,对于每一半,确定两个垂直轴:-等分线-左右两端之间的正好一半-“重量”轴-每一侧的墨水正好一半

然后,基于两个轴的相对位置,将相邻的相邻字形移向或移离测试半字形。

因此,例如,在“ AV”对中,A的右半部分是左重的,“吸引”了V;V的左半部分较重,“吸引”了A,因此它们被紧缩在一起。

但是,我敢肯定,“ AA”和“ AV”一样会紧缩在一起存在一个缺陷。


0

考虑到大写和小写,56X55=2652您应该关注某些字体对情况,如果更改字体样式,所有解决方案都可能会轻易中断,导致所有规则消失。

最好的方法是使用机器学习技术,尝试建立神经网络学习模型,并导入多个字距紧缩的文本图像或矢量或类似的东西,训练该模型并使用该训练的模型智能地调整任何一种字体。

由于没有静态算法可以完美地从根本上调整字体,因此机器学习将是解决此类问题的好方法!


如果只有主要的主观标准,则不会。“这是狗还是猫?”,不管狗看起来多么怪异,仍然有确切的答案。(即使需要兽医来验证。)
usr2564301
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.