如何从 Python 中的 URL 读取图像数据?

     2023-02-18     74

关键词:

【中文标题】如何从 Python 中的 URL 读取图像数据?【英文标题】:How do I read image data from a URL in Python? 【发布时间】:2011-11-15 13:22:07 【问题描述】:

当我们处理本地文件时,我尝试做的事情相当简单,但是当我尝试使用远程 URL 执行此操作时,问题就出现了。

基本上,我正在尝试从从 URL 中提取的文件创建 PIL 图像对象。当然,我总是可以只获取 URL 并将其存储在一个临时文件中,然后将其打开到一个图像对象中,但这感觉非常低效。

这是我所拥有的:

Image.open(urlopen(url))

它抱怨seek() 不可用,所以我尝试了这个:

Image.open(urlopen(url).read())

但这也没有用。有没有更好的方法来做到这一点,或者写入临时文件是接受这种事情的方式?

【问题讨论】:

另见:How to save an image locally using Python whose URL address I already know? 一定是请求无法从url获取图片的问题。从另一个网址尝试相同(仅用于测试目的)。 【参考方案1】:

在 Python3 中,StringIO 和 cStringIO 模块消失了。

在 Python3 中你应该使用:

from PIL import Image
import requests
from io import BytesIO

response = requests.get(url)
img = Image.open(BytesIO(response.content))

【讨论】:

如何从 response.content 中取回图片? requests 包在从 URL 获取图像时抛出 503 状态代码。相反,我不得不求助于http.client 来获取图像。 当我尝试这个时,我得到:AttributeError: module 'requests' has no attribute 'get'。 自 PIL >= 2.8.0 以来不再需要手动包装 BytesIO。只需使用Image.open(response.raw)。 PIL 现在会自动检查它并在引擎盖下进行 BytesIO 包装。来自:pillow.readthedocs.io/en/3.0.x/releasenotes/2.8.0.html @ViníciusM 你的答案应该在顶部!谢谢【参考方案2】:

使用StringIO

import urllib, cStringIO

file = cStringIO.StringIO(urllib.urlopen(URL).read())
img = Image.open(file)

【讨论】:

谢谢,只是想补充一点,同样的代码也适用于 urllib2(使用 Python2) 在 python 3 中它将来自 urllib.request 导入 urlopen 和 io.io.BytesIO 而不是 StringIO HELP, IOError: cannot identify image file <_io.bytesio object at> my url is: ...model=product.template&id=16&field=image_medium【参考方案3】:

以下适用于 Python 3:

from PIL import Image
import requests

im = Image.open(requests.get(url, stream=True).raw)

参考资料:

https://github.com/python-pillow/Pillow/pull/1151 https://github.com/python-pillow/Pillow/blob/master/CHANGES.rst#280-2015-04-01

【讨论】:

urllib2 我认为是用于 Python2 的,它已经过时了。对于 Python 3,它是 urllib.requests:urllib.request.urlopen(url).read() 正如@wordsforthewise 提到的,urllib 已过时。我使用了第二个选项,因为我在我的代码中使用了“请求”并且它有效,所以赞成。解决方案的 urllib 部分是否应该被删除,这样读者就不会花时间尝试第一种方法,只是为了意识到它不起作用,然后转到下一种?【参考方案4】:

使用requests:

from PIL import Image
import requests
from StringIO import StringIO

response = requests.get(url)
img = Image.open(StringIO(response.content))

【讨论】:

由于某些原因 urllib 不适用于某些 URL,但请求在失败的地方有效 我找不到 PIL 包,但看起来枕头已经接管了 PIL 工作,您可以使用 pip3.4 install pillow 为 python3 安装。 请注意,requests 会将整个响应加载到内存中,然后 PIL 会再次将整个响应加载为图像,因此您有两个完整的副本驻留在内存中。上一个使用 urllib 方法流式传输数据的答案,因此您最终只会得到一个副本加上流式传输缓冲区大小。您也可以使用请求流式传输数据,但由于响应不支持 read() 语义,您必须构建一个适配器。 @sirdodger 你指的是 urllib2 还是 urllib? @CMCDragonkai 我指的是接受的 urllib 答案。如果内存开销是一个问题,它比使用这个请求答案更好。 (但是,就像我提到的,使用请求的不同解决方案可以达到相同的效果。)【参考方案5】:

Python 3

from urllib.request import urlopen
from PIL import Image

img = Image.open(urlopen(url))
img

Jupyter Notebook 和 IPython

import IPython
url = 'https://newevolutiondesigns.com/images/freebies/colorful-background-14.jpg'
IPython.display.Image(url, width = 250)

与其他方法不同,此方法也适用于 for 循环!

【讨论】:

【参考方案6】:

使用StringIO将读取的字符串转成文件类对象:

from StringIO import StringIO
import urllib

