最近碰到要處理人物立繪的問題。。由於工作量不算小,而且重複勞動很多,就想用程序來解決,python的PIL模塊就包含了很多實用的模塊,下面展示一下個人應用的接口。
from PIL import Image
1、將一個圖片的透明部分應用到另一個圖片
def getAlpha(filename):
pic = Image.open(filename)
r,g,b,a = pic.split()
return a
def setAlpha(pic, alpha):
pic.putalpha(alpha)
return pic
getAlpha()返回文件的透明(Alpha)通道,setAlpha()將這個通道應用到另一張圖片上,注意setAlpha的圖片必須是RGBA模式(擁有透明通道)
2、等比例放縮圖片
def consResize(pic, num, mode):
w,h = pic.size
if mode=='w':
h = int(num*h/w)
w = num
pic = pic.resize((w,h))
if mode=='h':
w = int(num*w/h)
h = num
pic = pic.resize((w,h))
return pic
參數分別是(圖片對象,尺寸,以高/寬爲標準),應用PIL對象的resize(box)方法完成,其中box是元組(tuple)3、給圖片加邊框(不拉伸而擴大尺寸)
def addEdge(pic,u,d,l,r):
pw,ph = pic.size
ow = pw + l + r
oh = ph + u + d
outpic = Image.new("RGBA",(ow,oh))
outpic.paste(pic,(l,u,pw+l,ph+u),mask=pic.split()[3])
return outpic
基本思路是,弄一張新圖片,然後把原來的圖片複製上去,這裏對透明通道的處理比較特別,用mask傳參的方式傳入透明通道,申請新圖片對象的時候用RGBA模式可以實現邊框透明4、裁剪圖片
def cut(pic,w,h,l=0,u=0):
pic = pic.crop((l,u,l+w,u+h))
return pic
直接用PIL的crop方法可以實現,crop方法的四個參數圍成的矩形就是裁剪範圍,這裏稍微修改了一下參數方便使用(因爲我暫時都是從左上角開始裁剪的,就省略後兩個參數)5、接口使用樣例
a = getAlpha("ori.png")
def sample():
tp = Image.open("1.jpg")
tp = tp.convert("RGBA")
tp = setAlpha(tp,a)
tp = consResize(tp,500,'h')
tp = addEdge(tp,0,0,100,100)
tp = cut(tp,500,200)
tp.save("out.png")
sample()
效果: