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

Python中Pillow、cv2无法读取的jpg二进制图像如何解码?

问题原因

该问题基本都是由jpg文件格式不标准导致:包括文件头/尾附加了多余数据、数据部分截断、其他格式图像强行修改后缀为jpg等。Windows照片查看器的容错性远高于Python的图像处理库,因此可以正常打开。

可行解决方法
  • 方法1:开启Pillow的截断图像加载支持
    部分存在数据截断、尾部冗余数据的jpg文件,Pillow默认会拒绝读取,开启兼容参数即可正常加载:

    from PIL import Image, ImageFile
    # 开启非标准截断图像加载权限
    ImageFile.LOAD_TRUNCATED_IMAGES = True
    img = Image.open("0.jpg")
    # 验证读取结果
    img.show()
    
  • 方法2:二进制流读取后用OpenCV解码
    cv2.imread对异常格式jpg的容错性极低,先读入二进制数据再解码,可以规避路径解析、默认格式校验带来的读取失败问题:

    import cv2
    import numpy as np
    # 读取文件为二进制字节流
    with open("0.jpg", "rb") as f:
        byte_data = f.read()
    # 字节流转numpy数组后解码图像
    np_arr = np.frombuffer(byte_data, np.uint8)
    img = cv2.imdecode(np_arr, cv2.IMREAD_COLOR)
    # 验证读取结果
    print(img.shape)
    
  • 方法3:使用兼容度更高的图像读取库
    若上述方法都无效,可以使用imageio库,它对非标准格式图像的支持范围远大于Pillow和原生OpenCV:
    先安装依赖:pip install imageio
    读取代码:

    import imageio.v3 as iio
    img = iio.imread("0.jpg")
    # 可按需转换为常用格式
    # 转PIL格式:from PIL import Image; pil_img = Image.fromarray(img)
    # 转OpenCV BGR格式:import cv2; cv_img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
    
  • 方法4:手动修复jpg文件头尾
    如果是文件头部被附加了冗余数据,可以先读取二进制文件校验标准标识:正常jpg文件前两个字节为0xFF 0xD8,尾两个字节为0xFF 0xD9,清理掉头尾多余的非标准字节后,即可被常规图像处理库读取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:27:03