mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-05-02 23:13:40 +03:00
Merge branch 'master' into python-m-pip-install
This commit is contained in:
commit
d3c26fac97
|
@ -3,7 +3,7 @@
|
||||||
codecov:
|
codecov:
|
||||||
# Avoid "Missing base report" due to committing CHANGES.rst with "[CI skip]"
|
# Avoid "Missing base report" due to committing CHANGES.rst with "[CI skip]"
|
||||||
# https://github.com/codecov/support/issues/363
|
# https://github.com/codecov/support/issues/363
|
||||||
# https://docs.codecov.io/v4.3.6/docs/comparing-commits
|
# https://docs.codecov.io/docs/comparing-commits
|
||||||
allow_coverage_offsets: true
|
allow_coverage_offsets: true
|
||||||
|
|
||||||
token: 6dafc396-e7f5-4221-a38a-8b07a49fbdae
|
token: 6dafc396-e7f5-4221-a38a-8b07a49fbdae
|
||||||
|
|
3
.github/workflows/lint.yml
vendored
3
.github/workflows/lint.yml
vendored
|
@ -20,6 +20,9 @@ jobs:
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
|
|
||||||
|
- name: Build system information
|
||||||
|
run: python .github/workflows/system-info.py
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
python -m pip install --upgrade pip
|
python -m pip install --upgrade pip
|
||||||
|
|
25
.github/workflows/system-info.py
vendored
Normal file
25
.github/workflows/system-info.py
vendored
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
"""
|
||||||
|
Print out some handy system info like Travis CI does.
|
||||||
|
|
||||||
|
This sort of info is missing from GitHub Actions.
|
||||||
|
|
||||||
|
Requested here:
|
||||||
|
https://github.com/actions/virtual-environments/issues/79
|
||||||
|
"""
|
||||||
|
import os
|
||||||
|
import platform
|
||||||
|
import sys
|
||||||
|
|
||||||
|
print("Build system information")
|
||||||
|
print()
|
||||||
|
|
||||||
|
print("sys.version\t\t", sys.version.split("\n"))
|
||||||
|
print("os.name\t\t\t", os.name)
|
||||||
|
print("sys.platform\t\t", sys.platform)
|
||||||
|
print("platform.system()\t", platform.system())
|
||||||
|
print("platform.machine()\t", platform.machine())
|
||||||
|
print("platform.platform()\t", platform.platform())
|
||||||
|
print("platform.version()\t", platform.version())
|
||||||
|
print("platform.uname()\t", platform.uname())
|
||||||
|
if sys.platform == "darwin":
|
||||||
|
print("platform.mac_ver()\t", platform.mac_ver())
|
3
.github/workflows/test-docker.yml
vendored
3
.github/workflows/test-docker.yml
vendored
|
@ -29,6 +29,9 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v1
|
||||||
|
|
||||||
|
- name: Build system information
|
||||||
|
run: python .github/workflows/system-info.py
|
||||||
|
|
||||||
- name: Docker pull
|
- name: Docker pull
|
||||||
run: |
|
run: |
|
||||||
docker pull pythonpillow/${{ matrix.docker }}:${{ matrix.dockerTag }}
|
docker pull pythonpillow/${{ matrix.docker }}:${{ matrix.dockerTag }}
|
||||||
|
|
3
.github/workflows/test-windows.yml
vendored
3
.github/workflows/test-windows.yml
vendored
|
@ -70,6 +70,9 @@ jobs:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
architecture: ${{ matrix.architecture }}
|
architecture: ${{ matrix.architecture }}
|
||||||
|
|
||||||
|
- name: Build system information
|
||||||
|
run: python .github/workflows/system-info.py
|
||||||
|
|
||||||
- name: pip install wheel pytest pytest-cov
|
- name: pip install wheel pytest pytest-cov
|
||||||
run: |
|
run: |
|
||||||
"%pythonLocation%\python.exe" -m pip install wheel pytest pytest-cov
|
"%pythonLocation%\python.exe" -m pip install wheel pytest pytest-cov
|
||||||
|
|
3
.github/workflows/test.yml
vendored
3
.github/workflows/test.yml
vendored
|
@ -55,6 +55,9 @@ jobs:
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
|
|
||||||
|
- name: Build system information
|
||||||
|
run: python .github/workflows/system-info.py
|
||||||
|
|
||||||
- name: Install Linux dependencies
|
- name: Install Linux dependencies
|
||||||
if: startsWith(matrix.os, 'ubuntu')
|
if: startsWith(matrix.os, 'ubuntu')
|
||||||
run: |
|
run: |
|
||||||
|
|
|
@ -5,6 +5,15 @@ Changelog (Pillow)
|
||||||
7.0.0 (unreleased)
|
7.0.0 (unreleased)
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
- Better thumbnail aspect ratio preservation #4256
|
||||||
|
[homm]
|
||||||
|
|
||||||
|
- Add La mode packing and unpacking #4248
|
||||||
|
[homm]
|
||||||
|
|
||||||
|
- Include tests in coverage reports #4173
|
||||||
|
[hugovk]
|
||||||
|
|
||||||
- Handle broken Photoshop data #4239
|
- Handle broken Photoshop data #4239
|
||||||
[radarhere]
|
[radarhere]
|
||||||
|
|
||||||
|
|
|
@ -5,37 +5,48 @@ from .helper import PillowTestCase, hopper
|
||||||
|
|
||||||
class TestImageThumbnail(PillowTestCase):
|
class TestImageThumbnail(PillowTestCase):
|
||||||
def test_sanity(self):
|
def test_sanity(self):
|
||||||
|
|
||||||
im = hopper()
|
im = hopper()
|
||||||
im.thumbnail((100, 100))
|
self.assertIsNone(im.thumbnail((100, 100)))
|
||||||
|
|
||||||
self.assert_image(im, im.mode, (100, 100))
|
self.assertEqual(im.size, (100, 100))
|
||||||
|
|
||||||
def test_aspect(self):
|
def test_aspect(self):
|
||||||
|
im = Image.new("L", (128, 128))
|
||||||
im = hopper()
|
|
||||||
im.thumbnail((100, 100))
|
im.thumbnail((100, 100))
|
||||||
self.assert_image(im, im.mode, (100, 100))
|
self.assertEqual(im.size, (100, 100))
|
||||||
|
|
||||||
im = hopper().resize((128, 256))
|
im = Image.new("L", (128, 256))
|
||||||
im.thumbnail((100, 100))
|
im.thumbnail((100, 100))
|
||||||
self.assert_image(im, im.mode, (50, 100))
|
self.assertEqual(im.size, (50, 100))
|
||||||
|
|
||||||
im = hopper().resize((128, 256))
|
im = Image.new("L", (128, 256))
|
||||||
im.thumbnail((50, 100))
|
im.thumbnail((50, 100))
|
||||||
self.assert_image(im, im.mode, (50, 100))
|
self.assertEqual(im.size, (50, 100))
|
||||||
|
|
||||||
im = hopper().resize((256, 128))
|
im = Image.new("L", (256, 128))
|
||||||
im.thumbnail((100, 100))
|
im.thumbnail((100, 100))
|
||||||
self.assert_image(im, im.mode, (100, 50))
|
self.assertEqual(im.size, (100, 50))
|
||||||
|
|
||||||
im = hopper().resize((256, 128))
|
im = Image.new("L", (256, 128))
|
||||||
im.thumbnail((100, 50))
|
im.thumbnail((100, 50))
|
||||||
self.assert_image(im, im.mode, (100, 50))
|
self.assertEqual(im.size, (100, 50))
|
||||||
|
|
||||||
im = hopper().resize((128, 128))
|
im = Image.new("L", (128, 128))
|
||||||
im.thumbnail((100, 100))
|
im.thumbnail((100, 100))
|
||||||
self.assert_image(im, im.mode, (100, 100))
|
self.assertEqual(im.size, (100, 100))
|
||||||
|
|
||||||
|
im = Image.new("L", (256, 162)) # ratio is 1.5802469136
|
||||||
|
im.thumbnail((33, 33))
|
||||||
|
self.assertEqual(im.size, (33, 21)) # ratio is 1.5714285714
|
||||||
|
|
||||||
|
im = Image.new("L", (162, 256)) # ratio is 0.6328125
|
||||||
|
im.thumbnail((33, 33))
|
||||||
|
self.assertEqual(im.size, (21, 33)) # ratio is 0.6363636364
|
||||||
|
|
||||||
|
def test_float(self):
|
||||||
|
im = Image.new("L", (128, 128))
|
||||||
|
im.thumbnail((99.9, 99.9))
|
||||||
|
self.assertEqual(im.size, (100, 100))
|
||||||
|
|
||||||
def test_no_resize(self):
|
def test_no_resize(self):
|
||||||
# Check that draft() can resize the image to the destination size
|
# Check that draft() can resize the image to the destination size
|
||||||
|
@ -46,4 +57,4 @@ class TestImageThumbnail(PillowTestCase):
|
||||||
# Test thumbnail(), where only draft() is necessary to resize the image
|
# Test thumbnail(), where only draft() is necessary to resize the image
|
||||||
with Image.open("Tests/images/hopper.jpg") as im:
|
with Image.open("Tests/images/hopper.jpg") as im:
|
||||||
im.thumbnail((64, 64))
|
im.thumbnail((64, 64))
|
||||||
self.assert_image(im, im.mode, (64, 64))
|
self.assertEqual(im.size, (64, 64))
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
pkg -y install python python-dev ndk-sysroot clang make \
|
pkg install -y python ndk-sysroot clang make \
|
||||||
libjpeg-turbo-dev
|
libjpeg-turbo
|
||||||
|
|
||||||
|
|
|
@ -169,15 +169,15 @@ Filters comparison table
|
||||||
| Filter | Downscaling | Upscaling | Performance |
|
| Filter | Downscaling | Upscaling | Performance |
|
||||||
| | quality | quality | |
|
| | quality | quality | |
|
||||||
+============+=============+===========+=============+
|
+============+=============+===========+=============+
|
||||||
|``NEAREST`` | | | ⭐⭐⭐⭐⭐ |
|
|``NEAREST`` | | | ⭐⭐⭐⭐⭐ |
|
||||||
+------------+-------------+-----------+-------------+
|
+------------+-------------+-----------+-------------+
|
||||||
|``BOX`` | ⭐ | | ⭐⭐⭐⭐ |
|
|``BOX`` | ⭐ | | ⭐⭐⭐⭐ |
|
||||||
+------------+-------------+-----------+-------------+
|
+------------+-------------+-----------+-------------+
|
||||||
|``BILINEAR``| ⭐ | ⭐ | ⭐⭐⭐ |
|
|``BILINEAR``| ⭐ | ⭐ | ⭐⭐⭐ |
|
||||||
+------------+-------------+-----------+-------------+
|
+------------+-------------+-----------+-------------+
|
||||||
|``HAMMING`` | ⭐⭐ | | ⭐⭐⭐ |
|
|``HAMMING`` | ⭐⭐ | | ⭐⭐⭐ |
|
||||||
+------------+-------------+-----------+-------------+
|
+------------+-------------+-----------+-------------+
|
||||||
|``BICUBIC`` | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
|
|``BICUBIC`` | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
|
||||||
+------------+-------------+-----------+-------------+
|
+------------+-------------+-----------+-------------+
|
||||||
|``LANCZOS`` | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐ |
|
|``LANCZOS`` | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐ |
|
||||||
+------------+-------------+-----------+-------------+
|
+------------+-------------+-----------+-------------+
|
||||||
|
|
|
@ -15,24 +15,25 @@ Notes
|
||||||
|
|
||||||
.. note:: Pillow is supported on the following Python versions
|
.. note:: Pillow is supported on the following Python versions
|
||||||
|
|
||||||
|
|
||||||
+-------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
+-------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||||
|**Python** |**2.4**|**2.5**|**2.6**|**2.7**|**3.2**|**3.3**|**3.4**|**3.5**|**3.6**|**3.7**|**3.8**|
|
|**Python** |**3.8**|**3.7**|**3.6**|**3.5**|**3.4**|**3.3**|**3.2**|**2.7**|**2.6**|**2.5**|**2.4**|
|
||||||
+-------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
+-------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||||
|Pillow < 2 | Yes | Yes | Yes | Yes | | | | | | | |
|
|Pillow >= 7 | Yes | Yes | Yes | Yes | | | | | | | |
|
||||||
+-------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
+-------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||||
|Pillow 2 - 3 | | | Yes | Yes | Yes | Yes | Yes | Yes | | | |
|
|Pillow 6.2.1 | Yes | Yes | Yes | Yes | | | | Yes | | | |
|
||||||
+-------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
+-------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||||
|Pillow 4 | | | | Yes | | Yes | Yes | Yes | Yes | | |
|
|Pillow 6.0 - 6.2.0 | | Yes | Yes | Yes | | | | Yes | | | |
|
||||||
+-------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
+-------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||||
|Pillow 5.0 - 5.1 | | | | Yes | | | Yes | Yes | Yes | | |
|
|Pillow 5.2 - 5.4 | | Yes | Yes | Yes | Yes | | | Yes | | | |
|
||||||
+-------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
+-------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||||
|Pillow 5.2 - 5.4 | | | | Yes | | | Yes | Yes | Yes | Yes | |
|
|Pillow 5.0 - 5.1 | | | Yes | Yes | Yes | | | Yes | | | |
|
||||||
+-------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
+-------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||||
|Pillow 6.0 - 6.2.0 | | | | Yes | | | | Yes | Yes | Yes | |
|
|Pillow 4 | | | Yes | Yes | Yes | Yes | | Yes | | | |
|
||||||
+-------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
+-------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||||
|Pillow 6.2.1 | | | | Yes | | | | Yes | Yes | Yes | Yes |
|
|Pillow 2 - 3 | | | | Yes | Yes | Yes | Yes | Yes | Yes | | |
|
||||||
+-------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
+-------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||||
|Pillow >= 7 | | | | | | | | Yes | Yes | Yes | Yes |
|
|Pillow < 2 | | | | | | | | Yes | Yes | Yes | Yes |
|
||||||
+-------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
+-------------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||||
|
|
||||||
Basic Installation
|
Basic Installation
|
||||||
|
@ -190,7 +191,7 @@ Many of Pillow's features require external libraries:
|
||||||
libraqm.
|
libraqm.
|
||||||
* libraqm is dynamically loaded in Pillow 5.0.0 and above, so support
|
* libraqm is dynamically loaded in Pillow 5.0.0 and above, so support
|
||||||
is available if all the libraries are installed.
|
is available if all the libraries are installed.
|
||||||
* Windows support: Raqm support is currently unsupported on Windows.
|
* Windows support: Raqm is not included in prebuilt wheels
|
||||||
|
|
||||||
Once you have installed the prerequisites, run::
|
Once you have installed the prerequisites, run::
|
||||||
|
|
||||||
|
@ -364,8 +365,8 @@ 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 -y install python python-dev ndk-sysroot clang make \
|
pkg install -y python ndk-sysroot clang make \
|
||||||
libjpeg-turbo-dev
|
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.
|
||||||
|
|
||||||
|
@ -413,10 +414,14 @@ These platforms are built and tested for every change.
|
||||||
+----------------------------------+--------------------------+-----------------------+
|
+----------------------------------+--------------------------+-----------------------+
|
||||||
| Ubuntu Linux 16.04 LTS | 3.5, 3.6, 3.7, 3.8, PyPy3|x86-64 |
|
| Ubuntu Linux 16.04 LTS | 3.5, 3.6, 3.7, 3.8, PyPy3|x86-64 |
|
||||||
+----------------------------------+--------------------------+-----------------------+
|
+----------------------------------+--------------------------+-----------------------+
|
||||||
| Windows Server 2012 R2 | 3.5, 3.6, 3.7, 3.8 |x86, x86-64 |
|
| Windows Server 2012 R2 | 3.5, 3.8 |x86, x86-64 |
|
||||||
| +--------------------------+-----------------------+
|
| +--------------------------+-----------------------+
|
||||||
| | PyPy3, 3.7/MinGW |x86 |
|
| | PyPy3, 3.7/MinGW |x86 |
|
||||||
+----------------------------------+--------------------------+-----------------------+
|
+----------------------------------+--------------------------+-----------------------+
|
||||||
|
| Windows Server 2019 | 3.5, 3.6, 3.7, 3.8 |x86, x86-64 |
|
||||||
|
| +--------------------------+-----------------------+
|
||||||
|
| | PyPy3 |x86 |
|
||||||
|
+----------------------------------+--------------------------+-----------------------+
|
||||||
|
|
||||||
|
|
||||||
Other Platforms
|
Other Platforms
|
||||||
|
|
|
@ -2137,11 +2137,11 @@ class Image:
|
||||||
# preserve aspect ratio
|
# preserve aspect ratio
|
||||||
x, y = self.size
|
x, y = self.size
|
||||||
if x > size[0]:
|
if x > size[0]:
|
||||||
y = int(max(y * size[0] / x, 1))
|
y = max(round(y * size[0] / x), 1)
|
||||||
x = int(size[0])
|
x = round(size[0])
|
||||||
if y > size[1]:
|
if y > size[1]:
|
||||||
x = int(max(x * size[1] / y, 1))
|
x = max(round(x * size[1] / y), 1)
|
||||||
y = int(size[1])
|
y = round(size[1])
|
||||||
size = x, y
|
size = x, y
|
||||||
|
|
||||||
if size == self.size:
|
if size == self.size:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user