示例图片请忽略广告内容,侵权找我,我删除
原图图层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数据集的收集不就是这种方法。