渲染字体看起来比应该更大胆

时间:2014-10-02 12:06:29

标签: c fonts freetype text-rendering freetype2

我使用freetype2渲染字体 Consolas

我使用

渲染了字形
FT_Load_Glyph(face, glyphIndex, FT_LOAD_DEFAULT);
FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);

并使用简单的循环将位图转换为ARGB地图:

uint32_t* content = ... // ARGB bitmap

for (int py = 0; py < bitmap->rows; py++) {
    for (int px = 0; px < bitmap->width; px++) {
        uint8_t intensity = bitmap->buffer[py * bitmap->pitch + px];
        content[py * bitmap->width + px] = (intensity << 24);
    }
}

结果是我的渲染文本看起来比从例如记事本渲染时更大胆:

Upper font rendered by freetype2, lower one by Notepad.

这个问题可能是什么原因?

1 个答案:

答案 0 :(得分:2)

我不是Freetype专家(根本没有),但是如果你用放大镜看你的示例位图,你会发现Notpad渲染周围有浅蓝色和粉红色的阴影。你的渲染是消除锯齿的,但都是灰色的。

所以我假设记事本在LCD模式下渲染,每个像素really renders three subpixels(对应于阴极射线显示器的RBG射线),然后用相邻像素涂抹它们。

这也意味着垂直提示沿着这些子像素发生,例如,记事本渲染中垂直词干的宽度是四个或五个子像素,而在渲染中是全像素边界,即六个子像素。与记事本相比,这使得渲染看起来更加大胆。 (也许你可以找到效果反转的字体大小:你的渲染看起来比记事本更轻。)

您也可以在LCD模式下进行渲染(FT_RENDER_MODE_LCD)。您将位图渲染为三倍宽,当您将文本位图复制到ARGB位图时,应该取三个相邻像素的平均值。 (这不会给你真正的LCD渲染,而是更轻的灰度渲染。)