¿Cómo leo datos de imagen de una URL en Python?
Lo que intento hacer es bastante simple cuando trabajamos con un archivo local, pero el problema surge cuando intento hacerlo con una URL remota.
Básicamente, estoy intentando crear un objeto de imagen PIL a partir de un archivo extraído de una URL. Claro, siempre podría buscar la URL y almacenarla en un archivo temporal, luego abrirla en un objeto de imagen, pero eso parece muy ineficiente.
Esto es lo que tengo:
Image.open(urlopen(url))
Se desmorona quejándose de que seek()
no está disponible, así que probé esto:
Image.open(urlopen(url).read())
Pero eso tampoco funcionó. ¿Existe una mejor manera de hacer esto o escribir en un archivo temporal es la forma aceptada de hacer este tipo de cosas?
En Python3, los módulos StringIO y cStringIO desaparecieron.
En Python3 deberías usar:
from PIL import Image
import requests
from io import BytesIO
response = requests.get(url)
img = Image.open(BytesIO(response.content))
Lo siguiente funciona para Python 3:
from PIL import Image
import requests
im = Image.open(requests.get(url, stream=True).raw)
Referencias:
- https://github.com/python-pillow/Pillow/pull/1151
- https://github.com/python-pillow/Pillow/blob/master/CHANGES.rst#280-2015-04-01
Usando unStringIO
import urllib, cStringIO
file = cStringIO.StringIO(urllib.urlopen(URL).read())
img = Image.open(file)
Usando requests
:
from PIL import Image
import requests
from StringIO import StringIO
response = requests.get(url)
img = Image.open(StringIO(response.content))