
Python实现图片EXIF信息读取与自动旋转1. 引言你有没有遇到过这样的情况用手机拍的照片传到电脑上查看时发现方向不对需要手动旋转才能正常观看这其实是因为相机在拍摄时会记录拍摄方向信息但有些软件无法正确识别这些信息。今天我们就来学习如何用Python解决这个问题。通过读取图片的EXIF信息中的方向标签我们可以自动将图片旋转到正确的方向无需手动操作。整个过程只需要几行代码特别适合需要批量处理图片的场景。我们会使用Python的PIL库Pillow来实现这个功能这个库是处理图像的利器安装简单使用方便。即使你是Python新手也能轻松跟着教程完成。2. 环境准备与安装在开始之前我们需要安装必要的库。打开你的命令行工具输入以下命令pip install PillowPillow是Python Imaging LibraryPIL的一个分支提供了强大的图像处理能力。安装完成后我们就可以开始编写代码了。验证安装是否成功可以运行一个简单的测试from PIL import Image print(Pillow库安装成功)如果没有报错说明环境已经准备就绪。3. EXIF基础概念EXIFExchangeable Image File Format是嵌入在图片文件中的元数据信息包含了拍摄时的各种参数比如拍摄时间、相机型号、光圈大小、快门速度以及我们今天要用到的方向信息。方向信息Orientation存储在EXIF的274标签或者0x0112标签中它的值表示图片应该以什么方向显示1正常方向不需要旋转3旋转180度6顺时针旋转90度8逆时针旋转90度其他值虽然也存在但比较少见。我们的任务就是读取这个值然后根据它来旋转图片。4. 读取EXIF信息让我们先写一个函数来读取图片的EXIF信息from PIL import Image, ExifTags def get_exif_orientation(image_path): try: with Image.open(image_path) as img: exif_data img._getexif() if exif_data: for tag, value in exif_data.items(): if tag in ExifTags.TAGS: if ExifTags.TAGS[tag] Orientation: return value except (AttributeError, KeyError, IndexError): # 图片可能没有EXIF数据 pass return 1 # 默认返回正常方向这个函数会尝试读取图片的EXIF数据如果找到方向标签就返回对应的值如果找不到或者出错就返回1正常方向。5. 实现自动旋转知道了方向信息后我们就可以根据不同的值来旋转图片了def auto_rotate_image(image_path, output_pathNone): if output_path is None: output_path image_path # 默认覆盖原图 orientation get_exif_orientation(image_path) with Image.open(image_path) as img: if orientation 3: # 旋转180度 rotated_img img.rotate(180, expandTrue) elif orientation 6: # 顺时针旋转90度 rotated_img img.rotate(270, expandTrue) elif orientation 8: # 逆时针旋转90度 rotated_img img.rotate(90, expandTrue) else: # 方向正确不需要旋转 rotated_img img # 保存旋转后的图片 rotated_img.save(output_path) # 移除EXIF中的方向标签避免重复旋转 rotated_img.save(output_path, exifrotated_img.info.get(exif, b))这里有几个需要注意的地方expandTrue参数确保旋转后图片不会被裁剪旋转后最好移除EXIF中的方向标签避免其他软件再次旋转我们保存图片时保留了其他的EXIF信息6. 完整示例代码下面是一个完整的示例展示了如何批量处理一个文件夹中的所有图片import os from PIL import Image, ExifTags def batch_rotate_images(folder_path): 批量旋转文件夹中的所有图片 supported_formats [.jpg, .jpeg, .tiff, .png] for filename in os.listdir(folder_path): if any(filename.lower().endswith(fmt) for fmt in supported_formats): image_path os.path.join(folder_path, filename) print(f处理图片: {filename}) auto_rotate_image(image_path) # 使用示例 if __name__ __main__: folder_path 你的图片文件夹路径 batch_rotate_images(folder_path) print(所有图片处理完成)7. 实际应用技巧在实际使用中你可能会遇到一些特殊情况这里分享几个实用技巧处理大量图片时可以添加进度显示from tqdm import tqdm def batch_rotate_with_progress(folder_path): image_files [f for f in os.listdir(folder_path) if f.lower().endswith((.jpg, .jpeg, .tiff, .png))] for filename in tqdm(image_files, desc处理图片): image_path os.path.join(folder_path, filename) auto_rotate_image(image_path)处理网络图片时可以先下载再处理import requests from io import BytesIO def rotate_web_image(image_url): response requests.get(image_url) img Image.open(BytesIO(response.content)) # 获取方向信息并旋转 # ...旋转逻辑与之前类似注意事项不是所有图片格式都支持EXIF如PNG的支持就不完整有些图片可能没有EXIF数据旋转操作会重新编码图片可能会轻微影响画质8. 常见问题解决问题1处理某些图片时出现错误有些图片的EXIF数据可能损坏或不规范添加异常处理def safe_auto_rotate(image_path): try: auto_rotate_image(image_path) except Exception as e: print(f处理 {image_path} 时出错: {e}) # 可以选择跳过或者记录日志问题2旋转后图片质量下降使用高质量的旋转参数# 在rotate方法中使用高质量的滤波器 rotated_img img.rotate(90, expandTrue, resampleImage.BICUBIC)问题3处理速度慢对于大量图片可以考虑使用多线程from concurrent.futures import ThreadPoolExecutor import os def parallel_rotate_images(folder_path, max_workers4): image_files [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.lower().endswith((.jpg, .jpeg, .tiff, .png))] with ThreadPoolExecutor(max_workersmax_workers) as executor: list(executor.map(auto_rotate_image, image_files))9. 总结通过这个教程我们学会了如何用Python读取图片的EXIF方向信息并自动旋转图片到正确方向。这个技能在处理大量手机照片时特别有用可以节省大量手动操作的时间。实际使用中你可以把这个功能集成到自己的图片处理工具中或者做成一个简单的桌面应用。代码虽然简单但解决的是实际中的痛点问题。如果你想要进一步扩展功能可以考虑添加GUI界面或者支持更多的图片调整操作。Pillow库还有很多强大的功能等待你去探索。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。