Jak odczytać dane obrazu z adresu URL w Pythonie?

To, co próbuję zrobić, jest dość proste, gdy mamy do czynienia z lokalnym plikiem, ale problem pojawia się, gdy próbuję to zrobić za pomocą ZDALNEGO ADRESU URL.

Zasadniczo próbuję utworzyć obiekt obrazu PIL z pliku pobranego z adresu URL. Oczywiście, zawsze mogę po prostu pobrać adres URL i zapisać go w pliku tymczasowym, a następnie otworzyć go w obiekcie obrazu, ale wydaje się to bardzo nieefektywne.

Oto co mam:

Image.open(urlopen(url))

To się skarży, że {[2] }nie jest dostępny, więc próbowałem to:

Image.open(urlopen(url).read())
Ale to też nie zadziałało. Czy istnieje lepszy sposób, aby to zrobić, czy zapis do pliku tymczasowego jest akceptowanym sposobem robienia tego typu rzeczy?
Author: Daniel Quinn, 2011-09-12

8 answers

Możesz spróbować użyć StringIO

import urllib, cStringIO

file = cStringIO.StringIO(urllib.urlopen(URL).read())
img = Image.open(file)
 164
Author: Fábio Diniz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-12 18:07:32

W Python3 Moduły StringIO i cStringIO zniknęły.

W Python3 powinieneś użyć:

from PIL import Image
import requests
from io import BytesIO

response = requests.get(url)
img = Image.open(BytesIO(response.content))
 146
Author: Andres Kull,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-06 08:30:57

Używam biblioteki requests. Wydaje się być bardziej wytrzymały.

from PIL import Image
import requests
from StringIO import StringIO

response = requests.get(url)
img = Image.open(StringIO(response.content))
 52
Author: Saurav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-23 06:19:24

Dla tych z Was, którzy używają Poduszki, od wersji 2.8.0 można:

from PIL import Image
import urllib2

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

Lub jeśli użyjesz requests:

from PIL import Image
import requests

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

Bibliografia:

 31
Author: Giovanni Cappellotto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-03 04:14:20

Użyj StringIO, aby przekształcić odczytany łańcuch w obiekt podobny do pliku:

from StringIO import StringIO
import urllib

Image.open(StringIO(urllib.urlopen(url).read()))
 27
Author: Dan D.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-02 07:45:17

Dla tych, którzy wykonują jakieś sklearn / numpy post processing (tj. Deep learning), możesz owinąć obiekt pil za pomocą np.array (). To może uchronić Cię przed koniecznością Wygooglowania go tak, jak ja:

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)))
 21
Author: Ben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-17 15:59:44

Wybierz obraz w chrome, kliknij prawym przyciskiem myszy na nim, kliknij na Copy image address, wklej go do zmiennej str (my_url), Aby odczytać obraz:

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

Otwórz;

from PIL import Image

img = Image.open('my_image.png')
img.show()
 2
Author: Hamidreza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-30 20:53:32

To działa również na Pythonie 3.6...

from urllib.request import urlopen
from PIL import Image

img = Image.open(urlopen(url))
img
 1
Author: Miladiouss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-05 05:18:45