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?
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))
vous pouvez essayer d'utiliser un StringIO
import urllib, cStringIO
file = cStringIO.StringIO(urllib.urlopen(URL).read())
img = Image.open(file)
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 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:
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()))
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)))
from urllib.request import urlopen
from PIL import Image
img = Image.open(urlopen(url))
img
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!
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()
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 .