最近碰到要处理人物立绘的问题。。由于工作量不算小,而且重复劳动很多,就想用程序来解决,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()
效果: