1. 程式人生 > >新增水印

新增水印

一 新增文字水印

from PIL import Image, ImageDraw,ImageFont
img = Image.open("D:\\楊冪.jpg").convert('RGBA')
txt=Image.new('RGBA', img.size, (0,0,0,0))
fnt=ImageFont.truetype("C:\\Windows\\Fonts\\FZSTK.ttf",40)
d=ImageDraw.Draw(txt)
d.text((txt.size[0]-80,txt.size[1]-30), "楊冪",fill = (255,255,255,255),font = fnt)
out
=Image.alpha_composite(img, txt) out.show()

結果如下圖所示:

關於上述程式有幾點需要說明一下:

(1)txt=Image.new('RGBA', img.size, (0,0,0,0))

有兩種用法,如下所示:

  • Image.new(mode, size) => image
  • Image.new(mode, size, color) => image

以指定的模式和大小建立一個新影象。大小以2元元組的形式給出。給colour賦單個值,表示要建立單波段影象,元組表示建立多波段影象(每個波段一個值)。如果忽略colour引數,影象將以黑色填充。如果colour設為None,影象不會被初始化。

(2)fnt=ImageFont.truetype("C:\\Windows\\Fonts\\FZSTK.ttf",40)

有兩種用法,如下所示:

  • ImageFont.truetype(file,size) ⇒ Font instance(字型物件)
  • ImageFont.truetype(file,size, encoding=value) ⇒ Font instance(字型物件)

其中:

  • file是TrueType或者OpenType字型檔案,如果需要顯示中文,必須指定專門有中文字型檔案,否則只會顯示出方框。
  • size是指字型的大小
  • encoding是指使用指定的編碼方式建立一個字型物件,通常的編碼方式有“unic”(Unicode),“symb”(Microsoft Symbol),“ADOB”(Adobe Standard),“ADBE”(Adobe Expert)和“armn”(Apple Roman)。

(3)d=ImageDraw.Draw(txt)

用法ImageDraw.Draw(img)⇒ Draw instance(繪圖物件)
含義:建立一個可以在給定影象上繪圖的物件。

(4)d.text((txt.size[0]-80,txt.size[1]-30), "楊冪",fill = (255,255,255,255),font = fnt)

ImageDraw.Draw.text():文字的繪製,第一個引數指定繪製的起始點(文字的左上角所在位置),第二個引數指定文字內容,第三個引數指定文字的顏色,第四個引數指定字型(通過ImageFont類來定義)。

除了繪製文字,還可以繪製直線,矩形等,總結如下:

  • ImageDraw.Draw.line():直線的繪製,第一個引數指定的是直線的端點座標,形式為(x0, y0, x1, y1),第二個引數指定直線的顏色;
  • ImageDraw.Draw.rectangle():矩形繪製,第一個引數指定矩形的對角線頂點(左上和右下),形式為(x0, y0, x1, y1),第二個指定填充顏色,第三個引數指定邊界顏色;
  • ImageDraw.Draw.arc():(橢)圓弧的繪製,第一個引數指定弧所在橢圓的外切矩形,第二、三兩個引數分別是弧的起始和終止角度, 第四個引數是填充顏色,第五個引數是線條顏色;
  • ImageDraw.Draw.chord():弦的繪製,和弧類似,只是將弧的起始和終止點通過直線連線起來;
  • ImageDraw.Draw.pieslice():圓餅圖的繪製,和弧與弦類似,只是分別將起始和終止點與所在(橢)圓中心相連;
  • ImageDraw.Draw.ellipse():橢圓的繪製,第一個引數指定橢圓的外切矩形, 第二、三兩個引數分別指定填充顏色和線條顏色,當外切矩形是正方形時,橢圓即為圓;
  • ImageDraw.Draw.polygon():繪製多邊形,第一個引數為多邊形的端點,形式為(x0, y0, x1, y1, x2, y2,……),第二、三兩個引數分別指定填充顏色和線條顏色;

(5)out=Image.alpha_composite(img, txt)

上述是將兩個影象進行融合的操作,類似的還有:

  • Image.blend(im1,im2,alpha)
  • Image.composite(im1,im2,mask)

以上3個函式都是將兩個影象進行融合,需要注意的是,被融合的兩個影象的mode和size都要相同。這裡說明一下,alpha是透明度,mask是一個為“1”,“L”或“RGBA”,size和im1,im2相同的圖片。

 二 新增小圖片水印

from PIL import Image
img = Image.open("D:\\楊冪.jpg")
mark=Image.open("D:\\太陽花.jpg")
layer=Image.new('RGBA', img.size, (0,0,0,0))
layer.paste(mark, (img.size[0]-160,img.size[1]-225))
out=Image.composite(layer,img,layer)
out.show()

結果如下圖所示:

有一處需要說明:

  • layer.paste(mark, (img.size[0]-160,img.size[1]-225))

layer.paste函式的引數為(圖片,(貼上的起始點的橫座標,貼上的起始點的縱座標))

含義:將引數中的圖片貼上到layer上邊。