拼接图片———附赠实现代码

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')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁星蓝雨

如果觉得文章不错,可以请喝咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值