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
相关产品推荐
相关产品推荐

