因EXIF元数据致PIL图片旋转异常,排查FileNotFoundError并求解决方案
图片自动旋转问题解决指南
先说说你代码里的错误
你写的Image.open('.JPG')是在找一个**文件名就是.JPG**的文件,这显然不是你要处理的目标图片,自然会报FileNotFoundError。而且直接固定旋转90度也不对——不同图片的旋转角度可能是90、180甚至270度,得根据图片自带的EXIF信息来精准处理才行。
为什么Dropbox会让图片“变歪”?
本地看图软件(比如Windows自带的图片查看器)会读取图片EXIF元数据里的Orientation(方向)标记,自动帮你旋转显示,所以你看着是正常的。但Dropbox在处理图片时,没正确识别这个标记,直接按图片原始的像素方向显示,就出现了旋转的情况。
所以我们要做的核心是:
- 读取图片的EXIF方向信息
- 根据信息把图片真正旋转(不是只改标记,是修改像素)
- 重置EXIF的方向标记,避免后续再出问题
正确的Python实现代码
下面是能遍历指定文件夹所有JPG图片,自动修正旋转的完整代码:
from PIL import Image from PIL.ExifTags import TAGS import os def get_exif_orientation(image): """获取图片的EXIF方向标记""" exif = image._getexif() if not exif: return 1 # 默认无旋转 for tag, value in exif.items(): if TAGS.get(tag) == 'Orientation': return value return 1 def fix_image_rotation(image_path): """根据EXIF信息修正图片并保存""" try: with Image.open(image_path) as img: orientation = get_exif_orientation(img) # 按EXIF标记对应的角度旋转/翻转图片 if orientation == 2: img = img.transpose(Image.FLIP_LEFT_RIGHT) elif orientation == 3: img = img.rotate(180) elif orientation == 4: img = img.rotate(180).transpose(Image.FLIP_LEFT_RIGHT) elif orientation == 5: img = img.rotate(-90).transpose(Image.FLIP_LEFT_RIGHT) elif orientation == 6: img = img.rotate(-90) # 等同于顺时针旋转270度 elif orientation == 7: img = img.rotate(90).transpose(Image.FLIP_LEFT_RIGHT) elif orientation == 8: img = img.rotate(90) # 重置EXIF方向标记为默认值,防止后续再出现旋转问题 exif_data = img.info.get('exif', b'') # 保存时保留原EXIF(除了方向标记),保证图片质量 img.save(image_path, 'JPEG', exif=exif_data, quality=95) print(f"已修正: {image_path}") except Exception as e: print(f"处理{image_path}出错: {str(e)}") def process_all_images_in_folder(folder_path): """遍历文件夹里所有JPG/JPEG图片""" for filename in os.listdir(folder_path): if filename.lower().endswith(('.jpg', '.jpeg')): full_path = os.path.join(folder_path, filename) if os.path.isfile(full_path): fix_image_rotation(full_path) # 替换成你的图片文件夹路径! if __name__ == "__main__": target_folder = r"C:\Users\Dell 2\Desktop\你的图片文件夹" process_all_images_in_folder(target_folder)
使用步骤
- 先安装Pillow库:打开命令提示符,输入
pip install pillow回车 - 把代码里的
target_folder改成你要处理的图片文件夹的实际路径 - 运行代码,它会自动处理文件夹里所有JPG图片,修正旋转后覆盖原文件(如果想保留原图,可以在保存时给文件名加后缀,比如
filename.replace('.jpg', '_fixed.jpg'))
小提示
- 没有EXIF信息的图片会被跳过,不会被修改
- 处理后的图片上传Dropbox时,因为像素已经真正旋转,EXIF方向标记也重置了,所以显示会和本地一致
内容的提问来源于stack exchange,提问作者rwilliams
相关产品推荐
相关产品推荐

