Python脚本:把当前目录下的图片按文件名分组并拼接为长图

发布于 2023年12月 标签: 本文被浏览871次
没有了 没有了

功能:

  • 此脚本通过图片文件名开头的几个字符进行筛选,将开头字符相同的图片分组并合并成长图。
  • 比如:当前目录下有“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)

  1. 将代码复制,保存为.py文件。
  2. 自行下载安装Python3。记得重启电脑。如果系统高于Win10,双击.py文件会自动跳转到 Windows Store 安装。
  3. 打开CMD控制台,运行命令pip install Pillow安装依赖。
  4. 将保存好的.py文件复制到图片所在的目录中。
  5. 将图片分组命名,需要合并为一张长图的图片文件名开头一定要相同。比如:"001a"和"001b"会进行合并,"002a"和"002b"会进行合并。
  6. 双击运行脚本,首先定义截取文件名相同字符的个数,比如:"001a"和"001b"就填写"3",表示文件名前3位字符相同的图片分别进行合并。填写0表示合并当前目录下的所有图片。
  7. 然后定义合并完成后图片的宽度,默认为1000px,单位只支持px,高度会自动缩放。
  8. 成图效果:把图片按纵向拼接,图和图之间有20px留白,成图文件名会加上-merge后缀保存在当前目录下。
  9. 欢迎高手进行改进。

代码:

#! /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
本站文章部分素材来源于网络,如有侵权请联系博主删除。文章可随意转载,但请保留原文出处。
尊重他人知识产权和劳动成果是互联网共享精神的基石!


发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

* 疑问 吐舌 沮丧 魔鬼 惊讶 微笑 害羞 可爱 汗 可怕 晕 酷 大笑 生气 眯眼 萌萌哒 勾引 色 亲 骄傲 哭 坏笑

还没有评论,快来坐沙发吧~