亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法獲取使用 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 關注
  • 284 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號