2.8.0
Open HTTP response objects with Image.open
HTTP response objects returned from urllib2.urlopen(url)
orrequests.get(url, stream=True).raw
are ‘file-like’ but do not support .seek()
operations. As a result PIL was unable to open them as images, requiring a wrap incStringIO
or BytesIO
.
Now new functionality has been added to Image.open()
by way of an .seek(0)
check andcatch on exception AttributeError
or io.UnsupportedOperation
. If this is caught weattempt to wrap the object using io.BytesIO
(which will only work on buffer-file-likeobjects).
This allows opening of files using both urllib2
and requests
, e.g.:
- Image.open(urllib2.urlopen(url))
- Image.open(requests.get(url, stream=True).raw)
If the response uses content-encoding (compression, either gzip or deflate) then thiswill fail as both the urllib2 and requests raw file object will produce compressed datain that case. Using Content-Encoding on images is rather non-sensical as most images arealready compressed, but it can still happen.
For requests the work-around is to set the decode_content attribute on the raw object toTrue:
- response = requests.get(url, stream=True)
- response.raw.decode_content = True
- image = Image.open(response.raw)