将字符与图像的采样网格对齐的方法转让专利

申请号 : CN201010105387.9

文献号 : CN101819640B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 罗纳德·N·佩里艾瑞克·陈

申请人 : 三菱电机株式会社

摘要 :

本发明涉及将字符与图像的采样网格对齐的方法。通过具有原始坐标的输入笔命令来对追随字符骨架的原始一致宽度路径进行指定。原始路径的宽度被取整到最近整数以产生微调后的宽度。使用输入笔命令遍历原始路径以识别原始路径的线段。这些线段存储在数组中。确定数组中的各线段的微调后的坐标。对数组进行排序,并构建有向非循环图(DAG)。使用排序后的数组、DAG和微调后的路径的宽度消除线段之间的冲突。将线段拟合到采样网格,并将结果存储在输出笔命令中,由此使字符的骨架与采样网格对齐。

权利要求 :

1.一种用于将字符与图像的采样网格对齐的方法,其中,通过具有原始坐标的输入笔命令来对追随所述字符的骨架的原始路径进行指定,所述路径由笔命令序列构成,该笔命令序列定义了基于一致宽度笔划的字符的一组笔划骨架,该方法包括以下步骤:通过将所述原始路径的宽度取整到最近整数来确定微调后的路径的宽度(201);

使用所述输入笔命令来遍历所述原始路径以识别所述原始路径的线段,并将这些线段存储在数组中(202);

确定所述数组中各线段的微调后的坐标(203);

按升序对所述数组进行排序以获得排序后的数组(204);

由所述排序后的数组中的所述线段构建有向非循环图(205);

使用所述排序后的数组、所述有向非循环图和所述微调后的路径的宽度来消除所述线段之间的冲突(206);

将所述线段拟合到所述采样网格,并将拟合的结果存储在具有所述微调后的坐标的输出笔命令中,以使所述字符的所述骨架与整数采样网格对齐(207、208);

仅当所述微调后的路径的宽度是偶整数时,才将各输出笔命令的各微调后的坐标加

0.5,以将所述字符的所述骨架与半整数采样网格对齐(209)。

2.根据权利要求1所述的方法,该方法进一步包括以下步骤:表现所述输出笔命令(240)。

3.根据权利要求1所述的方法,其中,所述微调后的路径的宽度是至少一个像素。

4.根据权利要求1所述的方法,其中,所述排序是按照非递减的原始坐标执行。

5.根据权利要求1所述的方法,其中,所述排序识别出所述排序后的数组中各线段的子线段。

6.根据权利要求1所述的方法,其中,所述消除(206)进一步包括以下步骤:如果两个线段的所述微调后的坐标之差小于或等于所述微调后的路径的宽度加两个像素,则检测这两个线段之间的冲突。

7.根据权利要求1所述的方法,其中,所述消除(206)在贪心自下至上处理中遍历所述有向非循环图。

8.根据权利要求6所述的方法,其中,所述消除(206)确保所述差至少是所述微调后的路径的宽度加一个像素。

9.根据权利要求6所述的方法,其中,位于垂直线段附近并沿y方向与所述垂直线段重叠的笔命令的x坐标与所述垂直线段对齐,位于水平线段附近并沿x方向与所述水平线段重叠的笔命令的y坐标与所述水平线段对齐,并且其中,沿x方向在位于x附近的最小和最大垂直锚线段之间对笔命令的所有其它x坐标进行线性插值,并且其中,沿y方向在位于y附近的最小和最大水平锚线段之间对笔命令的所有其它y坐标进行线性插值,并且其中,如果一个坐标位于相距一个线段预定义距离内,则该坐标在该线段附近。

10.根据权利要求1所述的方法,其中,最上部和最下部水平线段以及最左侧和最右侧垂直线段与所述采样网格中的最近网格点对齐。

11.根据权利要求1所述的方法,其中,所述对齐将所述原始坐标移动不超过以所述微调后的坐标表示的1.5个像素。

12.根据权利要求1所述的方法,其中,并行地处理水平线段和垂直线段。

13.根据权利要求1所述的方法,其中,所述采样网格是所述图像的像素网格,并且其中,所述图像显示在屏幕上。

