讓PIL生成的字帶有描邊效果

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章