让PIL生成的字带有描边效果

来源:互联网 发布:java redis lua 编辑:程序博客网 时间:2024/05/02 02:19

Python里最著名的图像处理库当然是PIL(Python Image Library)。相对于ImageMagick,PIL更加简洁,并且拥有还算良好的文档。这是一篇介绍如何在PIL中对字体描边的文章,源于我一次真实的需求解决过程。

我们知道,在PIL中,我们只要使用ImageDraw的text方法就可以在一个Image对象上的指定位置写下字。现在我希望写出的字带有描边效果,仔细研究ImageDraw的文档后,我发现text方法有一个名为“outline”的参数。从字面上来看,“outline”就是边线的意思,但是当我将其加入到text方法的实参中,Python告诉我text方法没有outline这个参数。具体原因我也不清楚,不过看来此路是不通了。

于是继续去请教谷歌大神,功夫不负有心人,在Python的Mail List上,有人问出了同样的问题,并且得到了大神的解答,我按照大神给出的代码照葫芦画瓢,写了一个可以画出描边字的函数“mytext”,相关代码如下:

def mytext(self, pos, text, font, fill, border='black', bp=1):        x, y = pos        shadowcolor = border        self.draw.text((x-bp, y), text, font=font, fill=shadowcolor)        self.draw.text((x+bp, y), text, font=font, fill=shadowcolor)        self.draw.text((x, y-bp), text, font=font, fill=shadowcolor)        self.draw.text((x, y+bp), text, font=font, fill=shadowcolor)        # thicker border        self.draw.text((x-bp, y-bp), text, font=font, fill=shadowcolor)        self.draw.text((x+bp, y-bp), text, font=font, fill=shadowcolor)        self.draw.text((x-bp, y+bp), text, font=font, fill=shadowcolor)        self.draw.text((x+bp, y+bp), text, font=font, fill=shadowcolor)        # now draw the text over it        self.draw.text((x, y), text, font=font, fill=fill)

请注意mytext是一个类方法,使用前确保self.dwaw是一个可用的ImageDraw实例。

相关参数中,border指的是描边的颜色,可以使用内置字符串或者RGB元组。bp则是描边的宽度,单位为像素。

以上方法在实际使用中令人满意,唯一的坏处就是由于为了画出边框调用了8次额外的text方法,可能会影响到图片生成效率,请自行斟酌、测试。


http://www.idndx.com/posts/python-pil-draw-text-with-stroke.html