You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

因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)

使用步骤

  1. 先安装Pillow库:打开命令提示符,输入pip install pillow回车
  2. 把代码里的target_folder改成你要处理的图片文件夹的实际路径
  3. 运行代码,它会自动处理文件夹里所有JPG图片,修正旋转后覆盖原文件(如果想保留原图,可以在保存时给文件名加后缀,比如filename.replace('.jpg', '_fixed.jpg'))

小提示

  • 没有EXIF信息的图片会被跳过,不会被修改
  • 处理后的图片上传Dropbox时,因为像素已经真正旋转,EXIF方向标记也重置了,所以显示会和本地一致

内容的提问来源于stack exchange,提问作者rwilliams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 00:53:14