今天朋友让我给他弄个长图,就是无缝衔接,宽度一致。大概是这样:
之前就弄了一次,放到了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函数的图片左上角位置参数即可。