Pillow/docs/releasenotes/2.8.0.rst
Alex Clark 180f37b18e Update release notes to match template for #7864
- Categorized previously uncategorized notes under ``Other Changes``
- TODO: Fix categorization of notes in ``Other Changes`` that belong in other categories
2024-03-15 10:01:42 -04:00

36 lines
1.4 KiB
ReStructuredText

2.8.0
-----
Other Changes
=============
Open HTTP response objects with Image.open
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
HTTP response objects returned from ``urllib2.urlopen(url)`` or
``requests.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 in
``cStringIO`` or ``BytesIO``.
Now new functionality has been added to ``Image.open()`` by way of an ``.seek(0)`` check and
catch on exception :py:exc:`AttributeError` or :py:exc:`io.UnsupportedOperation`. If this is caught we
attempt to wrap the object using ``io.BytesIO`` (which will only work on buffer-file-like
objects).
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 this
will fail as both the urllib2 and requests raw file object will produce compressed data
in that case. Using Content-Encoding on images is rather non-sensical as most images are
already compressed, but it can still happen.
For requests the work-around is to set the decode_content attribute on the raw object to
True::
response = requests.get(url, stream=True)
response.raw.decode_content = True
image = Image.open(response.raw)