为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕盖茨4494581 2022-06-28 15:47:31
这是我在这里问的第一个问题,所以请原谅没有经验:-)我有以下文件用于保存图像,然后返回文件路径/URL: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.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 有点陌生。
查看完整描述

3 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

这是一个猜测,因为我没有 Google Places 帐户,但是:通常,HTTP 响应将声明它们包含在内容类型标头中的数据类型。


标头的值可能如下所示


"image/jpeg"

或这个


"image/jpeg; charset=UTF-8"

标准库中的mimetypes模块包含从该标头值派生扩展的工具。所以你可以做这样的事情:


import mimetypes

import requests


def 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



查看完整回答
反对 回复 2022-06-28
?
当年话下

TA贡献1890条经验 获得超9个赞

根据 PIL文档,格式字符串在某些情况下可能为 None。(如果您发布一个完整的示例,我可以在笔记本中运行并使用它会很有帮助,如果我使用随机图像 URL,它基本上可以工作。)

提供默认格式 (.jpg?) f_ext = (i.format).lower() 如果 i.format 在这些情况下不是 None else '.jpg' 可能就足够了,但在这里猜测一下......


查看完整回答
反对 回复 2022-06-28
?
暮色呼如

TA贡献1853条经验 获得超9个赞

好的,所以我想出了一个解决方案。如果其他人有更好的解决方案,我会全力以赴。


基本上,问题似乎是当我使用i.format它获取文件扩展名类型时不包含“。” 在“.PNG”中。所以文件名类似于“filenamepng”而不是“filename.png”。


所以现在在获得文件扩展名之后


f_ext = i.format

我创建文件名


picture_fn = random_hex + '.' + f_ext

现在一切似乎都正常了 :-) 感谢 DrD,我在整理一个示例代码片段供您试用时发现了这一点。


现在完成的代码如下:


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.save(picture_path)


    return picture_fn


查看完整回答
反对 回复 2022-06-28
  • 3 回答
  • 0 关注
  • 256 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号