web-dev-qa-db-fra.com

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

Ce que j'essaie de faire est assez simple lorsqu'il s'agit d'un fichier local, mais le problème vient du fait que 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 pouvais toujours simplement récupérer l'URL et la stocker dans un fichier temporaire, puis l'ouvrir dans un objet d'image, mais cela me semble très inefficace.

Voici ce que j'ai

Image.open(urlopen(url))

Cela s'effrite de se plaindre que seek() n'est pas disponible, alors j'ai essayé ceci:

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

Mais cela n'a pas fonctionné non plus. Y a-t-il une meilleure façon de faire cela ou est-ce que l'écriture dans un fichier temporaire est une façon acceptée de faire ce genre de chose?

148
Daniel Quinn

En Python3, les modules StringIO et cStringIO ont disparu.

En Python3, vous devriez utiliser:

from PIL import Image
import requests
from io import BytesIO

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

vous pouvez essayer d'utiliser un StringIO

import urllib, cStringIO

file = cStringIO.StringIO(urllib.urlopen(URL).read())
img = Image.open(file)
166
Fábio Diniz

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))
55
Saurav

Pour ceux qui utilisent Pillow, à 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:

36

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

from StringIO import StringIO
import urllib

Image.open(StringIO(urllib.requests.urlopen(url).read()))
27
Dan D.

Pour ceux qui effectuent un post-traitement sklearn/numpy (c'est-à-dire un apprentissage approfondi), vous pouvez envelopper l'objet PIL avec np.array (). 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
Ben

Python 3

from urllib.request import urlopen
from PIL import Image

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

Jupyter Notebook et IPython

import IPython
url = 'https://newevolutiondesigns.com/images/freebies/colorful-background-14.jpg'
IPython.display.Image(url, width = 250)

Contrairement à d'autres méthodes, cette méthode fonctionne également dans une boucle for!

12
Miladiouss

sélectionnez l'image en 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
Hamidreza

Le moyen sans doute recommandé de faire des entrées/sorties d'image ces jours-ci est d'utiliser le paquet dédié ImageIO . Les données d'image peuvent être lues directement à partir d'une URL avec une simple ligne de code:

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

De nombreuses réponses sur cette page sont antérieures à la publication de ce package et ne le mentionnent donc pas. ImageIO a commencé comme composant de la boîte à outils Scikit-Image . Il prend en charge un certain nombre de formats scientifiques en plus de ceux fournis par la bibliothèque de traitement d’images très populaire PILlow . Tout cela est présenté dans une API propre uniquement axée sur les entrées/sorties d'images. En fait, SciPy supprimé son propre lecteur/graveur d'images en faveur de ImageIO .

1
John Hennig