Image.open(StringIO(urllib.requests.urlopen(url).read()))

【讨论】:

【参考方案7】:

对于那些进行 sklearn/numpy 后处理(即深度学习)的人,您可以使用 np.array() 包装 PIL 对象。这可能会让您不必像我一样使用 Google 搜索:

from PIL import Image
import requests
import numpy as np
from StringIO import StringIO

response = requests.get(url)
img = np.array(Image.open(StringIO(response.content)))

【讨论】:

【参考方案8】:

目前可以说推荐的图像输入/输出方法是使用专用包ImageIO。只需一行简单的代码,就可以直接从 URL 读取图像数据:

from imageio import imread
image = imread('https://cdn.sstatic.net/Sites/***/img/logo.png')

此页面上的许多答案早于该软件包的发布,因此不提。 ImageIO 最初是 Scikit-Image 工具包的组件。除了流行的图像处理库PILlow 提供的格式之外,它还支持许多科学格式。它将所有内容封装在一个只专注于图像输入/输出的干净 API 中。事实上,SciPy removed 有自己的图像读取器/写入器 in favor of ImageIO。

【讨论】:

非常慢。如果你想在一行中做 skimage 方法会是更好的选择 skimage (Scikit-Image) 方法,正如答案所解释的那样。它和你的互联网连接一样慢。【参考方案9】:

选择chrome中的图片,右键点击Copy image address,粘贴到str变量中(my_url)读取图片:

import shutil
import requests

my_url = 'https://www.washingtonian.com/wp-content/uploads/2017/06/6-30-17-goat-yoga-congressional-cemetery-1-994x559.jpg'
response = requests.get(my_url, stream=True)
with open('my_image.png', 'wb') as file:
    shutil.copyfileobj(response.raw, file)
del response

打开它;

from PIL import Image

img = Image.open('my_image.png')
img.show()

【讨论】:

【参考方案10】:

由于 PIL >= 2.8.0,不再需要手动包装 BytesIO。只需使用 Image.open(response.raw)

在 Vinícius 的评论之上添加:

您应该传递stream=True,如https://requests.readthedocs.io/en/master/user/quickstart/#raw-response-content所述

所以

img = Image.open(requests.get(url, stream=True).raw)

【讨论】:

【参考方案11】:

不使用 PIL 直接将图像作为 numpy 数组获取

import requests, io
import matplotlib.pyplot as plt 

response = requests.get(url).content
img = plt.imread(io.BytesIO(response), format='JPG')
plt.imshow(img)

【讨论】:

【参考方案12】:

使用 urllib.request.urlretrieve() 和 PIL.Image.open() 下载和读取图像数据:

导入请求

导入 urllib.request

import PIL
urllib.request.urlretrieve("https://i.imgur.com/ExdKOOz.png", "sample.png")
img = PIL.Image.open("sample.png")
img.show()

或调用 requests.get(url) ,将 url 作为目标文件的地址,通过 GET 请求下载。以 obj 作为响应内容调用 io.BytesIO(obj) 以将原始数据加载为字节对象。要加载图像数据,请调用 PIL.Image.open(bytes_obj) 并将 bytes_obj 作为字节对象:

import io
response = requests.get("https://i.imgur.com/ExdKOOz.png")
image_bytes = io.BytesIO(response.content)
img = PIL.Image.open(image_bytes)
img.show()

【讨论】:

【参考方案13】:
from PIL import Image
import cv2
import numpy as np
import requests
image=Image.open(requests.get("https://previews.123rf.com/images/darrenwhi/darrenwhi1310/darrenwhi131000024/24022179-photo-of-many-cars-with-one-a-different-color.jpg", stream=True).raw)
#image =resize((420,250))

image_array=np.array(image)
image 

【讨论】:

Python - 从 urllib 获取图像,然后从 PIL 图像读取 EXIF 数据不起作用

】Python-从urllib获取图像,然后从PIL图像读取EXIF数据不起作用【英文标题】:Python-fetchingimagefromurllibandthenreadingEXIFdatafromPILImagenotworking【发布时间】:2013-10-2415:49:49【问题描述】:我使用以下代码从python中的url获取图像:importurlli... 查看详情

如何从python 3中的url读取html

】如何从python3中的url读取html【英文标题】:Howtoreadhtmlfromaurlinpython3【发布时间】:2014-07-3122:55:55【问题描述】:我查看了以前的类似问题,但更加困惑。在python3.4中,我想读取一个html页面作为字符串,给定url。在perl中,我使... 查看详情

Python:如何从内存中的 zip 文件中读取图像?

】Python:如何从内存中的zip文件中读取图像?【英文标题】:Python:Howtoreadimagesfromzipfileinmemory?【发布时间】:2015-08-0222:15:55【问题描述】:我看到了这个问题的变体,但不是在这个确切的上下文中。我拥有的是一个名为100-Test.zip... 查看详情

