it-swarm.it

Come posso leggere i dati delle immagini da un URL in Python?

Quello che sto cercando di fare è abbastanza semplice quando abbiamo a che fare con un file locale, ma il problema si presenta quando provo a farlo con un URL remoto.

Fondamentalmente, sto cercando di creare un oggetto immagine PIL da un file estratto da un URL. Certo, potrei sempre recuperare l'URL e memorizzarlo in un file temporaneo, quindi aprirlo in un oggetto immagine, ma mi sembra molto inefficiente.

Ecco cosa ho:

Image.open(urlopen(url))

Si scatena lamentandosi che seek() non è disponibile, quindi ho provato questo:

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

Ma neanche quello ha funzionato. Esiste un modo migliore per farlo o scrivere su un file temporaneo è il modo accettato di fare questo genere di cose?

139
Daniel Quinn

In Python3 i moduli StringIO e cStringIO sono spariti.

In Python3 dovresti usare:

from PIL import Image
import requests
from io import BytesIO

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

potresti provare a usare StringIO

import urllib, cStringIO

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

Uso la libreria delle richieste. Sembra essere più robusto.

from PIL import Image
import requests
from StringIO import StringIO

response = requests.get(url)
img = Image.open(StringIO(response.content))
55
Saurav

Per quelli di voi che usano Pillow, dalla versione 2.8.0 è possibile:

from PIL import Image
import urllib2

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

o se usi requests:

from PIL import Image
import requests

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

Riferimenti:

35

Utilizzare StringIO per trasformare la stringa di lettura in un oggetto simile a un file:

from StringIO import StringIO
import urllib

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

Per coloro che eseguono un po 'di sklearn/intorpidimento post elaborazione (ovvero Deep learning) puoi avvolgere l'oggetto PIL con np.array (). Questo potrebbe salvarti dal dover farlo su Google come ho fatto io:

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 e IPython

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

A differenza di altri metodi, questo metodo funziona anche in un ciclo for!

10
Miladiouss

seleziona l'immagine in Chrome, fai clic destro su di essa, fai clic su Copy image address, incollala in una variabile str (my_url) per leggere l'immagine:

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

aprilo;

from PIL import Image

img = Image.open('my_image.png')
img.show()
2
Hamidreza

Il modo discutibile raccomandato per fare input/output delle immagini in questi giorni è usare il pacchetto dedicato ImageIO . I dati delle immagini possono essere letti direttamente da un URL con una semplice riga di codice:

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

Molte risposte in questa pagina precedono il rilascio di quel pacchetto e quindi non lo menzionano. ImageIO è iniziato come componente del toolkit Scikit-Image . Supporta una serie di formati scientifici oltre a quelli forniti dalla popolare libreria di elaborazione delle immagini PILlow . Avvolge il tutto in un'API pulita focalizzata esclusivamente sull'input/output delle immagini. In effetti, SciPy rimosso il proprio lettore/scrittore di immagini a favore di ImageIO .

1
John Hennig