Как мне прочитать данные изображения с URL в Python? - PullRequest
143 голосов
/ 12 сентября 2011

То, что я пытаюсь сделать, довольно просто, когда мы имеем дело с локальным файлом, но проблема возникает, когда я пытаюсь сделать это с помощью удаленного URL.

По сути, я пытаюсьсоздать объект изображения PIL из файла, извлеченного из URL.Конечно, я всегда мог просто извлечь URL и сохранить его во временном файле, а затем открыть его в объекте изображения, но это кажется очень неэффективным.

Вот что у меня есть:

Image.open(urlopen(url))

Выглядит жаловаться, что seek() недоступно, поэтому я попробовал это:

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

Но это тоже не сработало.Есть ли лучший способ сделать это, или запись во временный файл принятого способа сделать это?

Ответы [ 9 ]

214 голосов
/ 06 мая 2014

В Python3 модули StringIO и cStringIO пропали.

В Python3 вы должны использовать:

from PIL import Image
import requests
from io import BytesIO

response = requests.get(url)
img = Image.open(BytesIO(response.content))
167 голосов
/ 12 сентября 2011

вы можете попробовать использовать StringIO

import urllib, cStringIO

file = cStringIO.StringIO(urllib.urlopen(URL).read())
img = Image.open(file)
55 голосов
/ 23 октября 2012

Я использую библиотеку запросов.Кажется, он более устойчивый.

from PIL import Image
import requests
from StringIO import StringIO

response = requests.get(url)
img = Image.open(StringIO(response.content))
36 голосов
/ 03 декабря 2016

Для тех из вас, кто использует Подушку, начиная с версии 2.8.0 вы можете:

from PIL import Image
import urllib2

im = Image.open(urllib2.urlopen(url))

или если вы используете requests:

from PIL import Image
import requests

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

Ссылки:

27 голосов
/ 12 сентября 2011

Используйте StringIO, чтобы превратить прочитанную строку в файлоподобный объект:

from StringIO import StringIO
import urllib

Image.open(StringIO(urllib.requests.urlopen(url).read()))
21 голосов
/ 17 октября 2015

Для тех, кто выполняет некоторую постскрипцию sklearn / numpy (т.е. глубокое обучение), вы можете обернуть объект PIL с помощью np.array ().Это может избавить вас от необходимости заходить в 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)))
12 голосов
/ 05 сентября 2018

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!

2 голосов
/ 30 мая 2018

выберите изображение в 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()
1 голос
/ 18 июня 2019

Возможно рекомендуемый способ ввода / вывода изображения в эти дни заключается в использовании специального пакета ImageIO .Данные изображения могут быть прочитаны непосредственно с URL-адреса с помощью одной простой строки кода:

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

Многие ответы на этой странице предшествуют выпуску этого пакета и поэтому не упоминают его.ImageIO начинался как компонент Scikit-Image .Он поддерживает ряд научных форматов, помимо предоставляемых популярной библиотекой обработки изображений PILlow .Он оборачивает все это в чистый API, ориентированный исключительно на ввод / вывод изображения.Фактически, SciPy удалил своего собственного устройства чтения / записи изображений в пользу ImageIO .

...