如何从 Javascript 中的图像文件数据中读取地理位置

】如何从Javascript中的图像文件数据中读取地理位置【英文标题】:HowtoreadgeolocationfromanimagefiledatainJavascript【发布时间】:2016-08-1113:40:42【问题描述】:如何在将文件加载到Web浏览器时但在实际上传之前(在客户端)从Javascript中... 查看详情

如何保存从python中的图像转换的数组? [复制]

】如何保存从python中的图像转换的数组?[复制]【英文标题】:HowdoIsaveanarrayconvertedfromimageinpython?[duplicate]【发布时间】:2018-08-1813:50:23【问题描述】:任务是读取图像并提取数据以获得25x25像素的网格。我用这段代码来提取它,... 查看详情

python从python3中的10位dpx文件中读取元数据和图像数据(代码片段)

查看详情

java示例代码_从Java中的URL读取图像

java示例代码_从Java中的URL读取图像 查看详情

如何从 blob:url 获取原始图像数据?

】如何从blob:url获取原始图像数据?【英文标题】:howdoigetrawimagedatafromablob:url?【发布时间】:2021-09-0623:07:09【问题描述】:我想将存储在blob:url中的图像保存到服务器,但我不知道如何从blobURL中提取原始数据。现场演示:https://... 查看详情

如何从 url 中删除端口以使 xampp 数据库中的图像源正常工作?

】如何从url中删除端口以使xampp数据库中的图像源正常工作?【英文标题】:Howcaniremoveportfromurltomakesourceforimagesfromxamppdatabasetoworkproperly?【发布时间】:2021-06-1302:26:50【问题描述】:我是angular新手,我对angular和xampp有疑问。我正... 查看详情

从 Java 中的 COM7 端口读取图像数据

...,获取图像数据,处理它并显示在屏幕上。我想知道的是如何在我的Java程序中 查看详情

camera2 如何从图像读取器侦听器中的 YUV_420_888 图像中获取 Exif 数据

】camera2如何从图像读取器侦听器中的YUV_420_888图像中获取Exif数据【英文标题】:camera2HowtogetExifdatafromYUV_420_888imageinimagereaderlistener【发布时间】:2019-11-1616:08:14【问题描述】:我正在尝试从YUV_420_888图像中获取Exif数据,但它不起... 查看详情

从 ios 中的 Url 获取多个图像

...个图像。我想在多个UIImageViews中显示所有图像。请建议我如何循环显示所有图像。json数组数据链接:这是我的应用程序中的代码NSString*urlString=[NSStringstringW 查看详情

如何从 python 中的嵌套 YAML 文件中读取数据?

】如何从python中的嵌套YAML文件中读取数据?【英文标题】:HowtoreaddatafromnestedYAMLfileinpython?【发布时间】:2020-07-0513:56:24【问题描述】:我有例如swagger.yaml文件,我想从中读取一些变量。例如那个文件:https://editor.swagger.io/下面... 查看详情

如何从 python 中的 cursor.execute() 中读取所有数据?

】如何从python中的cursor.execute()中读取所有数据?【英文标题】:Howtoreadalldatafromcursor.execute()inpython?【发布时间】:2018-11-0819:12:04【问题描述】:我使用PyMysql连接到我的MySQL数据库。cursor.execute(query)data=cursor.fetchall()for(id,clientid,tim... 查看详情

从 plist 字符串中读取 url 图像

...含图像的url地址。我正在尝试使用我放在我的保管箱帐户中的图像填充我的表格视图并通过plist字符串读取它们。(“arrayFromPlist”是我的数组)问题是,当我运行它时,控制 查看详情

如何从recyclerview中的url下载图像?

】如何从recyclerview中的url下载图像?【英文标题】:Howtodownloadaimagefromurlinrecylerview?【发布时间】:2021-07-0213:08:32【问题描述】:我制作了一个meme应用程序,它从API获取图像url,我正在解析它们并使用Glide在recyler视图中显示,在... 查看详情

如何从当前在控制台中的 python 读取一行?

】如何从当前在控制台中的python读取一行?【英文标题】:Howtoreadalinefrompythoncurrentlyinconsole?【发布时间】:2016-08-0814:20:53【问题描述】:我想使用一行代码来读取我在控制台中输入的内容,以便与python中的asyncio模块一起使用。... 查看详情

如何从 UITableViewCell 中的 URL 为 UIImageView 设置图像?

】如何从UITableViewCell中的URL为UIImageView设置图像?【英文标题】:HowtosetanimageforaUIImageViewfromaURLinsideaUITableViewCell?【发布时间】:2017-10-0513:16:33【问题描述】:我在cellForRowAt方法中有以下代码来获取图像并加载到单元格的图像视图... 查看详情