Как прочитать данные изображения из URL-адреса в Python?



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



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



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



Image.open(urlopen(url))


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



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


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

1916   8  

8 ответов:

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

import urllib, cStringIO

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

в Python3 модули StringIO и cStringIO исчезли.

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

from PIL import Image
import requests
from io import BytesIO

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

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

from PIL import Image
import requests
from StringIO import StringIO

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

для тех из вас, кто использует подушку, с версии 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)

ссылки:

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

from StringIO import StringIO
import urllib

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

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

выберите изображение в 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()

это работает и на Python 3.6...

from urllib.request import urlopen
from PIL import Image

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

Comments

    Ничего не найдено.