14.根据权利要求1所述的方法,其中,所述采样网格是所述图像的子像素网格,并且其中,所述图像显示在屏幕上。

15.根据权利要求1所述的方法,其中,所述字符包括风格化笔划,并且该方法进一步包括以下步骤:由各风格化笔划的轮廓确定代表性路径宽度。

16.根据权利要求15所述的方法,其中,所述代表性路径宽度是各风格化笔划的平均宽度。

17.根据权利要求15所述的方法,其中,所述代表性路径宽度是各风格化笔划的标称宽度。

18.根据权利要求15所述的方法,其中,在由各所述风格化笔划的轮廓确定代表性路径宽度时,对所述轮廓进行采样以确定所述代表性路径宽度。

19.根据权利要求15所述的方法,其中,在由各所述风格化笔划的轮廓确定代表性路径宽度时,使用所述轮廓的解析性描述来确定所述代表性路径宽度。

说明书 :

将字符与图像的采样网格对齐的方法

技术领域

[0001] 本发明总体上涉及字符表现,更具体地讲,涉及对具有一致宽度笔划的字符进行网格对齐。

背景技术

[0002] 对字符或图形进行表现以供显示和打印是存在问题的(特别是当字符很复杂时)。对于中文、日文和韩文(CJK)字符集来说尤其如此(参见图1A)。所示字符具有一致宽度的笔画。本发明的目的在于,使这些笔画与采样网格(例如,像素网格或子像素网格)对齐以进行表现。
[0003] 微调信息(Hint)
[0004] 微调信息是与各个图形一起存储的一组准则或规程,该组准则或规程规定了在表现期间应当如何修改图形以保留一种字样(typeface)的全部图形的诸如对称性、笔划粗细(stroke weight)以及一致外观之类的特征。微调(hinting)要求将字符的边缘与采样网格对齐。在小屏幕尺寸(有或没有图形抗混叠(antialiasing))的情况下,微调对于生成读者清晰易读的文本来说至关重要。微调可以是人工的、自动的或二者相结合。
[0005] 人工进行微调费力且昂贵。例如,开发一种可能具有超过一万种图形的、用于日文或中文字体的微调良好(well-hinted)的字样需要花费数年。因为微调的重点在于改善印刷字体(body type)的表现质量(rendering quality),所以微调对于沿着任意路径放置的字体以及对于动画字体无效。
[0006] 当前用于自动微调的方法对于简单的文字(script)(诸如拉丁文)能生成合理的结果,但是对于复杂的文字(诸如中文和日文)还存在不足。因此,需要一种能有效地处理复杂图形的自动微调方法。利用自动微调,由于不再需要存储在字体文件中的人工微调信息,因此消除了劳动力成本并极大地减小了字体大小。
[0007] 本发明的目的在于出于表现的目的而自动地将笔划与采样网格对齐。

发明内容

[0008] 本发明提供了将字符与图像的采样网格对齐的方法。通过具有原始坐标的输入笔命令来对追随字符骨架(skeleton)的原始一致宽度路径进行指定,所述路径由笔命令序列构成,该笔命令序列定义了基于一致宽度笔划的字符的一组笔划骨架。
[0009] 原始路径的宽度被取整到最近整数以产生微调后的宽度。使用输入笔命令遍历原始路径以识别原始路径的线段。将这些线段存储在数组中。确定该数组中的各线段的微调后的坐标。对数组进行排序,并构建有向非循环图(DAG)。使用排序后的数组、DAG和微调后的路径的宽度消除线段之间的冲突。将线段拟合到采样网格,并将结果存储在输出笔命令中,该输出笔命令具有使字符的骨架与整数采样网格对齐的微调后的坐标。如果微调后的路径的宽度是偶整数,则将各输出笔命令的各微调后的坐标加0.5,以将字符的骨架与半整数采样网格对齐。

附图说明

