python-长宽不同多张图片生成一列长图

今天朋友让我给他弄个长图,就是无缝衔接,宽度一致。大概是这样:

长图

之前就弄了一次,放到了PS里面,调整画布大小,一个个的放进去调整宽高,今天又来一次,很是麻烦。于是,就百度了一些在线制作网站,逛了逛github,结果,要么是要求宽高一致,要么就是默认按第一张宽度,后面图片宽度不够的白色补足,要么就是超过多少张收费。于是,一气之下就写了一个。

思路:用户选择图片,用户选择保存路径,使用Image读取图片,按照第一张图片调整大小,保存到保存路径(生成了OUT目录,防止读取时有其他图片),然后再从保存路径将这些图片使用paste连接在一起。

代码

from PIL import Image
import os
import sys
import tkinter as tk
from tkinter import filedialog

# 图片格式
IMAGES_FORMAT = [".JPG", ".jpg", ".png", ".PNG", ".JPEG", ".jpeg"]
root = tk.Tk()
root.withdraw()
# 选择图片
print("请选择图片...")
pic_paths = filedialog.askopenfilenames()
# 选择保存路径
print("请选择长图保存路径...")
save_path = filedialog.askdirectory()
save_path = save_path + "/OUT"
root.destroy()
isExists = os.path.exists(save_path)
# 判断结果
if not isExists:
    # 如果不存在则创建目录
    os.makedirs(save_path)
print("调整后图片及长图保存路径:", save_path)
print("获得图片如下:")
flag = 0
width = 0
long_high = 0
for pic in pic_paths:
    for item in IMAGES_FORMAT:
        if os.path.splitext(pic)[1] != item:
            pass
        else:
            print(pic)
            pic_name = pic.split("/")[-1]
            img = Image.open(pic)  # 读取图片
            (x, y) = img.size  # 获得图片大小
            if flag == 0:
                width = x
                flag = 1
            high = int(y * width / x)  # 计算高度
            long_high += high
            out = img.resize((width, high), Image.ANTIALIAS)  # 调整图片大小
            out.save(save_path + "/" + pic_name)  # 保存图片
print("调整后图片保存完成,开始制作长图...")
long_img = Image.new(mode='RGB', size=(width, long_high))
img_paths = [name for name in os.listdir(save_path) for item in IMAGES_FORMAT if
             os.path.splitext(name)[1] == item]
paste_high = 0
for pic in img_paths:
    for item in IMAGES_FORMAT:
        if os.path.splitext(pic)[1] != item:
            pass
        else:
            img = Image.open(save_path + "/" + pic)  # 读取图片
            (x, y) = img.size  # 获得图片大小
            long_img.paste(img, (0, paste_high))  # 图片及位置(左上角坐标)
            paste_high += y
long_img.save(save_path + "/" + "长图.jpg")
print("完成...")
os.system("pause")

结果截图

选择图片
选择保存路径
命令窗口显示制作情况
调整后的图片及长图

随后,使用pyinstall -F xxx.py进行打包,发送给他了。

相对于PS的结果,代码方式形成的长图(作用照片30-40张)虽然达不到9、10兆,但是也能4、5兆左右,在手机端查看还是很清晰。如果你想形成横向的,或者说图片直接有空隙,那么修改长图宽高以及paste函数的图片左上角位置参数即可。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lady_killer9

感谢您的打赏,我会加倍努力!

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

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

打赏作者

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

抵扣说明:

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

余额充值