mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-12-27 10:26:19 +03:00
167 lines
6.5 KiB
ReStructuredText
167 lines
6.5 KiB
ReStructuredText
2.7.0
|
|
=====
|
|
|
|
Sane Plugin
|
|
-----------
|
|
|
|
The Sane plugin has now been split into its own repo:
|
|
https://github.com/python-pillow/Sane .
|
|
|
|
|
|
Png text chunk size limits
|
|
--------------------------
|
|
|
|
To prevent potential denial of service attacks using compressed text
|
|
chunks, there are now limits to the decompressed size of text chunks
|
|
decoded from PNG images. If the limits are exceeded when opening a PNG
|
|
image a :py:exc:`ValueError` will be raised.
|
|
|
|
Individual text chunks are limited to
|
|
:py:attr:`PIL.PngImagePlugin.MAX_TEXT_CHUNK`, set to 1MB by
|
|
default. The total decompressed size of all text chunks is limited to
|
|
:py:attr:`PIL.PngImagePlugin.MAX_TEXT_MEMORY`, which defaults to
|
|
64MB. These values can be changed prior to opening PNG images if you
|
|
know that there are large text blocks that are desired.
|
|
|
|
Image resizing filters
|
|
----------------------
|
|
|
|
Image resizing methods :py:meth:`~PIL.Image.Image.resize` and
|
|
:py:meth:`~PIL.Image.Image.thumbnail` take a ``resample`` argument, which tells
|
|
which filter should be used for resampling. Possible values are:
|
|
``NEAREST``, ``BILINEAR``, ``BICUBIC`` and ``ANTIALIAS``. Almost all of them
|
|
were changed in this version.
|
|
|
|
Bicubic and bilinear downscaling
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
From the beginning ``BILINEAR`` and ``BICUBIC`` filters were based on affine
|
|
transformations and used a fixed number of pixels from the source image for
|
|
every destination pixel (2x2 pixels for ``BILINEAR`` and 4x4 for ``BICUBIC``).
|
|
This gave an unsatisfactory result for downscaling. At the same time, a high
|
|
quality convolutions-based algorithm with flexible kernel was used for
|
|
``ANTIALIAS`` filter.
|
|
|
|
Starting from Pillow 2.7.0, a high quality convolutions-based algorithm is used
|
|
for all of these three filters.
|
|
|
|
If you have previously used any tricks to maintain quality when downscaling with
|
|
``BILINEAR`` and ``BICUBIC`` filters (for example, reducing within several
|
|
steps), they are unnecessary now.
|
|
|
|
Antialias renamed to Lanczos
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
A new ``LANCZOS`` constant was added instead of ``ANTIALIAS``.
|
|
|
|
When ``ANTIALIAS`` was initially added, it was the only high-quality filter
|
|
based on convolutions. It's name was supposed to reflect this. Starting from
|
|
Pillow 2.7.0 all resize method are based on convolutions. All of them are
|
|
antialias from now on. And the real name of the ``ANTIALIAS`` filter is Lanczos
|
|
filter.
|
|
|
|
The ``ANTIALIAS`` constant is left for backward compatibility and is an alias
|
|
for ``LANCZOS``.
|
|
|
|
Lanczos upscaling quality
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
The image upscaling quality with ``LANCZOS`` filter was almost the same as
|
|
``BILINEAR`` due to a bug. This has been fixed.
|
|
|
|
Bicubic upscaling quality
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
The ``BICUBIC`` filter for affine transformations produced sharp, slightly
|
|
pixelated image for upscaling. Bicubic for convolutions is more soft.
|
|
|
|
Resize performance
|
|
^^^^^^^^^^^^^^^^^^
|
|
|
|
In most cases, convolution is more a expensive algorithm for downscaling
|
|
because it takes into account all the pixels of source image. Therefore
|
|
``BILINEAR`` and ``BICUBIC`` filters' performance can be lower than before.
|
|
On the other hand the quality of ``BILINEAR`` and ``BICUBIC`` was close to
|
|
``NEAREST``. So if such quality is suitable for your tasks you can switch to
|
|
``NEAREST`` filter for downscaling, which will give a huge improvement in
|
|
performance.
|
|
|
|
At the same time performance of convolution resampling for downscaling has been
|
|
improved by around a factor of two compared to the previous version.
|
|
The upscaling performance of the ``LANCZOS`` filter has remained the same. For
|
|
``BILINEAR`` filter it has improved by 1.5 times and for ``BICUBIC`` by four
|
|
times.
|
|
|
|
Default filter for thumbnails
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
In Pillow 2.5 the default filter for :py:meth:`~PIL.Image.Image.thumbnail` was
|
|
changed from ``NEAREST`` to ``ANTIALIAS``. Antialias was chosen because all the
|
|
other filters gave poor quality for reduction. Starting from Pillow 2.7.0,
|
|
``ANTIALIAS`` has been replaced with ``BICUBIC``, because it's faster and
|
|
``ANTIALIAS`` doesn't give any advantages after downscaling with libjpeg, which
|
|
uses supersampling internally, not convolutions.
|
|
|
|
Image transposition
|
|
-------------------
|
|
|
|
A new method ``TRANSPOSE`` has been added for the
|
|
:py:meth:`~PIL.Image.Image.transpose` operation in addition to
|
|
``FLIP_LEFT_RIGHT``, ``FLIP_TOP_BOTTOM``, ``ROTATE_90``, ``ROTATE_180``,
|
|
``ROTATE_270``. ``TRANSPOSE`` is an algebra transpose, with an image reflected
|
|
across its main diagonal.
|
|
|
|
The speed of ``ROTATE_90``, ``ROTATE_270`` and ``TRANSPOSE`` has been significantly
|
|
improved for large images which don't fit in the processor cache.
|
|
|
|
Gaussian blur and unsharp mask
|
|
------------------------------
|
|
|
|
The :py:meth:`~PIL.ImageFilter.GaussianBlur` implementation has been replaced
|
|
with a sequential application of box filters. The new implementation is based on
|
|
"Theoretical foundations of Gaussian convolution by extended box filtering" from
|
|
the Mathematical Image Analysis Group. As :py:meth:`~PIL.ImageFilter.UnsharpMask`
|
|
implementations use Gaussian blur internally, all changes from this chapter
|
|
are also applicable to it.
|
|
|
|
Blur radius
|
|
^^^^^^^^^^^
|
|
|
|
There was an error in the previous version of Pillow, where blur radius (the
|
|
standard deviation of Gaussian) actually meant blur diameter. For example, to
|
|
blur an image with actual radius 5 you were forced to use value 10. This has
|
|
been fixed. Now the meaning of the radius is the same as in other software.
|
|
|
|
If you used a Gaussian blur with some radius value, you need to divide this
|
|
value by two.
|
|
|
|
Blur performance
|
|
^^^^^^^^^^^^^^^^
|
|
|
|
Box filter computation time is constant relative to the radius and depends
|
|
on source image size only. Because the new Gaussian blur implementation
|
|
is based on box filter, its computation time also doesn't depend on the blur
|
|
radius.
|
|
|
|
For example, previously, if the execution time for a given test image was 1
|
|
second for radius 1, 3.6 seconds for radius 10 and 17 seconds for 50, now blur
|
|
with any radius on same image is executed for 0.2 seconds.
|
|
|
|
Blur quality
|
|
^^^^^^^^^^^^
|
|
|
|
The previous implementation takes into account only source pixels within
|
|
2 * standard deviation radius for every destination pixel. This was not enough,
|
|
so the quality was worse compared to other Gaussian blur software.
|
|
|
|
The new implementation does not have this drawback.
|
|
|
|
TIFF Parameter Changes
|
|
----------------------
|
|
|
|
Several kwarg parameters for saving TIFF images were previously
|
|
specified as strings with included spaces (e.g. 'x resolution'). This
|
|
was difficult to use as kwargs without constructing and passing a
|
|
dictionary. These parameters now use the underscore character instead
|
|
of space. (e.g. 'x_resolution')
|