python实现PS类似的图层叠加操作--使用具有透明通道的PNG图片

示例图片请忽略广告内容,侵权找我,我删除
原图图层1(浏览器观看具有透明通道的png图片为白色)
在这里插入图片描述
原图图层2(浏览器观看具有透明通道的png图片为白色)
在这里插入图片描述
结果图片
在这里插入图片描述

完整代码如下,请看代码注释

def CompositePng(png1, png2, out):
    """
    将两张PNG图片进行叠加,核心运用的函数是Image.composite
    png1:前景
    png2:背景
    """
    im1 = Image.open(png1)
    r, g, b, a = im1.split()  # 提取透明通道
    w1, h1 = im1.size
    im2 = Image.open(png2)
    w2, h2 = im2.size
    # todo 这个if-else结构的操作其实就是将前景和背景图片的图片尺寸做个修改,以防尺寸不一样带来的错误
    if w2 >= h2:
        radio = h2 / h1
        w3 = int(w2 / radio)
        h3 = int(h2 / radio)
        im2 = im2.resize((w3, h3))  # PNG图片大小的缩放
        left = int((w3 - w1) / 2)
        im2 = im2.crop(((left), (0), (left + w1), (h1)))  # PNG图片大小的裁剪
    else:
        radio = w2 / w1
        w3 = int(w2 / radio)
        h3 = int(h2 / radio)
        im2 = im2.resize((w3, h3))
        upper = int((h3 - h1) / 2)
        im2 = im2.crop(((0), (upper), (w1), (upper + h1)))
    im = Image.composite(im1, im2, a)  # 使用image.paste(im1, (100, 100), mask)函数可以指定合成的位置
    im = im.convert('RGB')
    im.save(out, format='JPEG', quality=50)

说明一点的是,Image.composite这个函数的本质是这个函数img.paste
这里,我解释一下img.paste的用法,请看注释

from PIL import Image

infile1 = '/home/huangjx/图片/前景.png'
infile2 = '/home/huangjx/图片/背景.png'
outfile = '/home/huangjx/图片/合成.png'

im1 = Image.open(infile1)  # 读取前景图片
r, g, b, mask = im1.split()  # 提取图片中包含的透明通道

im2 = Image.open(infile2)  # 读取背景图片
image = im2.copy()  # 复制背景图片,这样子原图不会被修改
image.paste(im1, (100, 100), mask)  # 指定前景图片粘贴到背景图片上的位置(100, 100)
image.save(outfile)  # 保存输出图片

主要运用的工具包是Pillow,安装命令为:pip install Pillow -i https://mirrors.aliyun.com/pypi/simple
最后补充一点关于这个工具包的小知识,希望能帮到大家,注意看注释

# todo 需要事先安装Pillow,pip install Pillow -i https://mirrors.aliyun.com/pypi/simple
from PIL import Image

# todo 使用open类打开图片,返回一个图片对象
img = Image.open('/home/huangjx/Pictures/wife.jpg')

# todo 查看图片格式属性
print(img.format)

# todo 查看图片尺寸属性
print(img.size)

# todo 查看图片模型属性
print(img.mode)

# todo 将图片对象保存为图片
img.save('/home/huangjx/Pictures/wife.png')

# todo 自定义构建一张纯色图片
new_img = Image.new('RGB', (128, 128), (255, 0, 0))  # 第一个参数表示图片模式,第二个参数表示图片尺寸,最后一个表示颜色
new_img.save('/home/huangjx/Pictures/new_wife.png')

# todo 不影响原图的情况下拷贝图片
img_copy = img.copy()  # 改变img_copy对象不会影响原来图片对象img

# todo 不影响原图的情况下返回一个矩形区域的拷贝
img_crop = img.crop((10, 20, 100, 200))  # 表示取出一个宽为90,高为180,起点坐标是(10, 20)的拷贝
img_crop.save('/home/huangjx/Pictures/img_crop.png')

# todo 重点重点重点PNG操作函数。将一张图片粘贴到另一张图片上,可用于透明通道图片的叠加,效果跟ps的图层元素叠加一样
img.paste(new_img, (100, 100))  # 将图片new_img粘贴到图片img上,起始点左上角位置为(100, 100),如果不指定位置,默认为(0, 0)
img.paste(new_img, (10, 10, 138, 138))  # 将图片new_img粘贴到图片img上,粘贴的位置固定为(10, 10, 138, 138)

# todo 复合类使用给定的两张图像及mask图像作为透明度,插值出一张新的图像
# 参考链接:https://blog.csdn.net/zhangziju/article/details/79123275
# img.composite()进去之后可以发现本质就是paste函数

如果你看过我其它博客,相信你也能体会到,其实对于图片的批量化操作合成现在都是很容易实现的,恰恰合适的是,现在市场很多人都不知道有这些操作,所以做着很多的重复性事件。举个最简单的流程,将证件照换底色。
实现思路:将证件照人像提取出来,将其它背景图片和人像进行合成即可。
别看这种小操作,其实很有用。4张人像和10张背景,就能构建40张图片了,这种在深度学习增强方面作用是很大的。YOLO3数据集的收集不就是这种方法。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值