如何快速批量裁剪3840x2160图片为9张1280x720图并制作Windows工具
批量高速裁剪4K图片为9张1080P小图方案
工具速度对比
针对数千张3840x2160图片的批量裁剪需求,各工具速度优先级从高到低为:
- ffmpeg:底层C实现,命令行批量处理效率极高,是首选方案
- ImageMagick:优化后的命令行工具,速度略逊于ffmpeg,但优于Python库
- image_slicer/PIL:纯Python单线程实现,加载处理单张图耗时久,数千张图场景下速度最慢
所有方案均支持无损保留原图细节,不会丢失小物体信息。
最快实现:ffmpeg批量裁剪脚本
单张图片裁剪命令
针对单张4K图,直接执行以下ffmpeg命令(需提前安装ffmpeg并加入系统PATH):
ffmpeg -i input.png -filter_complex " split=9[v0][v1][v2][v3][v4][v5][v6][v7][v8]; [v0]crop=1280:720:0:0[out0]; [v1]crop=1280:720:1280:0[out1]; [v2]crop=1280:720:2560:0[out2]; [v3]crop=1280:720:0:720[out3]; [v4]crop=1280:720:1280:720[out4]; [v5]crop=1280:720:2560:720[out5]; [v6]crop=1280:720:0:1440[out6]; [v7]crop=1280:720:1280:1440[out7]; [v8]crop=1280:720:2560:1440[out8] " -map "[out0]" input_01.png -map "[out1]" input_02.png -map "[out2]" input_03.png -map "[out3]" input_04.png -map "[out4]" input_05.png -map "[out5]" input_06.png -map "[out6]" input_07.png -map "[out7]" input_08.png -map "[out8]" input_09.png -q:v 1
参数说明:-q:v 1 表示最高质量输出,完全保留原图细节。
批量处理Bat脚本
将以下代码保存为crop_images.bat,支持拖入文件夹或输入路径批量处理:
@echo off setlocal enabledelayedexpansion set "input_dir=%~1" if not defined input_dir ( echo 请拖入图片文件夹或输入文件夹路径: set /p input_dir= ) mkdir "%input_dir%\cropped" 2>nul for %%f in ("%input_dir%\*.png" "%input_dir%\*.jpg" "%input_dir%\*.jpeg") do ( if exist "%%f" ( set "filename=%%~nf" set "extension=%%~xf" ffmpeg -i "%%f" -filter_complex " split=9[v0][v1][v2][v3][v4][v5][v6][v7][v8]; [v0]crop=1280:720:0:0[out0]; [v1]crop=1280:720:1280:0[out1]; [v2]crop=1280:720:2560:0[out2]; [v3]crop=1280:720:0:720[out3]; [v4]crop=1280:720:1280:720[out4]; [v5]crop=1280:720:2560:720[out5]; [v6]crop=1280:720:0:1440[out6]; [v7]crop=1280:720:1280:1440[out7]; [v8]crop=1280:720:2560:1440[out8] " -map "[out0]" "%input_dir%\cropped\!filename!_01!extension!" -map "[out1]" "%input_dir%\cropped\!filename!_02!extension!" -map "[out2]" "%input_dir%\cropped\!filename!_03!extension!" -map "[out3]" "%input_dir%\cropped\!filename!_04!extension!" -map "[out4]" "%input_dir%\cropped\!filename!_05!extension!" -map "[out5]" "%input_dir%\cropped\!filename!_06!extension!" -map "[out6]" "%input_dir%\cropped\!filename!_07!extension!" -map "[out7]" "%input_dir%\cropped\!filename!_08!extension!" -map "[out8]" "%input_dir%\cropped\!filename!_09!extension!" -q:v 1 -hide_banner -loglevel error echo 处理完成:%%f ) ) echo 所有图片处理完毕,结果保存在 "%input_dir%\cropped" pause
转成Windows可执行文件
使用Bat to Exe Converter这类工具,将上述bat脚本转换为exe文件,同时将ffmpeg的ffmpeg.exe放在同一目录下,用户即可无需安装依赖直接运行。
备选方案:ImageMagick批量裁剪
如果偏好ImageMagick,单张图命令更简洁:
magick input.png -crop 1280x720@ +repage +adjoin input_%02d.png
批量处理的Bat脚本只需将ffmpeg命令替换为上述magick命令即可,速度略慢于ffmpeg,但仍远快于Python方案。
Python方案(不推荐批量场景)
如果坚持用Python,image_slicer代码如下,适合少量图片:
import os from image_slicer import slice input_dir = input("请输入图片文件夹路径:") output_dir = os.path.join(input_dir, "cropped") os.makedirs(output_dir, exist_ok=True) for filename in os.listdir(input_dir): ext = filename.lower().split('.')[-1] if ext in ('png', 'jpg', 'jpeg'): img_path = os.path.join(input_dir, filename) tiles = slice(img_path, 9, save=False) base_name = os.path.splitext(filename)[0] for tile in tiles: tile.save(os.path.join(output_dir, f"{base_name}_{tile.number:02d}.{ext}")) print(f"处理完成:{filename}") print("所有图片处理完毕")
用pyinstaller --onefile --windowed script.py可打包为exe,但数千张图场景下速度极慢。
内容的提问来源于stack exchange,提问作者bit_scientist
相关产品推荐
相关产品推荐

