Skip to content

Commit

Permalink
Added ImageOps cover method
Browse files Browse the repository at this point in the history
  • Loading branch information
radarhere committed Sep 21, 2023
1 parent 7a633e3 commit b9fde7b
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 1 deletion.
17 changes: 17 additions & 0 deletions Tests/test_imageops.py
Expand Up @@ -39,6 +39,9 @@ def test_sanity():
ImageOps.contain(hopper("L"), (128, 128))
ImageOps.contain(hopper("RGB"), (128, 128))

ImageOps.cover(hopper("L"), (128, 128))
ImageOps.cover(hopper("RGB"), (128, 128))

ImageOps.crop(hopper("L"), 1)
ImageOps.crop(hopper("RGB"), 1)

Expand Down Expand Up @@ -119,6 +122,20 @@ def test_contain_round():
assert new_im.height == 5


@pytest.mark.parametrize(
"image_name, expected_size",
(
("colr_bungee.png", (1024, 256)), # landscape
("imagedraw_stroke_multiline.png", (256, 640)), # portrait
("hopper.png", (256, 256)), # square
),
)
def test_cover(image_name, expected_size):
with Image.open("Tests/images/" + image_name) as im:
new_im = ImageOps.cover(im, (256, 256))
assert new_im.size == expected_size


def test_pad():
# Same ratio
im = hopper()
Expand Down
1 change: 1 addition & 0 deletions docs/reference/ImageOps.rst
Expand Up @@ -13,6 +13,7 @@ only work on L and RGB images.
.. autofunction:: autocontrast
.. autofunction:: colorize
.. autofunction:: contain
.. autofunction:: cover
.. autofunction:: pad
.. autofunction:: crop
.. autofunction:: scale
Expand Down
31 changes: 30 additions & 1 deletion src/PIL/ImageOps.py
Expand Up @@ -242,7 +242,7 @@ def contain(image, size, method=Image.Resampling.BICUBIC):
Returns a resized version of the image, set to the maximum width and height
within the requested size, while maintaining the original aspect ratio.
:param image: The image to resize and crop.
:param image: The image to resize.
:param size: The requested output size in pixels, given as a
(width, height) tuple.
:param method: Resampling method to use. Default is
Expand All @@ -266,6 +266,35 @@ def contain(image, size, method=Image.Resampling.BICUBIC):
return image.resize(size, resample=method)


def cover(image, size, method=Image.Resampling.BICUBIC):
"""
Returns a resized version of the image, set to the minimum width and height
within the requested size, while maintaining the original aspect ratio.
:param image: The image to resize.
:param size: The requested output size in pixels, given as a
(width, height) tuple.
:param method: Resampling method to use. Default is
:py:attr:`~PIL.Image.Resampling.BICUBIC`.
See :ref:`concept-filters`.
:return: An image.
"""

im_ratio = image.width / image.height
dest_ratio = size[0] / size[1]

if im_ratio != dest_ratio:
if im_ratio < dest_ratio:
new_height = round(image.height / image.width * size[0])
if new_height != size[1]:
size = (size[0], new_height)
else:
new_width = round(image.width / image.height * size[1])
if new_width != size[0]:
size = (new_width, size[1])
return image.resize(size, resample=method)


def pad(image, size, method=Image.Resampling.BICUBIC, color=None, centering=(0.5, 0.5)):
"""
Returns a resized and padded version of the image, expanded to fill the
Expand Down

0 comments on commit b9fde7b

Please sign in to comment.