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

Pillow结合pillow-heif将HEIC转WebP报TypeError问题求助

HEIC转WebP触发TypeError问题解决方案

问题现象

使用Pillow搭配pillow-heif库开展图片格式转换操作(Pillow原生不支持HEIC格式解析)时存在异常:HEIC格式图片转换为其他任意格式均可正常执行,唯独转换为WebP格式时无法正常输出.webp文件,且抛出TypeError: a bytes-like object is required, not 'NoneType'错误。
补充测试验证:WebP格式转HEIC格式可正常完成,仅HEIC转WebP方向触发上述错误。

最小可复现代码

from PIL import Image
from pillow_heif import register_heif_opener

register_heif_opener()
image = Image.open("test.HEIC")
image.save("test2.webp", format="webp", lossless=True, exif=None)

错误堆栈

Traceback (most recent call last):
  File "D:\Programming\image-uploader\test.py", line 6, in <module>
    image.save("test2.webp", format="webp", lossless=True, exif=None)
  File "C:\Users\Mint\AppData\Local\pypoetry\Cache\virtualenvs\image-uploader-Qxb7pR67-py3.10\lib\site-packages\PIL\Image.py", line 2300, in save
    save_handler(self, fp, filename)
  File "C:\Users\Mint\AppData\Local\pypoetry\Cache\virtualenvs\image-uploader-Qxb7pR67-py3.10\lib\site-packages\PIL\WebPImagePlugin.py", line 329, in _save
    data = _webp.WebPEncode(
TypeError: a bytes-like object is required, not 'NoneType'

问题原因

Pillow的WebP格式编码器对exif参数有严格的类型要求,仅接受bytes类型的EXIF数据输入,未对None值做兼容处理。代码中显式传入exif=None时,该值会被直接传递到底层WebPEncode接口,触发类型错误。其他格式的保存编码器默认对exif=None做了空值兼容,因此转其他格式不会报错,该问题与HEIC格式解析逻辑无关。

解决方法

二选一即可:

  • 移除save方法中的exif=None参数。不需要写入EXIF信息时无需显式传该参数,Pillow会自动处理无EXIF的写入逻辑,修改后代码如下:
from PIL import Image
from pillow_heif import register_heif_opener

register_heif_opener()
image = Image.open("test.HEIC")
image.save("test2.webp", format="webp", lossless=True)
  • 如果需要显式声明不写入EXIF,将exif=None替换为exif=b""传入,符合WebP编码器的参数类型要求:
image.save("test2.webp", format="webp", lossless=True, exif=b"")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:45:37