mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-12-25 01:16:16 +03:00
ca108113ba
Resize performance
115 lines
4.5 KiB
ReStructuredText
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
|
|
^^^^^^^^^^^^
|
|
|