如何用Python批量合并多文件夹中的同名图片?
解决多文件夹同名图片合并问题
核心思路
- 先梳理每个文件名对应的目标文件夹列表(可自动收集或手动指定规则)
- 读取对应文件夹下的同名图片文件
- 用图像处理工具完成合并,最后保存结果
具体实现步骤
首先安装依赖的图像处理库:
pip install pillow
方案1:自动匹配所有包含同名文件的文件夹
适合规则不固定,只要是多文件夹存在的同名图就合并的场景:
import os from PIL import Image # 替换成你的实际文件夹路径 folders = { "folder1": "./folder1", "folder2": "./folder2", "folder3": "./folder3", "folder4": "./folder4" } # 创建结果保存目录 output_dir = "./merged_result" os.makedirs(output_dir, exist_ok=True) # 收集每个图片文件对应的文件夹路径 file_folder_map = {} for folder_name, folder_path in folders.items(): for filename in os.listdir(folder_path): if filename.endswith(".png"): if filename not in file_folder_map: file_folder_map[filename] = [] file_folder_map[filename].append(folder_path) # 处理合并逻辑 for filename, paths in file_folder_map.items(): # 跳过仅单个文件夹存在的图片 if len(paths) < 2: continue # 读取所有目标图片 images = [] for path in paths: img_path = os.path.join(path, filename) img = Image.open(img_path).convert("RGBA") images.append(img) # 横向拼接合并(可改为纵向,只需调整尺寸计算) total_width = sum(img.width for img in images) max_height = max(img.height for img in images) merged_img = Image.new("RGBA", (total_width, max_height)) current_x = 0 for img in images: merged_img.paste(img, (current_x, 0)) current_x += img.width # 保存合并后的图片 output_path = os.path.join(output_dir, f"{os.path.splitext(filename)[0]}_merged.png") merged_img.save(output_path, "PNG") print(f"完成合并:{filename} -> {output_path}")
方案2:按指定规则手动匹配文件夹
适合有固定合并规则的场景,比如你示例中的a_1只合并folder1、2、3:
import os from PIL import Image folders = { "folder1": "./folder1", "folder2": "./folder2", "folder3": "./folder3", "folder4": "./folder4" } output_dir = "./merged_result" os.makedirs(output_dir, exist_ok=True) # 手动定义每个图片的合并文件夹规则 custom_merge_rules = { "a_1.png": ["folder1", "folder2", "folder3"], "a_2.png": ["folder1", "folder4"], "a_3.png": ["folder1", "folder2"], "a_5.png": ["folder2", "folder4"], "a_6.png": ["folder3", "folder4"] } # 转换为实际文件路径 for filename, folder_names in custom_merge_rules.items(): img_paths = [os.path.join(folders[name], filename) for name in folder_names] # 读取图片 images = [Image.open(path).convert("RGBA") for path in img_paths] # 横向拼接(可按需修改合并方式) total_width = sum(img.width for img in images) max_height = max(img.height for img in images) merged_img = Image.new("RGBA", (total_width, max_height)) current_x = 0 for img in images: merged_img.paste(img, (current_x, 0)) current_x += img.width output_path = os.path.join(output_dir, f"{os.path.splitext(filename)[0]}_merged.png") merged_img.save(output_path, "PNG") print(f"完成合并:{filename} -> {output_path}")
自定义调整提示
- 合并方式:如果需要纵向拼接,把总宽度改为最大宽度,总高度改为所有图片高度之和,粘贴时修改y轴坐标即可
- 尺寸统一:如果图片尺寸差异大,可以在读取后添加
img = img.resize((600, 600))(替换成你需要的尺寸)来统一大小 - 格式兼容:如果有JPG等其他格式,修改
endswith(".png")为endswith((".png", ".jpg", ".jpeg"))
内容的提问来源于stack exchange,提问作者chi linh
相关产品推荐
相关产品推荐

