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?
8 réponses
Vous pouvez essayer d'utiliser un StringIO
import urllib, cStringIO
file = cStringIO.StringIO(urllib.urlopen(URL).read())
img = Image.open(file)
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))
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))
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:
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()))
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)))
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()
Cela fonctionne aussi sur Python 3.6...
from urllib.request import urlopen
from PIL import Image
img = Image.open(urlopen(url))
img