为什么我的 11 号 truetype 字体呈现的效果与 Windows 不同?

Cla*_*diu 6 python fonts truetype font-size font-face

即:打开记事本,字体选择为“Arial,11号”,仔细输入“这只是一个测试”字样,截图如下:

原来的

输入并运行以下 Python 代码:

import ImageFont, ImageDraw, Image
im = Image.open("c:/textimg.png") #the above image

pilfont = ImageFont.truetype("arial.ttf", 11)

compimg = Image.new("RGB", im.size, (255, 255, 255))
draw = ImageDraw.Draw(compimg)

draw.text((0,0), "this is just a test", (0,0,0), font=pilfont)

compimg.save("c:/compimg.png")
Run Code Online (Sandbox Code Playgroud)

然而结果却大相径庭:

伤心

它不仅尺寸错误,而且还有轻微的阴影,而记事本渲染清晰且没有像素边界。

我怎样才能让它像记事本一样呈现?我在 pygame 上也遇到了这个确切的问题,所以我想我在这里缺少对 TTF 的一些基本了解。

更新:我再次尝试使用 pygame。它做同样的事情。它确实有一个关闭抗锯齿的选项,但看起来它只是根据某个阈值去掉了它会抗锯齿的任何像素。我得到的最接近的近似值是使用大小 15。代码是:

pygfont = pygame.font.Font(r"c:\windows\fonts\arial.ttf", 15)
surf = pygfont.render("this is just a test", False, (0,0,0), (255,255,255))
pygame.image.save(surf, r"c:\pygameimg.png")
Run Code Online (Sandbox Code Playgroud)

和结果(记事本原件放在上面进行比较):

杀了我 http://tinypic.com/images/404.gif

Gah 为什么我不能立即提供赏金?

更新:这里比较了所有方法:

艾菲奥菲夫

PIL 15,然后是记事本 11,然后是 pygame 15 anti-alias-off,然后是 pygame 15 anti-alias-on。

PIL 15 实际上具有正确的比例,它只是抗锯齿。所以:为什么是 15 对 11?如何让它像windows一样做?(和wtf是pygame在做什么?)

Ned*_*der 5

字体渲染是一个复杂而微妙的过程,并且已经实现了多次。在您的情况下,PIL 和 Windows 看起来不同,因为它们使用完全不同的字体渲染引擎。Windows 使用其内置渲染,而 PIL 使用的是编译时使用的 Freetype。

我不知道每个环境如何解释其“大小”参数,但即使您对它们的解释相同,渲染也会有所不同。获得与记事本相同像素的方法是启动记事本并抓取屏幕。

或许如果您更多地解释为什么您想要与记事本相同的渲染,我们将为您的问题提供创造性的解决方案。