會Python的朋友工作效率真的會加倍,還沒學的朋友趕快來學。

今天這篇文章要教大家的是,如何利用一個短短不到40行的程式,幫你的所有圖片檔案加上中文字的浮水印!!也就是說,如果你有一大堆的圖形檔,想要一口氣在圖片上加上版權聲明,不用再跑到影像處理程式去一個步驟一個步驟地用滑鼠操作(滑鼠實在是太傷手腕了),有了這個程式,你只要把想要加浮水印的圖形檔集中在soure_images目錄下,一行指令就可以把該目錄下的圖形檔全部加上中文字的浮水印,並全部幫你存放在指定的資料夾中。加好的圖形檔,看起來像是這個樣子(文字自動以半透明的方式加在圖片的正中央):

wm_1404783464-1908856026

和之前的幾篇文章所介紹的程式一樣,這個程式需要使用到PIL(Pillow)影像處理模組。另外,因為我們使用的是中文字,所以還需要使用到中文的TrueType字型,你可以選擇到你的作業系統去把字型檔複製出來,或是使用網路上免費的中文字型檔(我使用的是王漢宗博士的自由字型,請直接前往該連結下載,並放在font資料夾之下),當然你還要準備好你要加浮水印的圖形檔。程式如下:

# -*- coding: utf-8 -*-
# Program Name: watermark.py
# Author: skynet
# Date: 2015/10
# 

from PIL import Image, ImageFont, ImageDraw
import glob, os

def add_watermark(text, fontname, fontsize, imagefile, output_dir):
	img0 = Image.new("RGBA", (1,1))
	draw0 = ImageDraw.Draw(img0)
	font = ImageFont.truetype(fontname, fontsize)
	t_width, t_height = draw0.textsize(unicode(text, 'UTF-8'), font=font)
	img = Image.new("RGBA", (t_width, t_height), (255,0,0,0))
	draw = ImageDraw.Draw(img)
	draw.text((0,0),unicode(text, 'UTF-8'), font=font, fill=(255,255,255,128))
	img2 = Image.open(imagefile)
	i_width, i_height = img2.size
	px = (i_width - t_width) / 2
	py = (i_height - t_height) / 2
	img2.paste(img, (px, py), img)
	imagefile = imagefile.split('/')[-1]
	imagefile = "wm_" + imagefile
	print imagefile + " saved..."
	img2.save(output_dir + imagefile)
	del draw0, draw
	del img0, img, img2

# main program goes here
all_image_files = glob.glob('source_images/*.jpg')
output_dir = "wm_images/"
if not os.path.exists(output_dir):
	os.mkdir(output_dir)
for image_file in all_image_files:
	add_watermark("僅供測試,用完即刪", 'font/wt014.ttf', 52, image_file, output_dir)

因為程式不大,所以沒有特別去最佳化程式內容,反正功能正常能執行就好了,只是個小工具而已。

程式主要的原理是先準備好一個字型,然後計算出該字型的大小。有了文字大小之後,再依該尺寸建立一個透明背景的同樣大小的圖片檔案(img),把字畫在img中。接下來開啟目標圖形檔(img2),計算img應該放的位置(參考文字檔的大小和圖片檔的大小),再把文字檔img貼到圖形檔img2中,再存到目錄資料夾下,就算完成了。另外,為了避免檔案搞混,所以存檔前還是改一下檔名比較好。

由上面的程式可以知道,如果你自己要使用的話,在程式的最後一行你可以改變文字內容、字型檔、字型大小以及圖形檔來源和輸出的目錄。

本程式歡迎大家拿去使用,如果有延伸出新的應用,別忘了cite一下本篇文章,感謝。

對了,中文字的操作,最前面那一行coding: utf-8絕對不可以少,不然根本無法執行程式,另外使用到中文字串,也一定要使用unicode函數指定編碼方式,這樣子文字的大小計算才會正確。

(1028)

%d 位部落客按了讚: