gpt4 book ai didi

python - 使用 PIL 和请求下载图像

转载 作者:行者123 更新时间:2023-12-02 16:52:30 26 4
gpt4 key购买 nike

我正在尝试通过 url 下载原始图像(png 格式),即时转换它(不保存到光盘)并另存为 jpg。

代码如下:

import os
import io
import requests
from PIL import Image
...
r = requests.get(img_url, stream=True)
if r.status_code == 200:
i = Image.open(io.BytesIO(r.content))
i.save(os.path.join(out_dir, 'image.jpg'), quality=85)

它有效,但是当我尝试使用 r.iter_content() 监视下载进度(用于 future 的进度条)时,如下所示:

r = requests.get(img_url, stream=True)
if r.status_code == 200:
for chunk in r.iter_content():
print(len(chunk))
i = Image.open(io.BytesIO(r.content))
i.save(os.path.join(out_dir, 'image.jpg'), quality=85)

我收到此错误:

Traceback (most recent call last):
File "E:/GitHub/geoportal/quicklookScrape/temp.py", line 37, in <module>
i = Image.open(io.BytesIO(r.content))
File "C:\Python35\lib\site-packages\requests\models.py", line 736, in content
'The content for this response was already consumed')
RuntimeError: The content for this response was already consumed

那么是否可以在获取数据后监控下载进度?

最佳答案

当使用r.iter_content()时,您需要在某处缓冲结果。不幸的是,我找不到任何将内容附加到内存中的对象的示例 - 通常,当文件不能或不应该一次完全加载到内存中时,使用 iter_content 。但是,您可以使用 tempfile.SpooledTemporaryFile 对其进行缓冲,如本答案所述:https://stackoverflow.com/a/18550652/4527093 。这将阻止将图像保存到磁盘(除非图像大于指定的 max_size)。然后,您可以从 tempfile 创建Image

import os
import io
import requests
from PIL import Image
import tempfile

buffer = tempfile.SpooledTemporaryFile(max_size=1e9)
r = requests.get(img_url, stream=True)
if r.status_code == 200:
downloaded = 0
filesize = int(r.headers['content-length'])
for chunk in r.iter_content(chunk_size=1024):
downloaded += len(chunk)
buffer.write(chunk)
print(downloaded/filesize)
buffer.seek(0)
i = Image.open(io.BytesIO(buffer.read()))
i.save(os.path.join(out_dir, 'image.jpg'), quality=85)
buffer.close()

编辑为包含chunk_size,这将限制更新为每 1kb 发生一次,而不是每个字节一次。

关于python - 使用 PIL 和请求下载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37751877/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com