Merge remote-tracking branch 'upstream/master' into doctest-turn-warnings-into-errors

This commit is contained in:
Hugo 2019-12-21 15:52:59 +02:00
commit 6a43ea86ea
5 changed files with 58 additions and 36 deletions

View File

@ -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]

View File

@ -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)

View File

@ -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.

View File

@ -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.

View File

@ -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(