【Python3/PIL】编辑图片的常用方法

最近碰到要处理人物立绘的问题。。由于工作量不算小,而且重复劳动很多,就想用程序来解决,python的PIL模块就包含了很多实用的模块,下面展示一下个人应用的接口。

from PIL import Image

1、将一个图片的透明部分应用到另一个图片

emmm,这个算是有局限性吧,应用范围不广,但是批量修改立绘的时候抠图非常省力,简略带过一下

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、接口使用样例

有了上面的函数就可以干不少事情啦,本人想用程序实现的是,把一套图背景透明化,然后按一定次序修改尺寸裁剪,由于对于每一张图片的处理都是完全一样的,所以就用程序代替PS实现√,下面展示一下接口使用
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()
效果:





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章