为什么我的11号字体的TrueType字体与Windows不同?


问题内容

举个例子:打开记事本,选择字体为“ Arial,Size 11”,仔细输入单词“ this is a test”,并截图:

原版的

输入以下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")

然而结果却令人失望地不同:

伤心

它不仅大小不正确,而且阴影也略有阴影,而记事本呈现清晰,没有像素边界。

如何获得像记事本一样的渲染效果?我在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")

和结果(记事本在最上面以进行比较):

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

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

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

艾菲福

PIL 15,然后记事本11,然后pygame 15消除锯齿,然后pygame 15消除锯齿。

PIL 15实际上具有正确的比例,只是抗锯齿。所以:为什么15比11?如何使其与Windows一样?(wtf在pygame做吗?)


问题答案:

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

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

也许,如果您解释了为什么想要与记事本相同的呈现方式,我们将为您的问题提供创造性的解决方案。