Merge branch 'master' into box-in-thumbnail

This commit is contained in:
Andrew Murray 2019-12-24 18:18:34 +11:00 committed by GitHub
commit c35fb6fb67
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 60 additions and 45 deletions

View File

@ -83,12 +83,6 @@ jobs:
name: errors name: errors
path: Tests/errors path: Tests/errors
- name: Docs
if: matrix.python-version == 3.8
run: |
pip install sphinx-rtd-theme
make doccheck
- name: After success - name: After success
if: success() if: success()
run: | run: |

View File

@ -3,7 +3,7 @@
set -e set -e
sudo apt-get update sudo apt-get update
sudo apt-get -qq install libfreetype6-dev liblcms2-dev python-tk\ sudo apt-get -qq install libfreetype6-dev liblcms2-dev python3-tk\
ghostscript libffi-dev libjpeg-turbo-progs libopenjp2-7-dev\ ghostscript libffi-dev libjpeg-turbo-progs libopenjp2-7-dev\
cmake imagemagick libharfbuzz-dev libfribidi-dev cmake imagemagick libharfbuzz-dev libfribidi-dev
@ -20,8 +20,8 @@ if [[ $TRAVIS_PYTHON_VERSION == 3.* ]]; then
pip install pyqt5 pip install pyqt5
fi fi
# docs only on Python 3.7 # docs only on Python 3.8
if [ "$TRAVIS_PYTHON_VERSION" == "3.7" ]; then pip install -r requirements.txt ; fi if [ "$TRAVIS_PYTHON_VERSION" == "3.8" ]; then pip install -r requirements.txt ; fi
# webp # webp
pushd depends && ./install_webp.sh && popd pushd depends && ./install_webp.sh && popd

View File

@ -5,4 +5,4 @@ set -e
python -m pytest -v -x --cov PIL --cov Tests --cov-report term Tests python -m pytest -v -x --cov PIL --cov Tests --cov-report term Tests
# Docs # Docs
if [ "$TRAVIS_PYTHON_VERSION" == "3.7" ]; then make doccheck; fi if [ "$TRAVIS_PYTHON_VERSION" == "3.8" ]; then make doccheck; fi

View File

@ -5,6 +5,9 @@ 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 - Change default resize resampling filter from NEAREST to BICUBIC #4255
[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

@ -42,7 +42,7 @@ clean:
-rm -rf $(BUILDDIR)/* -rm -rf $(BUILDDIR)/*
html: html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html $(SPHINXBUILD) -b html -W --keep-going $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo @echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html." @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."

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,33 +322,33 @@ 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 python-tk \ libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python3-tk \
libharfbuzz-dev libfribidi-dev libharfbuzz-dev libfribidi-dev
Then see ``depends/install_raqm.sh`` to install libraqm. 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

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

View File

@ -1127,8 +1127,7 @@ class Image:
Configures the image file loader so it returns a version of the Configures the image file loader so it returns a version of the
image that as closely as possible matches the given mode and image that as closely as possible matches the given mode and
size. For example, you can use this method to convert a color size. For example, you can use this method to convert a color
JPEG to greyscale while loading it, or to extract a 128x192 JPEG to greyscale while loading it.
version from a PCD file.
If any changes are made, returns a tuple with the chosen ``mode`` and If any changes are made, returns a tuple with the chosen ``mode`` and
``box`` with coordinates of the original image within the altered one. ``box`` with coordinates of the original image within the altered one.
@ -1138,7 +1137,7 @@ class Image:
effect. effect.
Note: This method is not implemented for most images. It is Note: This method is not implemented for most images. It is
currently implemented only for JPEG and PCD images. currently implemented only for JPEG and MPO images.
:param mode: The requested mode. :param mode: The requested mode.
:param size: The requested size. :param size: The requested size.
@ -2187,12 +2186,14 @@ class Image:
It may also be an :py:class:`~PIL.Image.ImageTransformHandler` It may also be an :py:class:`~PIL.Image.ImageTransformHandler`
object:: object::
class Example(Image.ImageTransformHandler): class Example(Image.ImageTransformHandler):
def transform(size, method, data, resample, fill=1): def transform(size, method, data, resample, fill=1):
# Return result # Return result
It may also be an object with a :py:meth:`~method.getdata` method It may also be an object with a :py:meth:`~method.getdata` method
that returns a tuple supplying new **method** and **data** values:: that returns a tuple supplying new **method** and **data** values::
class Example(object): class Example(object):
def getdata(self): def getdata(self):
method = Image.EXTENT method = Image.EXTENT

View File

@ -234,6 +234,7 @@ def pad(image, size, method=Image.BICUBIC, color=None, centering=(0.5, 0.5)):
: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.
(0.5, 0.5) will keep the image centered (0.5, 0.5) will keep the image centered
(0, 0) will keep the image aligned to the top left (0, 0) will keep the image aligned to the top left
(1, 1) will keep the image aligned to the bottom (1, 1) will keep the image aligned to the bottom