栅格矢量图像的一般算法是什么?我发现了许多栅格化原始算法,例如线条,圆圈,曲线等。但是对于一般来说,我该怎么办?简而言之,在矢量图片中foreach vector人物,获取像素并将其放入栅格图像中?或者是其他东西?

还有另一个问题,如何使用并发来改善处理时间?例如,我可以单独的向量图形,并同时获得它们的像素。但是也许还有其他方法可以做到这一点?

有帮助吗?

解决方案

对于图像中的每个多边形,一般的栅格化算法就是这样。

(将多边形定义为一个或多个由直线段和参数花键制成的封闭曲线 - 在正常实践中,这些曲线是2阶(圆锥别名二次)和3阶(立方)Bézier花纹。这些封闭的曲线是定义的,因此内部始终在左侧,因为曲线遍历;因此,普通的形状逆时针运行,孔顺时针旋转。)

(i)(投影)将多边形转换为与目标位图相同的坐标系。该分辨率不必相同,对于反偏见的图像通常更大:例如,Freetype使用64个像素。

(ii)(在y中制作单调),在必要时,将多边形的每个段分为较小的段,这些段连续或向下连续运行。此阶段仅用于弯曲段,并且使用Bézier花纹时相对容易。通常的方法是反复脱二,直到实现单调性。丢弃所有水平段。

(iii)(标记运行限制)将每个段绘制为临时位图。使用布雷森汉姆的算法进行直线;对于曲线,直到线从真实曲线中的像素的1/8(表示),然后从头到尾使用直线。绘制时,以某种方式标记像素以(a)是启动还是运行的末端 - 向下线开始,向上行是末端; (b)覆盖范围 - 形状内部像素的比例。这是算法在细节上有所不同的地方和缠绕规则的地方(非零 相对 偶数)区分。

(iv)(扫描)横穿临时位图,行行。对于每一行,从左到右扫描。维护一个状态,该状态通过(例如)将存储在位图中的数字添加到存储的数字中表示当前位置是否在形状内部。在简单的单色栅格化中,该数字在上一个阶段编写的数字将+1 +1越过形状,而在形状上时则为-1。在同一状态下积累像素的累积运行。将运行运行发送到图形模块:例如,freetype emits运行,由y坐标,启动和结束x坐标组成,覆盖率为0到255。绘图模块可以将覆盖范围用作应用于当前绘图颜色的alpha值,或用作粘膜应用于纹理。

以上是一个很好的过度简化,但给出了总体想法。

大多数开源程序都使用以下一个项目之一得出的栅格化代码:

freetype - 一个字体栅格器,其中包含单声道和抗氧化激光镜模块,它们相对易于使用独立的模块 - 也就是说,对于任何形状而言,不仅是字体。我已经在几个商业便携式C ++项目中成功使用了该系统。

Freetype的系统灵感来自Raph Levien的 利巴特.

反晶粒 是另一个受欢迎且有影响力的C ++库。

还有 扫描线边缘标志系统 由基亚·卡利奥(Kiia Kallio)实施,看起来很有希望,似乎比反晶粒更快。

大多数但并非所有这些库都接受由二次和立方体贝齐尔花键以及直线段制成的形状。那些不(例如K. Kallio的图书馆)仅采用直角多边形;但是,比实际曲线的最大距离更接近一系列线段非常容易。 Freetype在内部执行此操作,并且可以在必要时借用其代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top