ocr识别遇到的小问题-图片的EXIF 元数据

背景

之前在公司通过paddleocr写了个接口,传入图片的base64编码返回识别出的文字信息。但是图片为横向时,文字行会乱序,所以准备新加一个功能通过paddleclas推理图片文字的倾斜角度,并将图片旋转为正向。在测试过程中发现windows打开一个正向图片,调用ocr接口时无法识别,返回一堆奇怪的文字。

排查过程

首先我需要识别的图片在windows中打开是这样的,宽为4096,长为3072

识别出的结果为

(图片内容为示例图片,实际是纯文字图片,返回的内容都是奇怪的文字)

之后尝试了其他正向图片都可以正常识别,于是在PyCharm中打算通过python打开图片,然后使用本地的paddleocr尝试一下。使用如下代码:

复制代码
with open("C:\\Users\\xxxxx\\test.jpg", "rb") as image_file:
     file_content = base64.b64encode(image_file.read()).decode("utf8")

发现预览图片时,图片是旋转的,于是将图片复制到pycharm和idea里,发现全部都是旋转的图片。

并且发现只有jpg格式的出现了这个问题,其他如PNG格式的图片是正常的。

于是搜索了一下jpg和PNG图片的不同之处。发现JPEG 图片通常包含 EXIF 元数据,里面包括了一个 Orientation 标签,它告诉系统应该如何旋转图片来正常显示。

  • Windows 的照片查看器会读取这个 Orientation 标签,并自动旋转图片。

  • 但一些 IDE(如 PyCharm、IDEA)中的图片查看器或第三方库(如 PIL、OpenCV)通常不读取 EXIF 的 Orientation 信息,而是直接以图像的原始像素排列进行显示。

那么问题就很明显了,使用如下代码对图片的EXIF信息进行读取

复制代码
from PIL import Image, ExifTags

def open_image_with_correct_orientation(path):
    image = Image.open(path)

    try:
        for orientation in ExifTags.TAGS.keys():
            if ExifTags.TAGS[orientation] == 'Orientation':
                break

        exif = image._getexif()
        if exif is not None:
            orientation_value = exif.get(orientation)

            if orientation_value == 3:
                image = image.rotate(180, expand=True)
            elif orientation_value == 6:
                image = image.rotate(270, expand=True)
            elif orientation_value == 8:
                image = image.rotate(90, expand=True)
    except Exception as e:
        print(f"读取 EXIF 方向失败: {e}")

    return image

# 示例使用
img = open_image_with_correct_orientation("your_image.jpg")
img.show()

返回结果为

发现Orientation 为3,证明原始图片确实是旋转过的。

解决办法

1、通过上述代码获取图片的元数据的旋转信息,对图片进行旋转

2、通过paddleclas判断文字的倾斜角度,对图片进行旋转,我这边采用的是这种方法,毕竟这次遇到的bug是因为测试为了方便直接对图片进行旋转并保存而出现。线上环境中图片由于每个人拍摄角度不固定,所以很可能上传的原始图片就是倾倒的。

图片的EXIF元数据

常见关键字段:

  • Orientation:图像方向(是否旋转)

  • DateTime:拍摄时间

  • Make / Model:设备品牌 / 型号

  • ExifImageWidth / ExifImageHeight:原始像素尺寸

  • GPSInfo:地理位置信息(如果有)

Orientation 的取值含义:

说明
1 正常
3 旋转 180 度
6 顺时针旋转 90 度
8 逆时针旋转 90 度

常见支持 EXIF 的图片格式

说明
JPEG / JPG ✅ 是主要支持 EXIF 的格式
TIFF ✅ 原始格式之一,支持丰富的元信息
HEIF / HEIC ✅ 新一代图像格式(如 iPhone 拍照),支持 EXIF,但不是所有工具都能读取
WebP ✅ 支持嵌入元数据(EXIF 和 XMP),但不是标准实现的一部分,兼容性差异较大
RAW 格式(如 .CR2, .NEF, .ARW, .DNG 等) ✅ 摄影相机原始文件,通常包含大量 EXIF 和其他元数据
PNG ❌ 不支持 EXIF,但可以写入其他形式的元数据(如 tEXt 或 iTXt)
BMP ❌ 不支持 EXIF
GIF ❌ 不支持 EXIF
SVG ❌ 是 XML 文本格式,不支持 EXIF,但可以有自定义 metadata 区域
相关推荐
咸鱼攻阀术2 个月前
OpenSSL has been compiled without RC2 support
python·日常问题