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.:

  1. Image.open(urllib2.urlopen(url))
  2. 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:

  1. response = requests.get(url, stream=True)
  2. response.raw.decode_content = True
  3. image = Image.open(response.raw)