Skip to content

Commit

Permalink
Merge pull request #6522 from bibinhashley/ImageOps.contain-function-…
Browse files Browse the repository at this point in the history
…issue-in-finding-new-size
  • Loading branch information
hugovk committed Sep 21, 2022
2 parents 920bcec + cf4017b commit f98fde7
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 4 deletions.
19 changes: 19 additions & 0 deletions Tests/test_imageops.py
Expand Up @@ -110,6 +110,16 @@ def test_contain(new_size):
assert new_im.size == (256, 256)


def test_contain_round():
im = Image.new("1", (43, 63), 1)
new_im = ImageOps.contain(im, (5, 7))
assert new_im.width == 5

im = Image.new("1", (63, 43), 1)
new_im = ImageOps.contain(im, (7, 5))
assert new_im.height == 5


def test_pad():
# Same ratio
im = hopper()
Expand All @@ -130,6 +140,15 @@ def test_pad():
)


def test_pad_round():
im = Image.new("1", (1, 1), 1)
new_im = ImageOps.pad(im, (4, 1))
assert new_im.load()[2, 0] == 1

new_im = ImageOps.pad(im, (1, 4))
assert new_im.load()[0, 2] == 1


def test_pil163():
# Division by zero in equalize if < 255 pixels in image (@PIL163)

Expand Down
8 changes: 4 additions & 4 deletions src/PIL/ImageOps.py
Expand Up @@ -255,11 +255,11 @@ def contain(image, size, method=Image.Resampling.BICUBIC):

if im_ratio != dest_ratio:
if im_ratio > dest_ratio:
new_height = int(image.height / image.width * size[0])
new_height = round(image.height / image.width * size[0])
if new_height != size[1]:
size = (size[0], new_height)
else:
new_width = int(image.width / image.height * size[1])
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)
Expand Down Expand Up @@ -292,10 +292,10 @@ def pad(image, size, method=Image.Resampling.BICUBIC, color=None, centering=(0.5
else:
out = Image.new(image.mode, size, color)
if resized.width != size[0]:
x = int((size[0] - resized.width) * max(0, min(centering[0], 1)))
x = round((size[0] - resized.width) * max(0, min(centering[0], 1)))
out.paste(resized, (x, 0))
else:
y = int((size[1] - resized.height) * max(0, min(centering[1], 1)))
y = round((size[1] - resized.height) * max(0, min(centering[1], 1)))
out.paste(resized, (0, y))
return out

Expand Down

0 comments on commit f98fde7

Please sign in to comment.