Python图像库 – 文本渲染

我试图使用PIL来渲染一些文本,但是结果是坦率地说,废话。

例如,下面是我在Photoshop中编写的一些文本:

PhotoShop的

和什么来自PIL:

PIL

正如你所看到的,PIL的结果不尽如人意。 也许我只是挑剔,但是有什么方法可以使用PIL来绘制文本,从而获得更接近我的参考图像的结果?

以下是我在Python 2.7和PIL 1.1.7上使用的代码

image = Image.new("RGBA", (288,432), (255,255,255)) usr_font = ImageFont.truetype("resources/HelveticaNeueLight.ttf", 25) d_usr = ImageDraw.Draw(image) d_usr = d_usr.text((105,280), "Travis L.",(0,0,0), font=usr_font) 

我想出了我自己的解决scheme,我觉得可以接受。

我所做的就是将文本渲染得很大,比如它需要的大小的3倍,然后用抗锯齿resize,这不是100%完美的,但是它比默认的好很多,不需要开罗或者攀高。

例如,

 image = Image.new("RGBA", (600,150), (255,255,255)) draw = ImageDraw.Draw(image) font = ImageFont.truetype("resources/HelveticaNeueLight.ttf", fontsize) draw.text((10, 0), txt, (0,0,0), font=font) img_resized = image.resize((188,45), Image.ANTIALIAS) 

而你最终以这个结果,

最后结果

这比我以前用相同字体得到的要好很多。

尝试使用pycairo – 开罗绘图库的python绑定 – 对于更精细的绘图,带有反锯齿的线条等是有用的 – 您也可以生成基于vector的图像

正确处理字体和布局是很复杂的,还需要使用“潘戈”和“潘古洛”库。 虽然他们是为了认真的字体工作(所有的GTK +小部件都使用pango进行字体渲染),但是可用的文档和示例却极其糟糕。

示例波纹pipe显示系统中可用的打印件,并将样本文本呈现为通过命令行作为parameter passing的字体系列。

 # -*- coding: utf-8 -*- import cairo import pango import pangocairo import sys surf = cairo.ImageSurface(cairo.FORMAT_ARGB32, 320, 120) context = cairo.Context(surf) #draw a background rectangle: context.rectangle(0,0,320,120) context.set_source_rgb(1, 1, 1) context.fill() #get font families: font_map = pangocairo.cairo_font_map_get_default() families = font_map.list_families() # to see family names: print [f.get_name() for f in font_map.list_families()] #context.set_antialias(cairo.ANTIALIAS_SUBPIXEL) # Positions drawing origin so that the text desired top-let corner is at 0,0 context.translate(50,25) pangocairo_context = pangocairo.CairoContext(context) pangocairo_context.set_antialias(cairo.ANTIALIAS_SUBPIXEL) layout = pangocairo_context.create_layout() fontname = sys.argv[1] if len(sys.argv) >= 2 else "Sans" font = pango.FontDescription(fontname + " 25") layout.set_font_description(font) layout.set_text(u"Travis L.") context.set_source_rgb(0, 0, 0) pangocairo_context.update_layout(layout) pangocairo_context.show_layout(layout) with open("cairo_text.png", "wb") as image_file: surf.write_to_png(image_file) 

百张图片

我从来没有使用过PIL,但是对Draw方法的文档的快速回顾表明PIL提供了一种呈现简单graphics的方式。 Photoshop提供了一种呈现复杂graphics的方法。 为了获得接近于Photoshop的结果,至less需要字体提示和反锯齿。 PIL的文档甚至没有暗示有这样的能力。 您可能想要使用外部工具,可能会更好地在图像上呈现文本。 例如,ImageMagick(您将要使用处理标准24位RGB的8位版本)。 你可以在这里find一些文字样本: http : //www.imagemagick.org/Usage/draw/

你也可以尝试写字体两次,它增加了质量巨大。

 image = Image.new("RGBA", (288,432), (255,255,255)) usr_font = ImageFont.truetype("resources/HelveticaNeueLight.ttf", 25) d_usr = ImageDraw.Draw(image) d_usr = d_usr.text((105,280), "Travis L.",(0,0,0), font=usr_font) d_usr = d_usr.text((105,280), "Travis L.",(0,0,0), font=usr_font) 
Interesting Posts