2011-09-12 25 views
107

Lo que trato de hacer es bastante simple cuando se trata de un archivo local, pero el problema surge cuando trato de hacerlo con una URL remota.¿Cómo leo los datos de imagen de una URL en Python?

Básicamente, estoy tratando de crear un objeto de imagen PIL a partir de un archivo extraído de una URL. Claro, siempre podría buscar el URL y almacenarlo en un archivo temporal, luego abrirlo en un objeto de imagen, pero eso se siente muy ineficiente.

Esto es lo que tengo:

Image.open(urlopen(url)) 

que se pueda desmenuzar fuera quejan de que seek() no está disponible, por lo que entonces he intentado esto:

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

Pero eso no funcionó bien. ¿Existe una mejor manera de hacerlo, o está escribiendo en un archivo temporal la forma aceptada de hacer este tipo de cosas?

+0

Ver también: [Cómo guardar una imagen localmente usando Python cuya dirección URL que ya sé?] (Http://stackoverflow.com/q/8286352/562769) –

Respuesta

145

usted podría intentar usar un StringIO

import urllib, cStringIO 

file = cStringIO.StringIO(urllib.urlopen(URL).read()) 
img = Image.open(file) 
+0

Gracias, lo haría simplemente agregar que el mismo código exacto funcionará con urllib2 (con Python2) – sofly

+8

en python 3 sería de urllib.request import urlopen y io.io.BytesIO en lugar de StringIO – matyas

27

Uso StringIO para activar la cadena de lectura en un objeto de tipo fichero:

from StringIO import StringIO 
import urllib 

Image.open(StringIO(urllib.urlopen(url).read())) 
49

utilizo la biblioteca peticiones. Parece ser más robusto.

from PIL import Image 
import requests 
from StringIO import StringIO 

response = requests.get(url) 
img = Image.open(StringIO(response.content)) 
+3

Por alguna razón, urllib no funcionó para algunos URLs, pero las solicitudes funcionaron donde falló – mirri66

+0

No pude encontrar el paquete PIL, pero parece que la almohada se ha hecho cargo del esfuerzo de PIL y puede instalarlo para python3 con 'pip3.4 install pillow'. – disruptive

+2

Tenga en cuenta que las solicitudes cargarán toda la respuesta en la memoria, y luego PIL cargará todo de nuevo como una imagen, por lo que tiene dos copias completas residentes en la memoria. La respuesta anterior con el método urllib transmite los datos, por lo que solo se obtiene una copia más el tamaño del búfer de transmisión. También puede transmitir los datos con solicitudes, pero dado que la respuesta no es compatible con la semántica de lectura(), tendría que crear un adaptador. – sirdodger

110

En Python3 los módulos StringIO y cStringIO han desaparecido.

En python3 se debe utilizar:

from PIL import Image 
import requests 
from io import BytesIO 

response = requests.get(url) 
img = Image.open(BytesIO(response.content)) 
+15

Estoy usando Pilllow https://pypi.python.org/pypi/Pillow/2.7.0 –

18

Para aquellos que realizan algún tipo de procesamiento posterior sklearn/numpy (es decir, el aprendizaje profundo) se puede envolver el objeto con el PIL np.array(). Esto podría salvar de tener a Google como yo lo hice:

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))) 
Cuestiones relacionadas