我用 120 行 Python 做了个「1 寸照片批量转换」小工具

公司有个项目需要批量上传证件照,很多照片不符合规范。都要反复裁剪、改尺寸、调分辨率。所以干脆写了个小工具:把一堆原始照片丢进 images/,点一下程序,几秒钟后在 photos/ 里就能拿到统一规格的 1 寸照。

这个工具做的事很简单,但“够用”:固定 295×413 像素(300 DPI 下 2.5cm × 3.5cm),自动等比缩放并居中裁剪,最后统一导出为高质量 JPG。

项目地址: Gitee - batch-resize-photos


你能用它做什么

  • 批量处理:把图片放进 images/,一键全部产出到 photos/
  • 规格统一:输出 295×413 像素,300 DPI,JPG,质量 95。
  • 自动格式处理:PNG 自动转成 JPG(非 RGB 会先转 RGB)。
  • 主体不变形:先按比例缩放,再居中裁剪,不拉伸不压缩。

快速开始

  • 直接运行(无需安装 Python)

    1. 1寸照片批量转换工具.exeimages/ 放在同一目录。
    2. 把原始照片放入 images/
    3. 双击运行 .exe,等待完成。
    4. photos/ 里拿结果(自动创建)。
  • 用源码运行(适合开发者)

    1. 安装依赖:pip install pillow
    2. 在项目根目录运行:python main.py
    3. 同样把原图放 images/,结果在 photos/

建议目录:

  • images/:输入目录(自建)
  • photos/:输出目录(自动创建)
  • 1寸照片批量转换工具.exemain.py

它具体是怎么处理图片的

  • 目标尺寸与 DPI:
1
2
# 1寸照片尺寸(像素,300dpi)
target_size = (295, 413) # 2.5cm × 3.5cm at 300dpi
  • 等比缩放(保证不变形):
1
2
3
4
5
6
7
8
9
10
11
12
13
img_ratio = img.width / img.height
target_ratio = target_size[0] / target_size[1]

if img_ratio > target_ratio:
# 图片较宽,以高度为准
new_height = target_size[1]
new_width = int(new_height * img_ratio)
else:
# 图片较高,以宽度为准
new_width = target_size[0]
new_height = int(new_width / img_ratio)

img = img.resize((new_width, new_height), Image.LANCZOS)
  • 居中裁剪到 295×413:
1
2
3
4
5
left = (new_width - target_size[0]) // 2
top = (new_height - target_size[1]) // 2
right = left + target_size[0]
bottom = top + target_size[1]
img = img.crop((left, top, right, bottom))
  • 导出为 JPG(质量 95):
1
2
3
4
5
output_filename = (
filename.replace('.png', '.jpg') if filename.lower().endswith('.png') else filename
)
output_path = os.path.join(output_folder, output_filename)
img.save(output_path, quality=95)

一些“小细节”,但很重要

  • RGB 转换:为避免某些模式(如 PNG、P 模式)写出 JPG 时出错,统一转为 RGB
  • 透明 PNG:直接转 RGB 后导出 JPG,会把透明区域合成黑色;可考虑后续加“白底/蓝底/红底填充”。
  • 文件名保留:输出文件沿用原名(PNG 仅改后缀为 JPG)。
  • 交互体验:控制台会显示进度和统计信息,处理完等待回车再退出。

打包成一个 .exe(PyInstaller)

为了方便非开发者使用,我把脚本打成了 Windows 可执行文件,核心配置在 build_config.spec(PyInstaller 配置)里:

1
2
3
4
a = Analysis(['main.py'],
hiddenimports=['PIL', 'PIL.Image', 'PIL.ImageOps'])
exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas,
[], name='1寸照片批量转换工具', console=True, upx=True)

自己打包只需:

1
2
pip install pillow pyinstaller
pyinstaller build_config.spec

产物会在 dist/ 下生成 1寸照片批量转换工具.exe


我踩过的一些坑

  • 像素 vs. 厘米 vs. DPI:系统常写“1 寸”“300 DPI”,程序里以像素为准(295×413)最稳。DPI 更多是元数据,像素决定清晰度。
  • 拉伸变形:强行拉到固定尺寸会变形,必须“等比缩放 + 裁剪”。
  • 居中裁剪的边界:极个别构图(人物靠边)可能被裁切,可先人工预裁,或后续加“人脸检测对齐”。
  • 权限/杀软拦截.exe 首次运行可能被拦,右键“以管理员身份运行”通常能解决。

接下来我想做的改进

  • 自定义规格(小一寸/二寸、常见证件照尺寸库)
  • 透明 PNG 的白底/蓝底/红底合成
  • EXIF 方向矫正(竖拍横显)
  • 简易可视化界面(拖拽文件夹即可处理)
  • 多线程并发处理(大批量更快)

结语

这个小工具的目标不是“全能”,而是“稳、快、够用”。如果你也经常需要批量生成统一规格的证件照,希望它能替你省下几次繁琐的点击。如果你有更实用的功能想法,欢迎一起把它打磨得更好用。

— 用最简单的方式,把小事做到足够好。