功能:
- 此脚本通过图片文件名开头的几个字符进行筛选,将开头字符相同的图片分组并合并成长图。
- 比如:当前目录下有“a01.jpg”,“a12.jpg”,“a23.jpg”,“b31.jpg”,“bac.jpg”,“bil.jpg”几张图片, 并且定义开头字符为"1"个,那么“a01.jpg”,“a02.jpg”,“a03.jpg”为一组合并,“b31.jpg”,“bac.jpg”,“bbb.jpg”为一组合并。
- 合并好的图片文件名会加上"-merge"后缀保存。
- 如果没有找到开头字符相同的图片则会自动跳过。
- 只会合并图片文件,对当前目录下的其他文件没有影响。
- 需要安装Pillow库。
食用方法(Windows)
- 将代码复制,保存为.py文件。
- 自行下载安装Python3。记得重启电脑。如果系统高于Win10,双击.py文件会自动跳转到 Windows Store 安装。
- 打开CMD控制台,运行命令
pip install Pillow
安装依赖。 - 将保存好的.py文件复制到图片所在的目录中。
- 将图片分组命名,需要合并为一张长图的图片文件名开头一定要相同。比如:"001a"和"001b"会进行合并,"002a"和"002b"会进行合并。
- 双击运行脚本,首先定义截取文件名相同字符的个数,比如:"001a"和"001b"就填写"3",表示文件名前3位字符相同的图片分别进行合并。填写0表示合并当前目录下的所有图片。
- 然后定义合并完成后图片的宽度,默认为1000px,单位只支持px,高度会自动缩放。
- 成图效果:把图片按纵向拼接,图和图之间有20px留白,成图文件名会加上-merge后缀保存在当前目录下。
- 欢迎高手进行改进。
代码:
#! /usr/bin/python
# coding=utf-8
# Python 3.12.1
import os
import sys
from PIL import Image
print('- 说明【脚本制作:极客阿宅|ixcrap.com】:\n- 此脚本通过图片文件名开头的几个字符进行筛选,将开头字符相同的图片分组并合并成长图。\n- 比如:当前目录下有“a01.jpg”,“a02.jpg”,“a03.jpg”,“b31.jpg”,“bac.jpg”,“bbb.jpg”几张图片, 并且定义开头字符为"1"个,\n- 那么“a01.jpg”,“a02.jpg”,“a03.jpg”为一组合并,“b31.jpg”,“bac.jpg”,“bbb.jpg”为一组合并。\n- 合并好的图片文件名会加上"-merge"后缀保存。\n- 如果没有找到开头字符相同的图片则会自动跳过。\n- 只会合并图片文件,对当前目录下的其他文件没有影响。\n- 需要安装Pillow库,CMD/命令行下运行pip install Pillow\n')
def get_forward_number():
number = input("请定义开头字符的个数(只可以输入阿拉伯整数数字,0表示合并全部图片):")
if number.isdecimal():
return int(number)
else:
input("输入错误,按任意键退出。")
sys.exit()
_n = get_forward_number()
_w = input("请定义生成长图的宽度(单位px,高度自动等比缩放,默认为1000px):")
# 获取当前目录下的图片文件名
def get_file_names():
file_names = []
for file in os.listdir():
if file.lower().endswith(('.jpg','.jpeg','.gif','.png','.bmp','.jfif','.tga','.tif')):
file_names.append(file)
return file_names
# 把图片文件名前_n个字符提取为关键字,再将没有重复的丢弃,仅保留有重复的
def get_similar_keys():
file_names = get_file_names()
base_names = []
key_names =[]
for name in file_names:
name = name[:_n]
base_names.append(name)
for name in set(base_names):
if base_names.count(name) > 1 :
key_names.append(name)
return key_names
# 把重复关键字列表与图片文件名列表进行比对,找出有名称前_n位有重复的图片放入一个新列表
def get_similar_files():
keys = get_similar_keys()
files = get_file_names()
similar_files = []
for key in keys:
for file in files:
if file[:_n] == key:
similar_files.append(file)
return similar_files
# 整理重复图片列表,把相似的文件名再组成一个小列表,这样就得到由多个小列表组成二维数组,方便之后进行分组合并
def format_similar_files():
keys = get_similar_keys()
files = get_similar_files()
formatted_files = []
similar = []
for key in keys:
for file in files:
if file[:_n] == key:
similar.append(file)
elif file[:_n] != key and len(similar) != 0:
formatted_files.append(similar)
similar = []
else:
pass
if len(similar) != 0:
formatted_files.append(similar)
return formatted_files
# 合并图片
def merge_images():
similar_images = format_similar_files()
custom_width = _w
if custom_width.strip():
if custom_width.isdecimal():
custom_width = int(custom_width)
else:
input("生成图片的宽度有误,按任意键退出。")
sys.exit()
else:
custom_width = 1000
for imgs in similar_images:
images = []
whole_height = 0
for img in imgs:
image = Image.open(img)
width = image.width
height = image.height
# 缩放图片尺寸
if width != custom_width:
new_image = image.resize((custom_width, int(height * custom_width / width)))
whole_height += new_image.height
images.append(new_image)
else:
whole_height += height
images.append(image)
merge_image = Image.new('RGB', (custom_width, whole_height + (len(images) - 1) * 20), 'white')
y = 0
for i in images:
merge_image.paste(i, (0, y))
y = y + i.height + 20
merge_image.save(f"{imgs[0][:_n]}-merge.jpg")
print(f"{imgs}已合并。")
print(f"共合并{len(get_similar_keys())}张图片。")
# 是否删除原始图片
def delete_files():
delete = input('是否删除原始图片? 输入"y"并回车确认删除:')
files = get_similar_files()
if delete == "y":
for file in files:
if file.find("merge") == -1 :
os.remove(file)
print(f"{file}已删除。")
else:
pass
merge_images()
delete_files()
input("完成!按任意键退出...")
原文标题:Python脚本:把当前目录下的图片按文件名分组并拼接为长图
原文链接:https://ixcrap.com/python-script-group-the-pictures-in-the-current-directory-by-file-name-and-splice-them-into-a-long-picture.html
本站文章部分素材来源于网络,如有侵权请联系博主删除。文章可随意转载,但请保留原文出处。
尊重他人知识产权和劳动成果是互联网共享精神的基石!
原文链接:https://ixcrap.com/python-script-group-the-pictures-in-the-current-directory-by-file-name-and-splice-them-into-a-long-picture.html
本站文章部分素材来源于网络,如有侵权请联系博主删除。文章可随意转载,但请保留原文出处。
尊重他人知识产权和劳动成果是互联网共享精神的基石!
还没有评论,快来坐沙发吧~