为什么我的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。
我不知道每个环境如何解释其“大小”参数,但是即使您对它们的解释相同,渲染也将完全不同。获得与记事本相同像素的方法是启动记事本并抓住屏幕。
也许,如果您解释了为什么想要与记事本相同的呈现方式,我们将为您的问题提供创造性的解决方案。