mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-12-26 01:46:18 +03:00
Merge pull request #6868 from radarhere/filters
Refer to Resampling enum
This commit is contained in:
commit
f30eb38e31
|
@ -148,44 +148,44 @@ pixel, the Python Imaging Library provides different resampling *filters*.
|
||||||
|
|
||||||
.. py:currentmodule:: PIL.Image
|
.. py:currentmodule:: PIL.Image
|
||||||
|
|
||||||
.. data:: NEAREST
|
.. data:: Resampling.NEAREST
|
||||||
|
|
||||||
Pick one nearest pixel from the input image. Ignore all other input pixels.
|
Pick one nearest pixel from the input image. Ignore all other input pixels.
|
||||||
|
|
||||||
.. data:: BOX
|
.. data:: Resampling.BOX
|
||||||
|
|
||||||
Each pixel of source image contributes to one pixel of the
|
Each pixel of source image contributes to one pixel of the
|
||||||
destination image with identical weights.
|
destination image with identical weights.
|
||||||
For upscaling is equivalent of :data:`NEAREST`.
|
For upscaling is equivalent of :data:`Resampling.NEAREST`.
|
||||||
This filter can only be used with the :py:meth:`~PIL.Image.Image.resize`
|
This filter can only be used with the :py:meth:`~PIL.Image.Image.resize`
|
||||||
and :py:meth:`~PIL.Image.Image.thumbnail` methods.
|
and :py:meth:`~PIL.Image.Image.thumbnail` methods.
|
||||||
|
|
||||||
.. versionadded:: 3.4.0
|
.. versionadded:: 3.4.0
|
||||||
|
|
||||||
.. data:: BILINEAR
|
.. data:: Resampling.BILINEAR
|
||||||
|
|
||||||
For resize calculate the output pixel value using linear interpolation
|
For resize calculate the output pixel value using linear interpolation
|
||||||
on all pixels that may contribute to the output value.
|
on all pixels that may contribute to the output value.
|
||||||
For other transformations linear interpolation over a 2x2 environment
|
For other transformations linear interpolation over a 2x2 environment
|
||||||
in the input image is used.
|
in the input image is used.
|
||||||
|
|
||||||
.. data:: HAMMING
|
.. data:: Resampling.HAMMING
|
||||||
|
|
||||||
Produces a sharper image than :data:`BILINEAR`, doesn't have dislocations
|
Produces a sharper image than :data:`Resampling.BILINEAR`, doesn't have
|
||||||
on local level like with :data:`BOX`.
|
dislocations on local level like with :data:`Resampling.BOX`.
|
||||||
This filter can only be used with the :py:meth:`~PIL.Image.Image.resize`
|
This filter can only be used with the :py:meth:`~PIL.Image.Image.resize`
|
||||||
and :py:meth:`~PIL.Image.Image.thumbnail` methods.
|
and :py:meth:`~PIL.Image.Image.thumbnail` methods.
|
||||||
|
|
||||||
.. versionadded:: 3.4.0
|
.. versionadded:: 3.4.0
|
||||||
|
|
||||||
.. data:: BICUBIC
|
.. data:: Resampling.BICUBIC
|
||||||
|
|
||||||
For resize calculate the output pixel value using cubic interpolation
|
For resize calculate the output pixel value using cubic interpolation
|
||||||
on all pixels that may contribute to the output value.
|
on all pixels that may contribute to the output value.
|
||||||
For other transformations cubic interpolation over a 4x4 environment
|
For other transformations cubic interpolation over a 4x4 environment
|
||||||
in the input image is used.
|
in the input image is used.
|
||||||
|
|
||||||
.. data:: LANCZOS
|
.. data:: Resampling.LANCZOS
|
||||||
|
|
||||||
Calculate the output pixel value using a high-quality Lanczos filter (a
|
Calculate the output pixel value using a high-quality Lanczos filter (a
|
||||||
truncated sinc) on all pixels that may contribute to the output value.
|
truncated sinc) on all pixels that may contribute to the output value.
|
||||||
|
@ -198,19 +198,19 @@ pixel, the Python Imaging Library provides different resampling *filters*.
|
||||||
Filters comparison table
|
Filters comparison table
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
+----------------+-------------+-----------+-------------+
|
+---------------------------+-------------+-----------+-------------+
|
||||||
| Filter | Downscaling | Upscaling | Performance |
|
| Filter | Downscaling | Upscaling | Performance |
|
||||||
| | quality | quality | |
|
| | quality | quality | |
|
||||||
+================+=============+===========+=============+
|
+===========================+=============+===========+=============+
|
||||||
|:data:`NEAREST` | | | ⭐⭐⭐⭐⭐ |
|
|:data:`Resampling.NEAREST` | | | ⭐⭐⭐⭐⭐ |
|
||||||
+----------------+-------------+-----------+-------------+
|
+---------------------------+-------------+-----------+-------------+
|
||||||
|:data:`BOX` | ⭐ | | ⭐⭐⭐⭐ |
|
|:data:`Resampling.BOX` | ⭐ | | ⭐⭐⭐⭐ |
|
||||||
+----------------+-------------+-----------+-------------+
|
+---------------------------+-------------+-----------+-------------+
|
||||||
|:data:`BILINEAR`| ⭐ | ⭐ | ⭐⭐⭐ |
|
|:data:`Resampling.BILINEAR`| ⭐ | ⭐ | ⭐⭐⭐ |
|
||||||
+----------------+-------------+-----------+-------------+
|
+---------------------------+-------------+-----------+-------------+
|
||||||
|:data:`HAMMING` | ⭐⭐ | | ⭐⭐⭐ |
|
|:data:`Resampling.HAMMING` | ⭐⭐ | | ⭐⭐⭐ |
|
||||||
+----------------+-------------+-----------+-------------+
|
+---------------------------+-------------+-----------+-------------+
|
||||||
|:data:`BICUBIC` | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
|
|:data:`Resampling.BICUBIC` | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
|
||||||
+----------------+-------------+-----------+-------------+
|
+---------------------------+-------------+-----------+-------------+
|
||||||
|:data:`LANCZOS` | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐ |
|
|:data:`Resampling.LANCZOS` | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐ |
|
||||||
+----------------+-------------+-----------+-------------+
|
+---------------------------+-------------+-----------+-------------+
|
||||||
|
|
|
@ -430,6 +430,7 @@ See :ref:`concept-filters` for details.
|
||||||
.. autoclass:: Resampling
|
.. autoclass:: Resampling
|
||||||
:members:
|
:members:
|
||||||
:undoc-members:
|
:undoc-members:
|
||||||
|
:noindex:
|
||||||
|
|
||||||
Some deprecated filters are also available under the following names:
|
Some deprecated filters are also available under the following names:
|
||||||
|
|
||||||
|
|
|
@ -29,84 +29,78 @@ Image resizing filters
|
||||||
Image resizing methods :py:meth:`~PIL.Image.Image.resize` and
|
Image resizing methods :py:meth:`~PIL.Image.Image.resize` and
|
||||||
:py:meth:`~PIL.Image.Image.thumbnail` take a ``resample`` argument, which tells
|
:py:meth:`~PIL.Image.Image.thumbnail` take a ``resample`` argument, which tells
|
||||||
which filter should be used for resampling. Possible values are:
|
which filter should be used for resampling. Possible values are:
|
||||||
:py:data:`PIL.Image.NEAREST`, :py:data:`PIL.Image.BILINEAR`,
|
``NEAREST``, ``BILINEAR``, ``BICUBIC`` and ``ANTIALIAS``. Almost all of them
|
||||||
:py:data:`PIL.Image.BICUBIC` and :py:data:`PIL.Image.ANTIALIAS`.
|
were changed in this version.
|
||||||
Almost all of them were changed in this version.
|
|
||||||
|
|
||||||
Bicubic and bilinear downscaling
|
Bicubic and bilinear downscaling
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
From the beginning :py:data:`~PIL.Image.BILINEAR` and
|
From the beginning ``BILINEAR`` and ``BICUBIC`` filters were based on affine
|
||||||
:py:data:`~PIL.Image.BICUBIC` filters were based on affine transformations
|
transformations and used a fixed number of pixels from the source image for
|
||||||
and used a fixed number of pixels from the source image for every destination
|
every destination pixel (2x2 pixels for ``BILINEAR`` and 4x4 for ``BICUBIC``).
|
||||||
pixel (2x2 pixels for :py:data:`~PIL.Image.BILINEAR` and 4x4 for
|
This gave an unsatisfactory result for downscaling. At the same time, a high
|
||||||
:py:data:`~PIL.Image.BICUBIC`). This gave an unsatisfactory result for
|
quality convolutions-based algorithm with flexible kernel was used for
|
||||||
downscaling. At the same time, a high quality convolutions-based algorithm with
|
``ANTIALIAS`` filter.
|
||||||
flexible kernel was used for :py:data:`~PIL.Image.ANTIALIAS` filter.
|
|
||||||
|
|
||||||
Starting from Pillow 2.7.0, a high quality convolutions-based algorithm is used
|
Starting from Pillow 2.7.0, a high quality convolutions-based algorithm is used
|
||||||
for all of these three filters.
|
for all of these three filters.
|
||||||
|
|
||||||
If you have previously used any tricks to maintain quality when downscaling with
|
If you have previously used any tricks to maintain quality when downscaling with
|
||||||
:py:data:`~PIL.Image.BILINEAR` and :py:data:`~PIL.Image.BICUBIC` filters
|
``BILINEAR`` and ``BICUBIC`` filters (for example, reducing within several
|
||||||
(for example, reducing within several steps), they are unnecessary now.
|
steps), they are unnecessary now.
|
||||||
|
|
||||||
Antialias renamed to Lanczos
|
Antialias renamed to Lanczos
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
A new :py:data:`PIL.Image.LANCZOS` constant was added instead of
|
A new ``LANCZOS`` constant was added instead of ``ANTIALIAS``.
|
||||||
:py:data:`~PIL.Image.ANTIALIAS`.
|
|
||||||
|
|
||||||
When :py:data:`~PIL.Image.ANTIALIAS` was initially added, it was the only
|
When ``ANTIALIAS`` was initially added, it was the only high-quality filter
|
||||||
high-quality filter based on convolutions. It's name was supposed to reflect
|
based on convolutions. It's name was supposed to reflect this. Starting from
|
||||||
this. Starting from Pillow 2.7.0 all resize method are based on convolutions.
|
Pillow 2.7.0 all resize method are based on convolutions. All of them are
|
||||||
All of them are antialias from now on. And the real name of the
|
antialias from now on. And the real name of the ``ANTIALIAS`` filter is Lanczos
|
||||||
:py:data:`~PIL.Image.ANTIALIAS` filter is Lanczos filter.
|
filter.
|
||||||
|
|
||||||
The :py:data:`~PIL.Image.ANTIALIAS` constant is left for backward compatibility
|
The ``ANTIALIAS`` constant is left for backward compatibility and is an alias
|
||||||
and is an alias for :py:data:`~PIL.Image.LANCZOS`.
|
for ``LANCZOS``.
|
||||||
|
|
||||||
Lanczos upscaling quality
|
Lanczos upscaling quality
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
The image upscaling quality with :py:data:`~PIL.Image.LANCZOS` filter was
|
The image upscaling quality with ``LANCZOS`` filter was almost the same as
|
||||||
almost the same as :py:data:`~PIL.Image.BILINEAR` due to bug. This has been fixed.
|
``BILINEAR`` due to a bug. This has been fixed.
|
||||||
|
|
||||||
Bicubic upscaling quality
|
Bicubic upscaling quality
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
The :py:data:`~PIL.Image.BICUBIC` filter for affine transformations produced
|
The ``BICUBIC`` filter for affine transformations produced sharp, slightly
|
||||||
sharp, slightly pixelated image for upscaling. Bicubic for convolutions is
|
pixelated image for upscaling. Bicubic for convolutions is more soft.
|
||||||
more soft.
|
|
||||||
|
|
||||||
Resize performance
|
Resize performance
|
||||||
^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
In most cases, convolution is more a expensive algorithm for downscaling
|
In most cases, convolution is more a expensive algorithm for downscaling
|
||||||
because it takes into account all the pixels of source image. Therefore
|
because it takes into account all the pixels of source image. Therefore
|
||||||
:py:data:`~PIL.Image.BILINEAR` and :py:data:`~PIL.Image.BICUBIC` filters'
|
``BILINEAR`` and ``BICUBIC`` filters' performance can be lower than before.
|
||||||
performance can be lower than before. On the other hand the quality of
|
On the other hand the quality of ``BILINEAR`` and ``BICUBIC`` was close to
|
||||||
:py:data:`~PIL.Image.BILINEAR` and :py:data:`~PIL.Image.BICUBIC` was close to
|
``NEAREST``. So if such quality is suitable for your tasks you can switch to
|
||||||
:py:data:`~PIL.Image.NEAREST`. So if such quality is suitable for your tasks
|
``NEAREST`` filter for downscaling, which will give a huge improvement in
|
||||||
you can switch to :py:data:`~PIL.Image.NEAREST` filter for downscaling,
|
performance.
|
||||||
which will give a huge improvement in performance.
|
|
||||||
|
|
||||||
At the same time performance of convolution resampling for downscaling has been
|
At the same time performance of convolution resampling for downscaling has been
|
||||||
improved by around a factor of two compared to the previous version.
|
improved by around a factor of two compared to the previous version.
|
||||||
The upscaling performance of the :py:data:`~PIL.Image.LANCZOS` filter has
|
The upscaling performance of the ``LANCZOS`` filter has remained the same. For
|
||||||
remained the same. For :py:data:`~PIL.Image.BILINEAR` filter it has improved by
|
``BILINEAR`` filter it has improved by 1.5 times and for ``BICUBIC`` by four
|
||||||
1.5 times and for :py:data:`~PIL.Image.BICUBIC` by four times.
|
times.
|
||||||
|
|
||||||
Default filter for thumbnails
|
Default filter for thumbnails
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
In Pillow 2.5 the default filter for :py:meth:`~PIL.Image.Image.thumbnail` was
|
In Pillow 2.5 the default filter for :py:meth:`~PIL.Image.Image.thumbnail` was
|
||||||
changed from :py:data:`~PIL.Image.NEAREST` to :py:data:`~PIL.Image.ANTIALIAS`.
|
changed from ``NEAREST`` to ``ANTIALIAS``. Antialias was chosen because all the
|
||||||
Antialias was chosen because all the other filters gave poor quality for
|
other filters gave poor quality for reduction. Starting from Pillow 2.7.0,
|
||||||
reduction. Starting from Pillow 2.7.0, :py:data:`~PIL.Image.ANTIALIAS` has been
|
``ANTIALIAS`` has been replaced with ``BICUBIC``, because it's faster and
|
||||||
replaced with :py:data:`~PIL.Image.BICUBIC`, because it's faster and
|
``ANTIALIAS`` doesn't give any advantages after downscaling with libjpeg, which
|
||||||
:py:data:`~PIL.Image.ANTIALIAS` doesn't give any advantages after
|
uses supersampling internally, not convolutions.
|
||||||
downscaling with libjpeg, which uses supersampling internally, not convolutions.
|
|
||||||
|
|
||||||
Image transposition
|
Image transposition
|
||||||
-------------------
|
-------------------
|
||||||
|
|
|
@ -248,7 +248,8 @@ def contain(image, size, method=Image.Resampling.BICUBIC):
|
||||||
:param size: The requested output size in pixels, given as a
|
:param size: The requested output size in pixels, given as a
|
||||||
(width, height) tuple.
|
(width, height) tuple.
|
||||||
:param method: Resampling method to use. Default is
|
:param method: Resampling method to use. Default is
|
||||||
:py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`.
|
:py:attr:`~PIL.Image.Resampling.BICUBIC`.
|
||||||
|
See :ref:`concept-filters`.
|
||||||
:return: An image.
|
:return: An image.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -276,7 +277,8 @@ def pad(image, size, method=Image.Resampling.BICUBIC, color=None, centering=(0.5
|
||||||
:param size: The requested output size in pixels, given as a
|
:param size: The requested output size in pixels, given as a
|
||||||
(width, height) tuple.
|
(width, height) tuple.
|
||||||
:param method: Resampling method to use. Default is
|
:param method: Resampling method to use. Default is
|
||||||
:py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`.
|
:py:attr:`~PIL.Image.Resampling.BICUBIC`.
|
||||||
|
See :ref:`concept-filters`.
|
||||||
:param color: The background color of the padded image.
|
:param color: The background color of the padded image.
|
||||||
:param centering: Control the position of the original image within the
|
:param centering: Control the position of the original image within the
|
||||||
padded version.
|
padded version.
|
||||||
|
@ -328,7 +330,8 @@ def scale(image, factor, resample=Image.Resampling.BICUBIC):
|
||||||
:param image: The image to rescale.
|
:param image: The image to rescale.
|
||||||
:param factor: The expansion factor, as a float.
|
:param factor: The expansion factor, as a float.
|
||||||
:param resample: Resampling method to use. Default is
|
:param resample: Resampling method to use. Default is
|
||||||
:py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`.
|
:py:attr:`~PIL.Image.Resampling.BICUBIC`.
|
||||||
|
See :ref:`concept-filters`.
|
||||||
:returns: An :py:class:`~PIL.Image.Image` object.
|
:returns: An :py:class:`~PIL.Image.Image` object.
|
||||||
"""
|
"""
|
||||||
if factor == 1:
|
if factor == 1:
|
||||||
|
@ -425,7 +428,8 @@ def fit(image, size, method=Image.Resampling.BICUBIC, bleed=0.0, centering=(0.5,
|
||||||
:param size: The requested output size in pixels, given as a
|
:param size: The requested output size in pixels, given as a
|
||||||
(width, height) tuple.
|
(width, height) tuple.
|
||||||
:param method: Resampling method to use. Default is
|
:param method: Resampling method to use. Default is
|
||||||
:py:attr:`PIL.Image.BICUBIC`. See :ref:`concept-filters`.
|
:py:attr:`~PIL.Image.Resampling.BICUBIC`.
|
||||||
|
See :ref:`concept-filters`.
|
||||||
:param bleed: Remove a border around the outside of the image from all
|
:param bleed: Remove a border around the outside of the image from all
|
||||||
four edges. The value is a decimal percentage (use 0.01 for
|
four edges. The value is a decimal percentage (use 0.01 for
|
||||||
one percent). The default value is 0 (no border).
|
one percent). The default value is 0 (no border).
|
||||||
|
|
Loading…
Reference in New Issue
Block a user