[0010] 图1A是根据本发明的实施方式的要对齐的具有一致宽度笔划的字符的图;
[0011] 图1B示出了字符相对对齐的采样网格;
[0012] 图1C是根据本发明实施方式的要对齐的字符的图;
[0013] 图2A-2B是根据本发明实施方式的用于将基于一致宽度笔划的字符对齐的方法的流程图;
[0014] 图3是取整前后的线段对齐的图;
[0015] 图4是取整前后以及冲突消除之后的线段对齐的图;
[0016] 图5是根据本发明的实施方式的要对齐的风格化(stylized)笔划字符的图。

具体实施方式

[0017] 图1B示出了根据本发明的实施方式的未对齐采样网格中的中文字符111和对齐采样网格中的中文字符112。因为本发明检测并对齐字符中的多个区,因此本方法被称作多对齐区(multiple alignment zone:MAZ)。
[0018] 图1C示出了根据本发明的实施方式要对齐的字符。该字符由路径或骨架121表示。路径包括笔命令,如下所述。笔命令指定了路径的(x,y)坐标122。笔划的宽度123是一致的。
[0019] 如图2A-2B中所示,将字符与采样网格(例如,将要在屏幕上显示的图像的像素网格或子像素网格)对齐的方法采用对字符的骨架进行追踪的笔命令作为输入213。该方法将笔命令的原始坐标修改为“微调后的”坐标。
[0020] 路径
[0021] 要表现的字符由路径表示。根据本发明实施方式的路径由笔命令序列(例如,moveto、lineto和curveto)构成,该笔命令序列定义了基于一致宽度笔划的字符的一组笔划骨架。基于笔划的字符的骨架可以是开放的(例如,“u”)或者是闭合的(例如“o”)。路径表示使得能够实现任意缩放、旋转和其它变换。
[0022] 笔命令序列指定了对骨架进行追踪的虚拟笔的移动和绘制,并允许绘制线段和Bézier曲线段。每个线段的端点和控制顶点以浮点图像单位指定。
[0023] 下面给出示例性笔命令;需要注意的是,所有坐标(即,x,y,cx和cy)是以浮点图像单位指定:
[0024] moveto x y-开始新路径(即,新的笔划骨架)。这个命令将当前点设置为(x,y)。
[0025] lineto x y-将直线线段追加于当前路径(即,当前笔划骨架)。该线段从当前点延伸至(x,y)。在构建该线段之后,(x,y)变为新的当前点。
[0026] curveto xy cy x y-使用(cx,cy)作为Bezier控制点将二次Bezier曲线段追加于当前点与(x,y)之间的当前路径(即,当前笔划骨架)。在构建该曲线段之后,(x,y)变为新的当前点。
[0027] 对齐方法概述
[0028] 多对齐区(MAZ)检测和网格拟合方法的输入213是(1)表示基于笔划的字符的笔命令序列,(2)原始路径宽度,以及(3)用于表现字符的每em的像素数(ppem),即字符的比例(scale)。笔命令的(x,y)坐标与采样网格对齐,即被自动微调。
[0029] 定义
[0030] 下面的定义和术语分为几类以方便理解对本发明的描述。
[0031] 给定笔命令序列,端点具有相同y坐标的lineto命令确定了“水平线段”。类似地,端点具有相同x坐标的lineto命令确定了“垂直线段”。通用术语“线段”可以表示水平线段或垂直线段。为了简单起见,如果线段是水平线段,则线段可称为“水平的”。类似地,如果线段是垂直线段,则线段可称为“垂直的”。
[0032] 如果:(1)线段S1和S2都是水平的并且存在与S1和S2都相交的垂直线,或者(2)线段S1和S2都是垂直的并且存在与S1和S2都相交的水平线,则这两个线段S1和S2“重叠”。
[0033] 水平线段H的“原始坐标”是H的以实数值图像坐标表示的原始y坐标,即应用网格拟合之前的y坐标。垂直线段V的“原始坐标”是V的以实数值图像坐标表示的原始x坐标,即应用网格拟合之前的x坐标。
[0034] 水平线段H的“微调后的坐标”是在应用网格拟合之后的实数值图像坐标的H的y坐标。垂直线段V的“微调后的坐标”是在应用网格拟合之后的实数值图像坐标的V的x坐标。
[0035] 令S1和S2分别是具有原始坐标c1和c2的线段。如果c1小于或等于c2,则S1和S2处于“升序”,如果c1大于或等于c2,则S1和S2处于“降序”。术语“升序”和“降序”通常适用于任何数量的线段。
[0036] 令S1、S2和S3是处于升序的线段。当且仅当S1和S2重叠并且S2和S3重叠时,S2介于S1和S3“之间”。
[0037] 当且仅当满足所有下面三个条件时线段C是线段S的“子孙”或“子线段”:(1)C的原始坐标小于或等于S的原始坐标,(2)C与S重叠,(3)在C和S之间没有线段。
[0038] 当且仅当C是S的子孙时,线段S是线段C的“父亲”或“父线段”。如果S具有多个子线段,则这些子线段称为S的“子孙”。
[0039] 当且仅当满足下面条件时线段D是线段S的“后代”:(1)D是S的子孙,或者(2)存在线段的某一有序序列S1,S2,...,Sn(其中,n大于或等于1)从而D是S1的子孙,S{i}是S{i+1}的子孙(其中,i大于或等于1并小于n),并且Sn是S的子孙。如果D是S的后代,则S是D的“祖先”。
[0040] “线段树”是由线段S和S的所有后代定义的线段的集合。线段S是该线段树的“根线段”。线段树形成线段的有向非循环图(DAG)。
[0041] 令S是分别具有原始坐标o和微调后的坐标h的线段。令c是如下定义的整数。如果微调后的路径宽度是奇整数,则c是不大于o的最大整数,即c=floor(o)。函数floor产生小于或等于o的最大整数。
[0042] 如果微调后的路径宽度是偶整数,则c是通过将o取整到最近的整数并将结果减去1而确定的整数,即c=round(o)-1。如果h=c+1,则S被“向上取整”,而如果h=c,则S被“向下取整”。如果线段树中的每个线段都被向上取整,则线段树被向上取整。类似地,如果线段树中的每个线段都被向下取整,则线段树被向下取整。
[0043] 如果S1具有与另一线段S2相同的微调后的坐标,则线段S1与线段S2“对齐”。
[0044] 如果线段S与它的子线段中的至少一个对齐,则线段S“折叠(collapse)”。如果线段S不与它的子线段中的任何一个对齐,则线段S“非折叠”。
[0045] 当满足下面条件时两个线段S1和S2“冲突”:(1)它们重叠,(2)它们的微调后的坐标不同,并且(3)它们的微调后的坐标最多相差以实数值图像坐标表示的W个单位,其中,W是微调后的路径宽度。
[0046] 当满足下面条件时S1和S2“刚好(barely)冲突”:(1)它们冲突,并且(2)它们的微调后的坐标恰好相差以实数值图像坐标表示的W个单位,其中,W是微调后的路径宽度。
[0047] “近线段x坐标”是满足下面条件的笔命令P的x坐标:(1)该x坐标与垂直线段V的原始坐标重合(coincide)或者位于垂直线段V的原始坐标的小预定值“epsilon”内,并且(2)P的y坐标在y方向上与V重叠。
[0048] “近线段y坐标”是满足下面条件的笔命令P的y坐标:(1)该y坐标与水平线段H的原始坐标重合或者位于水平线段H的原始坐标的小预定值“epsilon”内,并且(2)P的x坐标在x方向上与H重叠。
[0049] 更一般地,术语“近线段坐标”可以指近线段x坐标或近线段y坐标。
[0050] “非线段坐标”是笔命令的非“近线段”坐标的坐标,即,近线段坐标和非线段坐标的集合互斥并且一起构成了笔命令坐标的全集。
[0051] “半整数”是实数集中的如下元素n,从而对于某一整数k,n=k+0.5,例如,-2.5、-1.5、-0.5、0.5、1.5、2.5和3.5都是半整数。
[0052] “整数像素网格”是如下的实数x和y的有序对(x,y)的集合,其中(x,y)的至少一个元素是整数。例如,坐标(0,0)、(1.5,0)和(1.97,3)位于整数像素网格上,但(1.7,11.2)不在整数像素网格上。从几何学上说,整数像素网格是包括整数水平线(例如,y=-2、y=-1、y=0、y=1、y=2)集合和整数垂直线(例如,x=-2、x=-1、x=0、x=1、x=2)集合的网格。
[0053] “半整数像素网格”是如下的实数x和y的有序对(x,y)的集合,其中(x,y)的至少一个元素是半整数。例如,坐标(0,0.5)、(1.5,0)和(1.97,2.5)在半整数像素网格上,但(1.7,11.2)不在半整数像素网格上。从几何学上说,半整数像素网格是包括半整数水平线(例如,y=-2.5、y=-1.5、y=-0.5、y=0.5、y=1.5、y=2.5)集合和半整数垂直线(例如,x=-2.5、x=-1.5、x=-0.5、x=0.5、x=1.5、x=2.5)集合的网格。
[0054] “x坐标的最小锚线段”是最大原始坐标小于或等于x的非折叠垂直线段。“x坐标的最大锚线段”是最小原始坐标大于或等于x的非折叠垂直线段。类似地,“y坐标的最小锚线段”是最大原始坐标小于或等于y的非折叠水平线段,“y坐标的最大锚线段”是最小原始坐标大于或等于y的非折叠水平线段。
[0055] 在网格拟合期间,非线段坐标被线性插值到它们的对应锚线段之间。通过使用字符的边界框(bounding box)的“最小”或“最大”边(edge)作为“虚拟”锚线段来将丢失至少一个锚线段的非线段坐标作为特殊情况对待,其中,最小和最大边分别对应于非线段x坐标的边界框的左边(edge)和右边,并且最小和最大边分别对应于非线段y坐标的边界框的下边(edge)和上边。
[0056] 下面的一般说明适用于下述方法:
[0057] 该方法在表现期间被动态地调用。因此,该方法被设计为实现高质量、小存储消耗和计算效率之间的有利平衡。
[0058] 可针对任何基于一致宽度笔划的字符调用该方法,但该方法是为CJK字符设计的并且针对CJK字符进行了优化。
[0059] 基于一致宽度笔划的字符主要包括水平和垂直笔划。因此,该方法检测字符的水平和垂直特征并将它们与采样网格对齐。该方法并不试图将其它特征(例如,曲线或对角线)与采样网格对齐。而使用插值对未与采样网格对齐的坐标进行微调,细节参见后面的描述。这种总体策略平衡了高质量和高运行时性能这两个彼此竞争的目标。
[0060] 该方法检测并消除笔划之间的“冲突”,由此防止重要特征变得在视觉上难以辨别,细节参见后面的描述。冲突消除在结果的质量方面起到重要的作用。该方法使用贪心法消除冲突。这种方法在计算方面有效,但不是总能够找到最佳的网格拟合结构。然而,在实践中,这种方法对于大范围的字符产生了高质量结果。在冲突消除期间,该方法不试图保留线段之间的原始间隔或原始间隔比例。
[0061] 为了提高多个字符在外观上的一致性,该方法总是将最上部和最下部的水平线段与网格中的最近像素对齐。类似地,该方法总是将最左侧和最右侧的垂直线段与网格中的最近像素对齐。这种方法防止了例如由于冲突消除导致的进一步网格拟合调节对字符边缘处的重要水平和垂直特征的影响,从而当在同一页上观看时更好地实现了这些特征在多个字符间的对齐。
[0062] 最后,网格拟合需要将笔命令的原始坐标修改为对齐后的或微调后的笔命令。为了使字符形状的变形最小化,该方法从不将坐标相对于它的原始值移开超过1.5像素。
[0063] 该方法的步骤2至6(见以下)使用原始路径执行网格拟合。在步骤7之前,不改变原始笔命令。
[0064] 该方法通过将原始路径宽度取整到最近的整数并将该宽度固定为至少1像素来对路径宽度进行微调。如果微调后的路径宽度是偶整数,则将笔划骨架与半整数像素网格对齐。如果微调后的路径宽度是奇整数,则将笔划骨架与整数像素网格对齐。这种规定确保了所表现的字符的边缘位于采样网格上,由此使边缘对比度最大化。
[0065] 为了使性能最优并使浮点和定点实现之间的代码重用最大化,无论微调后的路径宽度是偶数还是奇数,该方法的大多数步骤使用整数像素网格执行网格拟合。为了适合于微调后的路径宽度,对微调后的坐标的调节延迟到最后的步骤9。
[0066] 以下描述的方法的步骤2至8在本实现中有效应用两次,一次用于水平线段,一次用于垂直线段。需要注意的是,该方法不包含水平线段与垂直线段之间的依赖性。因此,该方法的硬件和多核实现能够完全并行处理水平线段和垂直线段。
[0067] 方法步骤
[0068] 该方法的输入是(1)具有原始坐标213′的笔命令序列213,(2)原始路径宽度,(3)用于表现字符的每em像素数(ppem),即字符的比例。
[0069] 步骤1.通过将原始路径宽度取整到最近的整数来确定(201)微调后的路径的宽度211。确保微调后的路径宽度是至少一个像素。笔划宽度可以指定为em框的一部分,例如3%或5%。如果该宽度是偶数,则将骨架与半整数(0.5,1.5,2.5,...)对齐,而如果该宽度是奇数,则将骨架与整数(0,1,2,...)对齐。
[0070] 步骤2.遍历输入笔命令213以识别(202)路径的线段。线段存储在未排序的线段数组212中。
[0071] 步骤3.确定(203)线段数组中的各线段的微调后的坐标215。如果微调后的路径宽度是奇整数,则通过将原始坐标取整到最近的整数来确定微调后的坐标。如果微调后的路径宽度是偶整数,则通过计算原始坐标的向下取整的下限(floor)来确定微调后的坐标。在这两种情况中的任一情况下,可以如下修改微调后的坐标以消除冲突(见步骤6)并适应微调后的路径宽度(见步骤9)。
[0072] 步骤4.将线段数组中的线段排序(204)为升序以获得排序后的数组212’,即按照非递减的原始坐标进行排序。
[0073] 步骤5.构建DAG 205。识别排序后线段数组212’中的各线段的子线段,并构建(205)有向非循环图(DAG)214。通过将各线段链接到它的子线段而以隐含的方式表示DAG。
[0074] 构建这个DAG的目的是在下一步骤中检测并消除线段之间的冲突。如果P和C的当前微调后的坐标相差超过W+2个像素,则在冲突消除期间不会出现线段S和子线段C之间的冲突,其中,W是微调后的路径宽度211。因此,为了提高运行时效率,当且仅当S和C的微调后的坐标相差W+2个像素或更少时,在S和C之间加入DAG中的链接。
[0075] 步骤6.由于步骤3中的微调,使用贪心自下至上处理来检测(206)冲突的线段并消除冲突。在视觉上,冲突的线段看上去是单一的粗笔划而非两个分开的笔划。通过将这些线段之一的微调后的坐标增加+1或-1使得这两个线段变为分开至少W+1个像素,能够在一些情况下消除冲突,其中,W是在步骤1中确定的微调后的路径宽度211,细节参见下面描述和图4。
[0076] 通过使用贪心法消除冲突。贪心法按自下至上的顺序(即,从最下部的后代到最上部祖先)遍历DAG 214。因为在步骤4中按升序对线段进行了排序,所以通过访问线段数组中的各线段而完成了这种自下至上的遍历,该访问是以线段数组中的第一线段开始,并以线段数组中的最后一个线段结束。
[0077] 令M1和M2是线段数组中的第一线段和最后一个线段的当前微调后的坐标。为了获得多个字符间重要特征的一致对齐,当前微调后的坐标等于M1的所有线段保持固定在M1,即这些线段不会受到冲突消除的影响。类似地,当前微调后的坐标等于M2的所有线段保持固定在M2。
[0078] 对于在自下至上遍历线段数组期间访问的每个线段S,应用下面的步骤。
[0079] 步骤6a.如果S的当前微调后的坐标等于M1,则前进至下一线段。
[0080] 步骤6b.如果S的当前微调后的坐标等于M2,则将下面的步骤应用于与S冲突的S的每个子孙C。
[0081] 步骤6b1.如果C刚好与S冲突,则前进至步骤(6b2)。否则,前进至步骤(6b4)。
[0082] 步骤6b2.如果C被向上取整并且在不会与它的任一子孙冲突的情况下能够被向下取整,则将C向下取整,并前进至步骤(6b5)。例如,如果C的原始坐标是2.6并且微调后的路径宽度是1像素,则C的微调后的坐标在正常情况下“向上取整”到3.0。而“向下取整”则会产生整数2.0。参照以上术语部分中“向上取整”和“向下取整”的定义。这个步骤尝试去除冲突,并且总是避免引入任何新的冲突。
[0083] 步骤6b3.如果C被向上取整并且在无论如何不会在线段树中产生任何冲突的情况下具有根C的线段树能够被向下取整,则将该线段树向下取整并且前进至步骤(6b5)。这个步骤尝试去除冲突,并且总是避免引入任何新的冲突。
[0084] 步骤6b4.如果S仍然与C冲突,则将C与S对齐。例如,如果C的微调后的坐标是4.0,S的微调后的坐标是5.0,并且微调后的路径宽度是1像素,则将C与5.0对齐。
[0085] 步骤6b5.完成。
[0086] 步骤6c.如果S的当前微调后的坐标在M1和M2之间,则将下面的步骤应用于与S冲突的S的每个子孙C。
[0087] 步骤6c1.如果C刚好与S冲突,则前进至步骤(6c2)。否则,前进至步骤(6c5)。
[0088] 步骤6c2.如果C被向上取整并且在不会与它的任一子孙冲突的情况下能够被向下取整,则将C向下取整,并前进至步骤(6c6)。例如,如果C的原始坐标是2.6并且微调后的路径宽度是1像素,则C的微调后的坐标在正常情况下“向上取整”到3.0。而“向下取整”则会产生整数2.0。这个步骤尝试去除冲突,并且总是避免引入任何新的冲突。
[0089] 步骤6c3.如果C被向上取整并且在无论如何不会在线段树中产生任何冲突的情况下具有根C的线段树能够被向下取整,则将该线段树向下取整并且前进至步骤(6c6)。这个步骤尝试去除冲突,并且总是避免引入任何新的冲突。
[0090] 步骤6c4.如果S被向下取整,则将S向上取整并前进至步骤(6c6)。例如,如果S的原始坐标是5.8并且微调后的路径宽度是2像素,则S的微调后的坐标在正常情况下向下取整到5.0,即floor(5.8)=5.0=round(5.8)-1。而向上取整则会产生整数6.0。这个步骤尝试去除冲突,但是会在S和S的父亲之间引入冲突。当在随后重复对DAG214的自下至上的遍历中处理S的父亲时,去除这种潜在的冲突。
[0091] 步骤6c5.将S与C对齐。例如,如果C的微调后的坐标是4.0,S的微调后的坐标是5.0,并且微调后的路径宽度是1像素,则将S与4.0对齐。
[0092] 步骤6c6.完成。
[0093] 步骤(6b2)至(6b3)以及步骤(6c2)至(6c4)尝试将线段C和S取整以使这些线段分开至少W+1个像素,其中,W是微调后的路径宽度211。然而,存在无法通过这种方法消除冲突的一些情况。因为在这些情况下不能在视觉上区分C和S,所以步骤(6b4)和(6c5)将S与C对齐,由此通过将这两个线段与同一坐标对齐来简化字符的外观。需要注意的是,步骤(6b4)和(6c5)之间的差别在于:在步骤(6b4)中,将C与S对齐,而在步骤(6c5)中,将S与C对齐。
[0094] 图3示出了取整到采样网格的最近网格线(例如,图像的最近像素扫描线或子像素扫描线)之前(301)和取整到采样网格的最近网格线之后(302)的情况。
[0095] 图4示出了取整到采样网格的最近网格线之前(301)、取整到采样网格的最近网格线之后(302)和冲突消除(401)的情况。
[0096] 步骤7.对近线段坐标执行网格拟合207,并将结果存储在输出笔命令233中。将位于垂直线段附近并沿y方向与垂直线段重叠的笔命令的x坐标与该垂直线段对齐。类似地,将位于水平线段附近并沿x方向与该水平线段重叠的笔命令的y坐标与该水平线段对齐。
[0097] 步骤8.对非线段坐标执行网格拟合208,并将结果存储在输出笔命令233中。沿x方向在x附近的最小和最大垂直锚线段之间对笔命令的非线段x坐标进行线性插值。类似地,沿y方向在y附近的最小和最大水平锚线段之间对笔命令的非线段y坐标进行线性插值。
[0098] 步骤9.如果微调后的路径宽度是偶整数,则将各笔命令的各坐标加(209)0.5。这个步骤有效地将笔划骨架与半整数像素网格对齐。
[0099] 字符笔划一致的输出笔命令233现在与采样网格对齐,并且能够继续进行表现(240)。
[0100] 需要注意的是,虽然借助于利用Bezier曲线段来定义笔命令213而描述了该方法,但可以使用任何种类的曲线段,例如,Hermite、Catmull-Rom和B-spline。
[0101] 风格化笔划字符的对齐
[0102] 本发明的另一实施方式提供了一种将风格化笔划字符与采样网格对齐的方法。
[0103] 风格化笔划字体(SSF)是基于增强笔划的字体,该字体的笔划粗细可变并具有风格笔划末端-见“An Improved Representation for Stroke-based Fonts”,SIGGRAPH2006 Conference Abstracts and Applications,Elena J.Jakubiak,Ronald N.Perry,and Sarah F.Frisken。SSF采用对形状在字体内的重复进行调节的模块化结构,使得SSF能够将外形字体的表达(expressiveness)与和当前一致宽度笔划字体相当的内存占用相匹配。
[0104] 如图5中所示,SSF笔划的结构反映了书法笔的移动。笔划主体包括:中心线501,其反映笔的路径;以及轮廓502,其反映笔的压力随着前进的变化。SSF笔划的末端503是当笔尖放在纸上和离开纸时笔的移动的开始和结束的风格化表现。各中心线501和末端503由线段和Bezier曲线的开放的、分段连续的路径来表示。轮廓502由定义从笔划中心线到笔划的两侧边缘的垂直距离的一组Bezier曲线来表示。
[0105] 在这个实施方式中,该方法首先确定风格化笔划字符的代表性笔划宽度。代表性笔划宽度能够以几种方法确定。例如,可以在一系列采样点处对风格化笔划字符的轮廓502进行采样。然后使用采样点来确定平均笔划宽度。作为另一例子,可以用解析方式对轮廓502进行分析以确定代表性笔划宽度。作为又一例子,风格化笔划字符的用户指定的标称笔划宽度能够用作代表性笔划宽度。
[0106] 随后,对风格化笔划字符调用上述方法步骤1-9,其中,代表性笔划宽度定义了原始路径宽度,风格化笔划字符的中心线501定义了笔命令213。输出笔命令233定义了风格化笔划字符的对齐的中心线,由此将风格化笔划字符与采样网格对齐。
[0107] 工作环境
[0108] 可以利用各种通用或专用计算机系统环境或结构来操作本发明。适于使用本发明的公知的计算机系统、环境和/或结构的示例包括,但不限于,个人计算机、服务器计算机、手持或膝上型设备、多处理器系统或多核系统、图像处理单元(GPU)、专用集成电路(ASIC)、现场可编程门阵列(FPGA)、基于微控制器的系统、机顶盒、可编程消费电子设备、网络PC、迷你计算机、主机计算机、包括任意上述系统或设备的分布式计算环境等。监视器或其它类型的显示设备连接到上述系统中的任何一个以使得能够显示本发明的对齐。
[0109] 如上所述,该方法不包含水平线段和垂直线段之间的依赖性。因此,该方法的硬件和多核实现能够完全并行处理水平线段和垂直线段。例如,多核处理器的一个核能够执行水平线段的对齐,而多核处理器的另一核能够执行垂直线段的对齐。