mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-01-29 02:34:10 +03:00
Merge remote-tracking branch 'upstream/master' into doctest-turn-warnings-into-errors
This commit is contained in:
commit
6a43ea86ea
|
@ -5,6 +5,12 @@ Changelog (Pillow)
|
||||||
7.0.0 (unreleased)
|
7.0.0 (unreleased)
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
- Fixed black lines on upscaled images with the BOX filter #4278
|
||||||
|
[homm]
|
||||||
|
|
||||||
|
- Change default resize resampling filter from NEAREST to BICUBIC #4255
|
||||||
|
[homm]
|
||||||
|
|
||||||
- Better thumbnail aspect ratio preservation #4256
|
- Better thumbnail aspect ratio preservation #4256
|
||||||
[homm]
|
[homm]
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,13 @@ class TestFileBmp(PillowTestCase):
|
||||||
self.assertEqual(im.size, reloaded.size)
|
self.assertEqual(im.size, reloaded.size)
|
||||||
self.assertEqual(reloaded.format, "BMP")
|
self.assertEqual(reloaded.format, "BMP")
|
||||||
|
|
||||||
|
def test_save_too_large(self):
|
||||||
|
outfile = self.tempfile("temp.bmp")
|
||||||
|
with Image.new("RGB", (1, 1)) as im:
|
||||||
|
im._size = (37838, 37838)
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
im.save(outfile)
|
||||||
|
|
||||||
def test_dpi(self):
|
def test_dpi(self):
|
||||||
dpi = (72, 72)
|
dpi = (72, 72)
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,8 @@ Basic Installation
|
||||||
|
|
||||||
Install Pillow with :command:`pip`::
|
Install Pillow with :command:`pip`::
|
||||||
|
|
||||||
$ pip install Pillow
|
python -m pip install pip
|
||||||
|
python -m pip install Pillow
|
||||||
|
|
||||||
|
|
||||||
Windows Installation
|
Windows Installation
|
||||||
|
@ -58,7 +59,8 @@ supported Pythons in both 32 and 64-bit versions in wheel, egg, and
|
||||||
executable installers. These binaries have all of the optional
|
executable installers. These binaries have all of the optional
|
||||||
libraries included except for raqm and libimagequant::
|
libraries included except for raqm and libimagequant::
|
||||||
|
|
||||||
> pip install Pillow
|
python -m pip install pip
|
||||||
|
python -m pip install Pillow
|
||||||
|
|
||||||
|
|
||||||
macOS Installation
|
macOS Installation
|
||||||
|
@ -69,7 +71,8 @@ versions in the wheel format. These include support for all optional
|
||||||
libraries except libimagequant. Raqm support requires libraqm,
|
libraries except libimagequant. Raqm support requires libraqm,
|
||||||
fribidi, and harfbuzz to be installed separately::
|
fribidi, and harfbuzz to be installed separately::
|
||||||
|
|
||||||
$ pip install Pillow
|
python -m pip install pip
|
||||||
|
python -m pip install Pillow
|
||||||
|
|
||||||
Linux Installation
|
Linux Installation
|
||||||
^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -79,7 +82,8 @@ versions in the manylinux wheel format. These include support for all
|
||||||
optional libraries except libimagequant. Raqm support requires
|
optional libraries except libimagequant. Raqm support requires
|
||||||
libraqm, fribidi, and harfbuzz to be installed separately::
|
libraqm, fribidi, and harfbuzz to be installed separately::
|
||||||
|
|
||||||
$ pip install Pillow
|
python -m pip install pip
|
||||||
|
python -m pip install Pillow
|
||||||
|
|
||||||
Most major Linux distributions, including Fedora, Debian/Ubuntu and
|
Most major Linux distributions, including Fedora, Debian/Ubuntu and
|
||||||
ArchLinux also include Pillow in packages that previously contained
|
ArchLinux also include Pillow in packages that previously contained
|
||||||
|
@ -92,11 +96,11 @@ Pillow can be installed on FreeBSD via the official Ports or Packages systems:
|
||||||
|
|
||||||
**Ports**::
|
**Ports**::
|
||||||
|
|
||||||
$ cd /usr/ports/graphics/py-pillow && make install clean
|
cd /usr/ports/graphics/py-pillow && make install clean
|
||||||
|
|
||||||
**Packages**::
|
**Packages**::
|
||||||
|
|
||||||
$ pkg install py36-pillow
|
pkg install py36-pillow
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
|
@ -191,7 +195,8 @@ Many of Pillow's features require external libraries:
|
||||||
|
|
||||||
Once you have installed the prerequisites, run::
|
Once you have installed the prerequisites, run::
|
||||||
|
|
||||||
$ pip install Pillow
|
python -m pip install pip
|
||||||
|
python -m pip install Pillow
|
||||||
|
|
||||||
If the prerequisites are installed in the standard library locations
|
If the prerequisites are installed in the standard library locations
|
||||||
for your machine (e.g. :file:`/usr` or :file:`/usr/local`), no
|
for your machine (e.g. :file:`/usr` or :file:`/usr/local`), no
|
||||||
|
@ -201,7 +206,7 @@ those locations by editing :file:`setup.py` or
|
||||||
:file:`setup.cfg`, or by adding environment variables on the command
|
:file:`setup.cfg`, or by adding environment variables on the command
|
||||||
line::
|
line::
|
||||||
|
|
||||||
$ CFLAGS="-I/usr/pkg/include" pip install pillow
|
CFLAGS="-I/usr/pkg/include" python -m pip install pillow
|
||||||
|
|
||||||
If Pillow has been previously built without the required
|
If Pillow has been previously built without the required
|
||||||
prerequisites, it may be necessary to manually clear the pip cache or
|
prerequisites, it may be necessary to manually clear the pip cache or
|
||||||
|
@ -245,11 +250,11 @@ Build Options
|
||||||
|
|
||||||
Sample usage::
|
Sample usage::
|
||||||
|
|
||||||
$ MAX_CONCURRENCY=1 python setup.py build_ext --enable-[feature] install
|
MAX_CONCURRENCY=1 python setup.py build_ext --enable-[feature] install
|
||||||
|
|
||||||
or using pip::
|
or using pip::
|
||||||
|
|
||||||
$ pip install pillow --global-option="build_ext" --global-option="--enable-[feature]"
|
python -m pip install pillow --global-option="build_ext" --global-option="--enable-[feature]"
|
||||||
|
|
||||||
|
|
||||||
Building on macOS
|
Building on macOS
|
||||||
|
@ -265,21 +270,22 @@ tools.
|
||||||
The easiest way to install external libraries is via `Homebrew
|
The easiest way to install external libraries is via `Homebrew
|
||||||
<https://brew.sh/>`_. After you install Homebrew, run::
|
<https://brew.sh/>`_. After you install Homebrew, run::
|
||||||
|
|
||||||
$ brew install libtiff libjpeg webp little-cms2
|
brew install libtiff libjpeg webp little-cms2
|
||||||
|
|
||||||
To install libraqm on macOS use Homebrew to install its dependencies::
|
To install libraqm on macOS use Homebrew to install its dependencies::
|
||||||
|
|
||||||
$ brew install freetype harfbuzz fribidi
|
brew install freetype harfbuzz fribidi
|
||||||
|
|
||||||
Then see ``depends/install_raqm_cmake.sh`` to install libraqm.
|
Then see ``depends/install_raqm_cmake.sh`` to install libraqm.
|
||||||
|
|
||||||
Now install Pillow with::
|
Now install Pillow with::
|
||||||
|
|
||||||
$ pip install Pillow
|
python -m pip install pip
|
||||||
|
python -m pip install Pillow
|
||||||
|
|
||||||
or from within the uncompressed source directory::
|
or from within the uncompressed source directory::
|
||||||
|
|
||||||
$ python setup.py install
|
python setup.py install
|
||||||
|
|
||||||
Building on Windows
|
Building on Windows
|
||||||
^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -293,17 +299,17 @@ Building on FreeBSD
|
||||||
|
|
||||||
.. Note:: Only FreeBSD 10 and 11 tested
|
.. Note:: Only FreeBSD 10 and 11 tested
|
||||||
|
|
||||||
Make sure you have Python's development libraries installed.::
|
Make sure you have Python's development libraries installed::
|
||||||
|
|
||||||
$ sudo pkg install python2
|
sudo pkg install python2
|
||||||
|
|
||||||
Or for Python 3::
|
Or for Python 3::
|
||||||
|
|
||||||
$ sudo pkg install python3
|
sudo pkg install python3
|
||||||
|
|
||||||
Prerequisites are installed on **FreeBSD 10 or 11** with::
|
Prerequisites are installed on **FreeBSD 10 or 11** with::
|
||||||
|
|
||||||
$ sudo pkg install jpeg-turbo tiff webp lcms2 freetype2 openjpeg harfbuzz fribidi
|
sudo pkg install jpeg-turbo tiff webp lcms2 freetype2 openjpeg harfbuzz fribidi
|
||||||
|
|
||||||
Then see ``depends/install_raqm_cmake.sh`` to install libraqm.
|
Then see ``depends/install_raqm_cmake.sh`` to install libraqm.
|
||||||
|
|
||||||
|
@ -316,25 +322,25 @@ development libraries installed.
|
||||||
|
|
||||||
In Debian or Ubuntu::
|
In Debian or Ubuntu::
|
||||||
|
|
||||||
$ sudo apt-get install python-dev python-setuptools
|
sudo apt-get install python-dev python-setuptools
|
||||||
|
|
||||||
Or for Python 3::
|
Or for Python 3::
|
||||||
|
|
||||||
$ sudo apt-get install python3-dev python3-setuptools
|
sudo apt-get install python3-dev python3-setuptools
|
||||||
|
|
||||||
In Fedora, the command is::
|
In Fedora, the command is::
|
||||||
|
|
||||||
$ sudo dnf install python-devel redhat-rpm-config
|
sudo dnf install python-devel redhat-rpm-config
|
||||||
|
|
||||||
Or for Python 3::
|
Or for Python 3::
|
||||||
|
|
||||||
$ sudo dnf install python3-devel redhat-rpm-config
|
sudo dnf install python3-devel redhat-rpm-config
|
||||||
|
|
||||||
.. Note:: ``redhat-rpm-config`` is required on Fedora 23, but not earlier versions.
|
.. Note:: ``redhat-rpm-config`` is required on Fedora 23, but not earlier versions.
|
||||||
|
|
||||||
Prerequisites are installed on **Ubuntu 16.04 LTS** with::
|
Prerequisites are installed on **Ubuntu 16.04 LTS** with::
|
||||||
|
|
||||||
$ sudo apt-get install libtiff5-dev libjpeg8-dev libopenjp2-7-dev zlib1g-dev \
|
sudo apt-get install libtiff5-dev libjpeg8-dev libopenjp2-7-dev zlib1g-dev \
|
||||||
libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python3-tk \
|
libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python3-tk \
|
||||||
libharfbuzz-dev libfribidi-dev
|
libharfbuzz-dev libfribidi-dev
|
||||||
|
|
||||||
|
@ -342,7 +348,7 @@ Then see ``depends/install_raqm.sh`` to install libraqm.
|
||||||
|
|
||||||
Prerequisites are installed on recent **RedHat** **Centos** or **Fedora** with::
|
Prerequisites are installed on recent **RedHat** **Centos** or **Fedora** with::
|
||||||
|
|
||||||
$ sudo dnf install libtiff-devel libjpeg-devel openjpeg2-devel zlib-devel \
|
sudo dnf install libtiff-devel libjpeg-devel openjpeg2-devel zlib-devel \
|
||||||
freetype-devel lcms2-devel libwebp-devel tcl-devel tk-devel \
|
freetype-devel lcms2-devel libwebp-devel tcl-devel tk-devel \
|
||||||
harfbuzz-devel fribidi-devel libraqm-devel libimagequant-devel
|
harfbuzz-devel fribidi-devel libraqm-devel libimagequant-devel
|
||||||
|
|
||||||
|
@ -359,7 +365,7 @@ Building on Android
|
||||||
Basic Android support has been added for compilation within the Termux
|
Basic Android support has been added for compilation within the Termux
|
||||||
environment. The dependencies can be installed by::
|
environment. The dependencies can be installed by::
|
||||||
|
|
||||||
$ pkg install -y python ndk-sysroot clang make \
|
pkg install -y python ndk-sysroot clang make \
|
||||||
libjpeg-turbo
|
libjpeg-turbo
|
||||||
|
|
||||||
This has been tested within the Termux app on ChromeOS, on x86.
|
This has been tested within the Termux app on ChromeOS, on x86.
|
||||||
|
|
|
@ -52,8 +52,8 @@ Default resampling filter
|
||||||
|
|
||||||
The default resampling filter has been changed to the high-quality convolution
|
The default resampling filter has been changed to the high-quality convolution
|
||||||
``Image.BICUBIC`` instead of ``Image.NEAREST``, for the :py:meth:`~PIL.Image.Image.resize`
|
``Image.BICUBIC`` instead of ``Image.NEAREST``, for the :py:meth:`~PIL.Image.Image.resize`
|
||||||
method and the :py:meth:`~PIL.ImageOps.pad``, :py:meth:`~PIL.ImageOps.scale``
|
method and the :py:meth:`~PIL.ImageOps.pad`, :py:meth:`~PIL.ImageOps.scale`
|
||||||
and :py:meth:`~PIL.ImageOps.fit`` functions.
|
and :py:meth:`~PIL.ImageOps.fit` functions.
|
||||||
``Image.NEAREST`` is still always used for images in "P" and "1" modes.
|
``Image.NEAREST`` is still always used for images in "P" and "1" modes.
|
||||||
See :ref:`concept-filters` to learn the difference. In short,
|
See :ref:`concept-filters` to learn the difference. In short,
|
||||||
``Image.NEAREST`` is a very fast filter, but simple and low-quality.
|
``Image.NEAREST`` is a very fast filter, but simple and low-quality.
|
||||||
|
@ -87,8 +87,8 @@ Image.__del__
|
||||||
^^^^^^^^^^^^^
|
^^^^^^^^^^^^^
|
||||||
|
|
||||||
Implicitly closing the image's underlying file in ``Image.__del__`` has been removed.
|
Implicitly closing the image's underlying file in ``Image.__del__`` has been removed.
|
||||||
Use a context manager or call ``Image.close()`` instead to close the file in a
|
Use a context manager or call :py:meth:`~PIL.Image.Image.close` instead to close
|
||||||
deterministic way.
|
the file in a deterministic way.
|
||||||
|
|
||||||
Previous method:
|
Previous method:
|
||||||
|
|
||||||
|
@ -107,5 +107,5 @@ Use instead:
|
||||||
Better thumbnail aspect ratio preservation
|
Better thumbnail aspect ratio preservation
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
When calculating the new dimensions in ``Image.thumbnail``, round to the
|
When calculating the new dimensions in :py:meth:`~PIL.Image.Image.thumbnail`,
|
||||||
nearest integer, instead of always rounding down.
|
round to the nearest integer, instead of always rounding down.
|
||||||
|
|
|
@ -321,12 +321,15 @@ def _save(im, fp, filename, bitmap_header=True):
|
||||||
# bitmap header
|
# bitmap header
|
||||||
if bitmap_header:
|
if bitmap_header:
|
||||||
offset = 14 + header + colors * 4
|
offset = 14 + header + colors * 4
|
||||||
|
file_size = offset + image
|
||||||
|
if file_size > 2 ** 32 - 1:
|
||||||
|
raise ValueError("File size is too large for the BMP format")
|
||||||
fp.write(
|
fp.write(
|
||||||
b"BM"
|
b"BM" # file type (magic)
|
||||||
+ o32(offset + image) # file type (magic)
|
+ o32(file_size) # file size
|
||||||
+ o32(0) # file size
|
+ o32(0) # reserved
|
||||||
+ o32(offset) # reserved
|
+ o32(offset) # image data offset
|
||||||
) # image data offset
|
)
|
||||||
|
|
||||||
# bitmap info header
|
# bitmap info header
|
||||||
fp.write(
|
fp.write(
|
||||||
|
|
Loading…
Reference in New Issue
Block a user