Skip to content

Commit 35d6a66

Browse files
authored
Merge pull request #7699 from radarhere/perspective
2 parents ab262db + 9318216 commit 35d6a66

File tree

4 files changed

+49
-15
lines changed

4 files changed

+49
-15
lines changed

Tests/test_image_transform.py

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,25 @@
1010

1111
class TestImageTransform:
1212
def test_sanity(self):
13-
im = Image.new("L", (100, 100))
14-
15-
seq = tuple(range(10))
16-
17-
transform = ImageTransform.AffineTransform(seq[:6])
18-
im.transform((100, 100), transform)
19-
transform = ImageTransform.ExtentTransform(seq[:4])
20-
im.transform((100, 100), transform)
21-
transform = ImageTransform.QuadTransform(seq[:8])
22-
im.transform((100, 100), transform)
23-
transform = ImageTransform.MeshTransform([(seq[:4], seq[:8])])
24-
im.transform((100, 100), transform)
13+
im = hopper()
14+
15+
for transform in (
16+
ImageTransform.AffineTransform((1, 0, 0, 0, 1, 0)),
17+
ImageTransform.PerspectiveTransform((1, 0, 0, 0, 1, 0, 0, 0)),
18+
ImageTransform.ExtentTransform((0, 0) + im.size),
19+
ImageTransform.QuadTransform(
20+
(0, 0, 0, im.height, im.width, im.height, im.width, 0)
21+
),
22+
ImageTransform.MeshTransform(
23+
[
24+
(
25+
(0, 0) + im.size,
26+
(0, 0, 0, im.height, im.width, im.height, im.width, 0),
27+
)
28+
]
29+
),
30+
):
31+
assert_image_equal(im, im.transform(im.size, transform))
2532

2633
def test_info(self):
2734
comment = b"File written by Adobe Photoshop\xa8 4.0"

docs/reference/ImageTransform.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ The :py:mod:`~PIL.ImageTransform` module contains implementations of
1919
:undoc-members:
2020
:show-inheritance:
2121

22+
.. autoclass:: PerspectiveTransform
23+
:members:
24+
:undoc-members:
25+
:show-inheritance:
26+
2227
.. autoclass:: ExtentTransform
2328
:members:
2429
:undoc-members:

docs/releasenotes/10.3.0.rst

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,12 @@ TODO
2626
API Additions
2727
=============
2828

29-
TODO
30-
^^^^
29+
Added PerspectiveTransform
30+
^^^^^^^^^^^^^^^^^^^^^^^^^^
3131

32-
TODO
32+
:py:class:`~PIL.ImageTransform.PerspectiveTransform` has been added, meaning
33+
that all of the :py:data:`~PIL.Image.Transform` values now have a corresponding
34+
subclass of :py:class:`~PIL.ImageTransform.Transform`.
3335

3436
Security
3537
========

src/PIL/ImageTransform.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,26 @@ class AffineTransform(Transform):
6363
method = Image.Transform.AFFINE
6464

6565

66+
class PerspectiveTransform(Transform):
67+
"""
68+
Define a perspective image transform.
69+
70+
This function takes an 8-tuple (a, b, c, d, e, f, g, h). For each pixel
71+
(x, y) in the output image, the new value is taken from a position
72+
((a x + b y + c) / (g x + h y + 1), (d x + e y + f) / (g x + h y + 1)) in
73+
the input image, rounded to nearest pixel.
74+
75+
This function can be used to scale, translate, rotate, and shear the
76+
original image.
77+
78+
See :py:meth:`.Image.transform`
79+
80+
:param matrix: An 8-tuple (a, b, c, d, e, f, g, h).
81+
"""
82+
83+
method = Image.Transform.PERSPECTIVE
84+
85+
6686
class ExtentTransform(Transform):
6787
"""
6888
Define a transform to extract a subregion from an image.

0 commit comments

Comments
 (0)