使用 Pillow 打开 webp 文件

Open webp file with Pillow

在 Anaconda 设置上,我想运行遵循简单的代码:

from PIL import Image
img = Image.open('test.webp')

这适用于我的 Linux 机器,但适用于 Windows:

UserWarning: image file could not be identified because WEBP support not installed
  warnings.warn(message)
---------------------------------------------------------------------------
UnidentifiedImageError                    Traceback (most recent call last)
<ipython-input-3-79ee787a81b3> in <module>
----> 1 img = Image.open('test.webp')

~\miniconda3\lib\site-packages\PIL\Image.py in open(fp, mode, formats)
   3028     for message in accept_warnings:
   3029         warnings.warn(message)
-> 3030     raise UnidentifiedImageError(
   3031         "cannot identify image file %r" % (filename if filename else fp)
   3032     )

UnidentifiedImageError: cannot identify image file 'test.webp'

我确实安装了 libwebp 软件包,libwebp.dll 存在于我的 Anaconda 设置的 Library\bin 目录中。

有什么想法吗?

看来目前还没有解决方案。假设 libwepb 库中的 dwebp 在系统中可用,这对我有用,可以从 WEBP 文件生成 Pillow Image 对象:

import os
import subprocess
from PIL import Image, UnidentifiedImageError
from io import BytesIO

class dwebpException(Exception):
    pass


def dwebp(file: str):
    webp = subprocess.run(
        f"dwebp {file} -quiet -o -", shell=True, capture_output=True
    )
    if webp.returncode != 0:
        raise dwebpException(webp.stderr.decode())
    else:
        return Image.open(BytesIO(webp.stdout))

filename = 'test.webp'

try:
    img = Image.open(filename)
except UnidentifiedImageError:
    if os.path.splitext(filename)[1].lower() == ".webp":
        img = dwebp(filename)
    else:
        raise

问题是 Anaconda 是否真的构建了支持 webp 的 Pillow。在 anaconda 网站上看我无法确定这一点。

但是,conda-forge确实构建了支持 webp 的 Pillow,请参阅 here。所以你可能要考虑使用它。