即:打开记事本,字体选择为“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")
但结果却令人失望:
它不仅大小不对,而且有轻微的阴影,而记事本渲染清晰,没有像素边界。在
我怎样才能让它像记事本一样呈现?我在pygame中也遇到过这个问题,所以我想我在这里遗漏了一些关于TTF的基本理解。在
更新:我再次尝试了pygame。同样的道理。它确实有一个关闭抗锯齿的选项,但它看起来就像是根据某个阈值将要进行抗锯齿处理的像素去掉。我得到的最接近的近似值是15号。代码是:
^{pr2}$和结果(记事本原件放在上面比较):
KILL ME http://tinypic.com/images/404.gif
我为什么不能马上给你赏金?在
更新:以下是所有方法的比较:
PIL 15,然后是记事本11,然后是pygame 15 anti-alias关闭,然后是pygame 15 anti-alias打开。在
PIL 15实际上有正确的比例,只是抗锯齿。那么:为什么15比11?如何让它像windows一样工作?(wtf正在做pygame吗?)在
字体呈现是一个复杂而微妙的过程,并且已经实现了很多次。在您的例子中,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来呈现此文本并将其复制到图像中。不是一个简单的过程。在
相关问题 更多 >
编程相关推荐