You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Pillow获取从URL打开的图片临时文件路径?

获取PIL从字节流打开的图片show()时的临时文件路径

问题核心:通过requests拉取图片字节流,用PIL打开后调用image.show()会生成临时文件,但image.filename为空,需要获取这个临时文件的路径。

原因

image.filename仅在从本地文件路径打开图片时才会被赋值,而你是从字节流(response_api.raw)打开的,所以该属性为空。show()方法是内部创建临时文件并调用系统查看器,这个路径不会自动关联到原Image对象。

解决方案

方案1:手动创建临时文件(推荐,可控性强)

自己生成临时文件并保存图片,直接拿到路径,再调用系统查看器打开:

import requests
from PIL import Image
import tempfile
import os

# 拉取图片字节流
response_api = requests.get(URL_GET_MUSIC_COVER.format(music_id, diff_name), stream=True)
image = Image.open(response_api.raw)

# 创建带后缀的临时文件(delete=False避免文件被立即删除)
with tempfile.NamedTemporaryFile(suffix=".PNG", delete=False) as temp_file:
    temp_image_path = temp_file.name
    # 保存图片到临时文件
    image.save(temp_image_path, format="PNG")

# 调用系统默认查看器打开图片(Windows专用)
os.startfile(temp_image_path)
# 跨平台可改用webbrowser:
# import webbrowser
# webbrowser.open(f"file://{temp_image_path}")

# 程序结束后记得清理临时文件(需确保查看器已关闭)
# os.unlink(temp_image_path)

方案2:复用Pillow的ImageShow内部逻辑

直接调用Pillow用于show的内部模块,获取它生成的临时文件路径:

import requests
from PIL import Image
from PIL import ImageShow

response_api = requests.get(URL_GET_MUSIC_COVER.format(music_id, diff_name), stream=True)
image = Image.open(response_api.raw)

# 获取对应图片格式的查看器
viewer = ImageShow.get_viewer(image)
# 让查看器生成临时文件并返回路径
temp_image_path = viewer.save_image(image)
# 打开图片
viewer.show_image(temp_image_path)

# 现在可以直接使用temp_image_path
print(temp_image_path)

注意事项

  • Windows下如果临时文件被查看器占用,无法立即删除,需等查看器关闭后再执行删除操作。
  • 跨平台场景下,推荐使用方案1,对临时文件的生命周期控制更灵活。

内容的提问来源于stack exchange,提问作者XeloOw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 14:57:42