Pillow/docs/releasenotes/2.7.rst
homm ca108113ba chapters:
Resize performance
2014-11-30 20:31:33 +03:00

115 lines
4.5 KiB
ReStructuredText

Pillow 2.7
==========
Image resizing filters
----------------------
Image resizing methods :py:meth:`~PIL.Image.Image.resize` and
:py:meth:`~PIL.Image.Image.thumbnail` takes `resample` argument, which tells
what filter should be used for resampling. Possible values are:
:py:attr:`PIL.Image.NEAREST`, :py:attr:`PIL.Image.BILINEAR`,
:py:attr:`PIL.Image.BICUBIC` and :py:attr:`PIL.Image.ANTIALIAS`.
Almost all of them was changed in this version.
Bicubic and Bilinear downscaling
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
From very begining :py:attr:`~PIL.Image.BILINEAR` and
:py:attr:`~PIL.Image.BICUBIC` filters was based on afine transformations
and uses fixed number of pixels from source image for every destination pixel
(that was 2x2 pixels for :py:attr:`~PIL.Image.BILINEAR` and 4x4 for
:py:attr:`~PIL.Image.BICUBIC`). This gave an unsatisfied result for downscaling.
At the same time high quality convolutions-based algorithm with flexeible kernel
was used for :py:attr:`~PIL.Image.ANTIALIAS` filter).
Starting from 2.7 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
:py:attr:`~PIL.Image.BILINEAR` and :py:attr:`~PIL.Image.BICUBIC` filters
(for example, reducing within several steps), they a unnecessary now.
Antialias renamed to Lanczos
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
New :py:attr:`PIL.Image.LANCZOS` constant was added instead of
:py:attr:`~PIL.Image.ANTIALIAS`.
When :py:attr:`~PIL.Image.ANTIALIAS` was initially added, it was the only
high-qality filter based on convolutions. It's name was supposed to reflect
this. Starting from 2.7 all resize method are based on convolutions. All of them
are antialias from now. And the real name of :py:attr:`~PIL.Image.ANTIALIAS`
filter is Lanczos filter.
:py:attr:`~PIL.Image.ANTIALIAS` constant is leaved for backward compatibility
and is an alias for :py:attr:`~PIL.Image.LANCZOS`.
Lanczos upscaling quality
^^^^^^^^^^^^^^^^^^^^^^^^^
Image upscaling quality with :py:attr:`~PIL.Image.LANCZOS` filter was almost
the same as :py:attr:`~PIL.Image.BILINEAR` due to bug. This was fixed.
Bicubic upscaling quality
^^^^^^^^^^^^^^^^^^^^^^^^^
:py:attr:`~PIL.Image.BICUBIC` filter for affine trnsformations was producing
sharp, slightly pixelated image for upscaling. Bicubic for convolutions is
more soft.
Resize performance
^^^^^^^^^^^^^^^^^^
In most cases convolution is more expensive algorithm for downscaling because
it tekes in account all pixels of source image. Therefore
:py:attr:`~PIL.Image.BILINEAR` and :py:attr:`~PIL.Image.BICUBIC` filters
performance can be lower than before. On the other hand quality of
:py:attr:`~PIL.Image.BILINEAR` and :py:attr:`~PIL.Image.BICUBIC` was close to
:py:attr:`~PIL.Image.NEAREST`. So if such quality is suitable for your task
you can switch to :py:attr:`~PIL.Image.NEAREST` filter for downscaling,
that will give huge win in performance.
At the same time performance of convolution resampling for downscaling was
improved in about two times compared to previous version.
Upscaling performance of :py:attr:`~PIL.Image.LANCZOS` filter remained the same.
For :py:attr:`~PIL.Image.BILINEAR` filter it grew in 1.5 times and
for :py:attr:`~PIL.Image.BICUBIC` in 4 times.
Default filter for thumbnails
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
In Pillow 2.5 default filter for :py:meth:`~PIL.Image.Image.thumbnail` was
changed from :py:attr:`~PIL.Image.NEAREST` to :py:attr:`~PIL.Image.ANTIALIAS`.
Antialias was chosen because all other filters gave poor quality for reduction.
Starting from Pillow 2.7 :py:attr:`~PIL.Image.ANTIALIAS` replaced with
:py:attr:`~PIL.Image.BICUBIC`, because it faster and
:py:attr:`~PIL.Image.ANTIALIAS` doesn't give any advantages after
downscaling with libJPEG, which uses supersampling internaly, not convolutions.
Image transposing
-----------------
New method :py:attr:`PIL.Image.TRANSPOSE` was added for
:py:meth:`~PIL.Image.Image.transpose` operation in addition to
:py:attr:`~PIL.Image.FLIP_LEFT_RIGHT`, :py:attr:`~PIL.Image.FLIP_TOP_BOTTOM`,
:py:attr:`~PIL.Image.ROTATE_90`, :py:attr:`~PIL.Image.ROTATE_180`,
:py:attr:`~PIL.Image.ROTATE_270`. :py:attr:`~PIL.Image.TRANSPOSE` is algebra
transpose, when image reflected over its main diagonal.
Speed of :py:attr:`~PIL.Image.ROTATE_90`, :py:attr:`~PIL.Image.ROTATE_270`
and :py:attr:`~PIL.Image.TRANSPOSE` was significantly improved for large images,
which doesn't fit in processor cache.
Gaussian blur and unsharp mask
------------------------------
Blur radius
^^^^^^^^^^^
Blur Performance
^^^^^^^^^^^^^^^^
Blur quality
^^^^^^^^^^^^