1

我已经在 Freetype 中渲染了一个文本,并使用 Freetype 将其转换为位图。创建的位图存储在一个字符数组中,稍后由 Targa Reader 处理为 .tga 图像。现在,我如何以及何时为将字形转换为位图时的字形,还是应该使用 Freetype 或 Harfbuzz 对其进行着色?

4

2 回答 2

2

我不认为 harfbuzz 为你做这样的事情,它只是一个整形库。但是据我所知,使用freetype,有两种方法可以绘制字形并将它们绘制到位图上。第一的。默认情况下,我猜它会将字形渲染为灰度位图。第二。您可以通过向 freetype 引擎发送一些回调来控制渲染字形,而不是 freetype 这样做,它调用这些函数,其中之一是用于绘制带有 alpha、coverage、x 和 y 参数的扫描线跨度,以便您轻松操作位图。

您可以在 freetype 的一个 c 示例源代码 @freetpye.org 中找到更多关于我所说的内容

如果你觉得它太复杂了,我认为它不是像这样:

unsigned char alpha = src[x, y];
red = color.r * alpha / 0xff;
green = color.g * alpha / 0xff;
blue = color.b * alpha / 0xff;
dst[x, y] = Color(red, green, blue);

希望他们能有所帮助。

于 2017-06-19T20:38:16.757 回答
1

harfbuzz 在这里不是很相关,因为它不关心渲染方面本身。

但是freetype,因为它通常的使用方式(考虑到不谈论颜色表情符号或我不熟悉的其他边缘情况),FT_RENDER_MODE_NORMAL 渲染模式为您提供了一个灰度位图,每个像素分配一个字符,不像彩色图像需要 3大小(如果您也有 alpha 通道,则为 4 倍),并且它不关心颜色 AFAIK,所以您需要做的就是将自由类型渲染的灰度输出乘以您想要的颜色。像这样的伪代码:

coloredImage[x, y].r = r * grayScale[x, y] / 255;
coloredImage[x, y].g = g * grayScale[x, y] / 255;
coloredImage[x, y].b = b * grayScale[x, y] / 255;
于 2016-07-01T17:13:10.940 回答