0 背景
因为有需求要拼接多张格式相同的图片【用于餐补】,一开始想到的是使用opencv,毕竟它非常擅长图像处理。后面在网上发现还有更简单的方法,就是使用python。实现的原理就是拼接数组【图片转数组】,然后再转化回图片【因为图片本身在计算机中就是一个由很多0和1的数组】。
1 代码
import numpy as np
from PIL import Image
def joint_Pic(imgFilePathList, fileSavePath, mode = 0) -> None:
'''
:param imgFilePathList:拼接文件路径
:param fileSavePath:文件存储路径
:param mode: 0 纵向;1 横向
:return:无返回结果,直接存储图片
'''
if len(imgFilePathList) < 2 or len(imgFilePathList) == 0 or len(fileSavePath) == 0:
print('图片拼接失败!')
return
resImg = list()
for i in range(len(imgFilePathList)):
if i == len(imgFilePathList) - 1:
resImg = Image.fromarray(resImg)
resImg.save(fileSavePath)
print('拼接图片存储成功!')
return
if i != 0:
resImg = np.concatenate((resImg ,np.array(Image.open(imgFilePathList[i+1]))), axis=mode)
else:
resImg = np.concatenate((np.array(Image.open(imgFilePathList[i])), np.array(Image.open(imgFilePathList[i+1]))), axis = mode)
# 示例
imgFilePathList = list()
imgFilePathList.append('/Users/mac/Desktop/临时/WechatIMG143.png')
imgFilePathList.append('/Users/mac/Desktop/临时/WechatIMG144.png')
imgFilePathList.append('/Users/mac/Desktop/临时/WechatIMG145.png')
imgFilePathList.append('/Users/mac/Desktop/临时/WechatIMG146.png')
imgFilePathList.append('/Users/mac/Desktop/临时/WechatIMG147.png')
fileSavePath = '/Users/mac/Desktop/临时/1.png'
joint_Pic(imgFilePathList, fileSavePath)
2 图片拼接2(可以自动调整图片的拼接尺寸)
from os import listdir
from PIL import Image
# 获取当前文件夹下所以图片
ims = [Image.open('/Users/mac/Downloads/tmpDealImage/%s' % fn) for fn in listdir('/Users/mac/Downloads/tmpDealImage') if fn.endswith('.png')]
print(ims)
ims_size = [list(im.size) for im in ims]
middle_width = sorted(ims_size, key=lambda im: im[0])[int(len(ims_size) / 2)][0] # 中位数宽度
ims = [im for im in ims if im.size[0] > middle_width / 2] # 过滤宽度过小的无效图片
# 过滤后重新计算
ims_size = [list(im.size) for im in ims]
middle_width = sorted(ims_size, key=lambda im: im[0])[int(len(ims_size) / 2)][0] # 中位数宽度
ims = [im for im in ims if im.size[0] > middle_width / 2] # 过滤宽度过小的无效图片
# 计算相对长图目标宽度尺寸
for i in range(len(ims_size)):
rate = middle_width / ims_size[i][0]
ims_size[i][0] = middle_width
ims_size[i][1] = int(rate * ims_size[i][1])
sum_height = sum([im[1] for im in ims_size])
# 创建空白长图
result = Image.new(ims[0].mode, (middle_width, sum_height))
# 拼接
top = 0
for i, im in enumerate(ims):
mew_im = im.resize(ims_size[i], Image.LANCZOS) # 等比缩放
result.paste(mew_im, box=(0, top))
top += ims_size[i][1]
# 保存
result.save('/Users/mac/Downloads/tmpDealImage/result.png')