¿Cómo leo datos de imagen de una URL en Python?

Resuelto Daniel Quinn asked hace 13 años • 15 respuestas

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?

Daniel Quinn avatar Sep 13 '11 01:09 Daniel Quinn
Aceptado

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))
Andres Kull avatar May 06 '2014 08:05 Andres Kull

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
Giovanni Cappellotto avatar Dec 03 '2016 04:12 Giovanni Cappellotto

Usando unStringIO

import urllib, cStringIO

file = cStringIO.StringIO(urllib.urlopen(URL).read())
img = Image.open(file)
Fábio Diniz avatar Sep 12 '2011 18:09 Fábio Diniz

Usando requests:

from PIL import Image
import requests
from StringIO import StringIO

response = requests.get(url)
img = Image.open(StringIO(response.content))
Saurav avatar Oct 23 '2012 06:10 Saurav