iPhone 拍的竖图上传后,生成的 320px 缩略图横躺着,原图在浏览器里却是正的。同一批 Android 照片正常,只有带 Orientation=6 的那些出错,宽高比从 3:4 变成 4:3。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
from PIL import Image, ImageOps
im = ImageOps.exif_transpose(Image.open(src))
im = im.convert("RGB")
im.thumbnail((320, 320))
im.save(dst, quality=85)
Pillow 打开文件不会自动按 EXIF 旋转,图像矩阵还是传感器方向。代码里又调了一次 exif_transpose,前一步已经把方向标记写进像素,第二次再转就反了。两步都以为自己在纠偏,叠起来刚好转多 90 度。这一点先确认清楚,后面就不用反复试。
「Pillow 缩略图方向」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
具体做法是,在打开图像后立刻调用 ImageOps.exif_transpose 只做一次;转完把 Orientation 标签清掉 避免下游再转一遍;缩略图统一用 ImageOps.fit 按目标比例裁 不要直接 resize;抽十张竖拍原图跑一遍 对比宽高比。
改完照着核一遍,竖拍照片生成的缩略图宽高比回到 3:4,人物不再侧躺,Android 和 iPhone 两种原图输出一致。
