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

2021-06-06 21:36:46 字數 1441 閱讀 1601

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方法,可能會影響到生成效率,請自行斟酌、測試。

描邊 深度 webgl實現物體描邊效果的方法介紹

前言終於把手頭的事結束了,可以有時間來研究研究技術 作為一名3d開發人員,僅僅使用現有的引擎來開發專案不免有些浮於表面,多研究研究底層的實現更利於對3d開發整體的把控 於是我決定最近開始研究webgl一些特效的實現,希望能在秋招前對底層有更深入的理解。這種方法不用進行法線與視線之間的計算,而是將物體...

小隨筆 寫乙個基於幾何生成方法的描邊效果

本文要實現的內容是乙個很常見的描邊效果。本文的模型來自 rts mini legion lich 實現的思路來自 real time rendering 的相關章節,即基於幾何生成方法的描邊。相關的理論內容已經有不少文章都提到過,這裡簡單概況一下就是在繪製模型時用兩個pass,第一遍正常繪製模型 第...

小隨筆 寫乙個基於幾何生成方法的描邊效果

本文要實現的內容是乙個很常見的描邊效果。本文的模型來自 rts mini legion lich 實現的思路來自 real time rendering 的相關章節,即基於幾何生成方法的描邊。相關的理論內容已經有不少文章都提到過,這裡簡單概況一下就是在繪製模型時用兩個pass,第一遍正常繪製模型 第...