【问题标题】:Rendered font looks bolder than it should be渲染的字体看起来比应有的更粗
【发布时间】:2014-11-27 10:02:35
【问题描述】:

我正在使用 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);
    }
}

结果是我渲染的文本看起来比从记事本渲染时要粗得多:

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

【问题讨论】:

    标签: c fonts freetype text-rendering freetype2


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,我想是这个原因,亚像素渲染页面真的帮了我大忙!
    猜你喜欢
    • 1970-01-01
    • 2012-11-18
    • 2017-12-25
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    相关资源
    最近更新 更多