无法获取使用 Image.open(requests.get()) 抓取的临时图像文件的文件扩展名

这是我在这里问的第一个问题,所以请原谅没有经验:-)


我有以下文件用于保存图像,然后返回文件路径/URL:


import os, requests

import secrets

from PIL import Image

from flask import url_for, current_app


def save_picture(google_url):

    random_hex = secrets.token_hex(8)

    i = Image.open(requests.get(google_url, stream=True).raw)

    f_ext = (i.format).lower()

    picture_fn = random_hex + f_ext

    picture_path = os.path.join(current_app.root_path, 'static/experience_images', picture_fn)


    output_size = (600, 600)

    i.thumbnail(output_size)

    i.show()

    i.save(picture_path)


    return picture_fn

我收到以下错误


raise ValueError("未知文件扩展名:{}".format(ext))


该google_url参数是用于从 Google Places API 获取图像的 api URL。下面当我调用i.show()图像打开时,我知道图像正在通过,并且我可以看到在大多数情况下(尽管不一定全部)它正在返回 PNG 或 JPEG 文件。我认为问题在于我实际上并没有从中获取任何文件名i,我假设这是因为它是一个临时文件。


任何帮助将不胜感激,我对 Python 有点陌生。


慕盖茨4494581
浏览 353回答 3
3回答

隔江千里

这是一个猜测,因为我没有 Google Places 帐户,但是:通常,HTTP 响应将声明它们包含在内容类型标头中的数据类型。标头的值可能如下所示"image/jpeg"或这个"image/jpeg; charset=UTF-8"标准库中的mimetypes模块包含从该标头值派生扩展的工具。所以你可以做这样的事情:import mimetypesimport requestsdef save_picture(google_url):    response = requests.get(google_url, stream=True)    content_type = response.headers['content-type']    # 'image/jpeg; charset=UTF-8'    mimetype, _, _ = content_type.partition(';')       # 'image/jpeg'    f_ext = mimetypes.guess_extension(mimetype)        # '.jpg'    random_hex = secrets.token_hex(8)    i = Image.open(response.raw)    picture_fn = random_hex + f_ext    picture_path = os.path.join(current_app.root_path, 'static/experience_images', picture_fn)    output_size = (600, 600)    i.thumbnail(output_size)    i.show()    i.save(picture_path)    return picture_fn

当年话下

根据 PIL文档,格式字符串在某些情况下可能为 None。(如果您发布一个完整的示例,我可以在笔记本中运行并使用它会很有帮助,如果我使用随机图像 URL,它基本上可以工作。)提供默认格式 (.jpg?) f_ext = (i.format).lower() 如果 i.format 在这些情况下不是 None else '.jpg' 可能就足够了,但在这里猜测一下......

暮色呼如

好的,所以我想出了一个解决方案。如果其他人有更好的解决方案,我会全力以赴。基本上,问题似乎是当我使用i.format它获取文件扩展名类型时不包含“。” 在“.PNG”中。所以文件名类似于“filenamepng”而不是“filename.png”。所以现在在获得文件扩展名之后f_ext = i.format我创建文件名picture_fn = random_hex + '.' + f_ext现在一切似乎都正常了 :-) 感谢 DrD,我在整理一个示例代码片段供您试用时发现了这一点。现在完成的代码如下:import os, requestsimport secretsfrom PIL import Imagefrom flask import url_for, current_appdef save_picture(google_url):    random_hex = secrets.token_hex(8)    i = Image.open(requests.get(google_url, stream=True).raw)    f_ext = (i.format).lower()    picture_fn = random_hex + '.' + f_ext    picture_path = os.path.join(current_app.root_path, 'static/experience_images', picture_fn)    output_size = (600, 600)    i.thumbnail(output_size)    i.save(picture_path)    return picture_fn
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python