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

2024-04-25 04:53:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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

original

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

但结果却令人失望:

sad

它不仅大小不对,而且有轻微的阴影,而记事本渲染清晰,没有像素边界。在

我怎样才能让它像记事本一样呈现?我在pygame中也遇到过这个问题,所以我想我在这里遗漏了一些关于TTF的基本理解。在

更新:我再次尝试了pygame。同样的道理。它确实有一个关闭抗锯齿的选项,但它看起来就像是根据某个阈值将要进行抗锯齿处理的像素去掉。我得到的最接近的近似值是15号。代码是:

^{pr2}$

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

KILL ME http://tinypic.com/images/404.gif

我为什么不能马上给你赏金?在

更新:以下是所有方法的比较:

AIFEOIFEF

PIL 15,然后是记事本11,然后是pygame 15 anti-alias关闭,然后是pygame 15 anti-alias打开。在

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


Tags: 代码imagepilpng像素pygamedraw记事本
3条回答

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

我不知道每个环境如何解释它的“size”参数,但是即使你把它们解释为相同的,渲染也会完全不同。获得与记事本相同像素的方法是启动记事本并抓取屏幕。在

也许如果你能解释一下为什么你想要和记事本一样的渲染效果,我们会为你的问题找到创造性的解决方案。在

我认为记事本的“大小”是pointsize和ImageFont.truetype()的“大小”是像素。在

尺寸不同是因为它们的规格不同。要将点转换为像素,请使用以下公式:pixels = points * 96 / 72,其中96是配置到Windows中的DPI(不是监视器的实际DPI)。在您的例子中,11*96/72=14.6666,四舍五入为15。在

至于让文本像素对像素完全相同,使用提供的工具-Ned is correct是不可能的。如果这是绝对重要的,您将需要使用windowsapi来呈现此文本并将其复制到图像中。不是一个简单的过程。在

相关问题 更多 >