使用Python PIL或cv2批量裁剪文件夹图片分片后保存到新目录问题
代码问题排查与修正方案
原代码核心问题
- 读取文件时只拿到了
BeforeAfter下的文件名,没有拼接完整路径,程序找不到原图片,自然不会执行后续逻辑 - 保存裁剪图时只传了
CroppedImages文件夹路径,没有指定具体文件名,无法正常写入文件 - 没有提前创建
CroppedImages、分片存储的目标文件夹,路径不存在时会写入失败 - PIL的
crop方法要求传入整数像素坐标,浮点数会导致裁剪精度异常 - 注释的分片逻辑没有关联裁剪后的图片路径,无法正常执行分片操作
修正后可运行代码
from PIL import Image import image_slicer import os # 配置参数,后续修改路径/参数直接改这里即可 RAW_IMG_DIR = "BeforeAfter" # 原图片存放文件夹 CROPPED_IMG_DIR = "CroppedImages" # 裁剪后图片存放文件夹 SLICE_TARGET_DIR = "frames" # 分片后切片存放文件夹 SLICE_NUM = 12 # 每张图分片的数量 # 提前创建所有需要的文件夹,不存在就新建,存在也不会报错 os.makedirs(CROPPED_IMG_DIR, exist_ok=True) os.makedirs(SLICE_TARGET_DIR, exist_ok=True) def crop_and_slice(): # 遍历原文件夹下的所有文件 for filename in os.listdir(RAW_IMG_DIR): # 拼接原文件的完整路径 raw_img_path = os.path.join(RAW_IMG_DIR, filename) # 跳过文件夹,只处理文件 if not os.path.isfile(raw_img_path): continue # 读取图片 img = Image.open(raw_img_path) # 裁剪坐标转整数,符合PIL要求 left = 67 top = 37 right = 1212 bottom = 551 # 执行裁剪 im_crop = img.crop((left, top, right, bottom)) # 拼接裁剪后文件的保存路径,保留原文件名存为PNG filename_no_ext = os.path.splitext(filename)[0] cropped_img_path = os.path.join(CROPPED_IMG_DIR, f"{filename_no_ext}.png") # 保存裁剪后的图片 im_crop.save(cropped_img_path, "PNG", quality=100) # 执行分片操作 tiles = image_slicer.slice(cropped_img_path, SLICE_NUM, save=False) # 保存分片结果到目标目录,用原文件名做前缀避免重名覆盖 image_slicer.save_tiles(tiles, directory=SLICE_TARGET_DIR, prefix=filename_no_ext) if __name__ == "__main__": crop_and_slice()
使用注意事项
- 运行前确保已经安装了依赖:
pip install pillow image_slicer - 如果需要调整裁剪坐标、分片数量、各文件夹路径,直接修改代码开头的配置参数即可
内容的提问来源于stack exchange,提问作者user12974359
相关产品推荐
相关产品推荐

