Comment lire les données d'image à partir d'une URL en Python?

Ce que j'essaie de faire est assez simple quand nous avons affaire à un fichier local, mais le problème vient quand j'essaie de le faire avec une URL distante.

Fondamentalement, j'essaie de créer un objet image PIL à partir d'un fichier extrait d'une URL. Bien sûr, je pourrais toujours récupérer l'URL et la stocker dans un fichier temporaire, puis l'ouvrir dans un objet image, mais cela semble très inefficace.

Voici ce que j'ai:

Image.open(urlopen(url))

Il s'écaille de se plaindre que seek() n'est pas disponible, alors j'ai essayé ce:

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

Mais ça n'a pas marché non plus. Est-il une Meilleure Façon de le faire, ou est écrit dans un fichier temporaire, le moyen accepté de faire ce genre de chose?

124
demandé sur Daniel Quinn 2011-09-12 22:01:46

8 réponses

Vous pouvez essayer d'utiliser un StringIO

import urllib, cStringIO

file = cStringIO.StringIO(urllib.urlopen(URL).read())
img = Image.open(file)
164
répondu Fábio Diniz 2011-09-12 18:07:32

En Python3, les modules StringIO et Cstringio ont disparu.

En Python3, vous devez utiliser:

from PIL import Image
import requests
from io import BytesIO

response = requests.get(url)
img = Image.open(BytesIO(response.content))
146
répondu Andres Kull 2014-05-06 08:30:57

J'utilise la bibliothèque de requêtes. Il semble être plus robuste.

from PIL import Image
import requests
from StringIO import StringIO

response = requests.get(url)
img = Image.open(StringIO(response.content))
52
répondu Saurav 2012-10-23 06:19:24

Pour ceux d'entre vous qui utilisent l'Oreiller, à partir de la version 2.8.0 vous pouvez:

from PIL import Image
import urllib2

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

, Ou si vous utilisez requests:

from PIL import Image
import requests

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

Références:

31
répondu Giovanni Cappellotto 2016-12-03 04:14:20

Utilisez StringIO pour transformer la chaîne de lecture en un objet de type fichier:

from StringIO import StringIO
import urllib

Image.open(StringIO(urllib.urlopen(url).read()))
27
répondu Dan D. 2015-10-02 07:45:17

Pour ceux qui font du post-traitement sklearn/numpy (c'est-à-dire Deep learning), vous pouvez envelopper L'objet PIL avec np.tableau(). Cela pourrait vous éviter d'avoir à Google comme je l'ai fait:

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
répondu Ben 2015-10-17 15:59:44

Sélectionnez l'image dans chrome, faites un clic droit dessus, cliquez sur Copy image address, collez-la dans une variable str (my_url) pour lire l'image:

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

Ouvrez-le;

from PIL import Image

img = Image.open('my_image.png')
img.show()
2
répondu Hamidreza 2018-05-30 20:53:32

Cela fonctionne aussi sur Python 3.6...

from urllib.request import urlopen
from PIL import Image

img = Image.open(urlopen(url))
img
1
répondu Miladiouss 2018-09-05 05:18:45