Skip to content Skip to sidebar Skip to footer

Pil: Overlaying Images With Different Dimensions And Aspect Ratios

I've been attempting to overlay two images in python to match coordinates, the top left and bottom right corners have the same coordinates and their aspects are almost identical ba

Solution 1:

A solution upfront.

Background image

width/height/ratio: 300 / 375 / 0.800

enter image description here

Foreground image

width/height/ratio: 400 / 464 / 0.862

enter image description here

Overlay

from PIL import Image

imbg = Image.open("bg.png")
imfg = Image.open("fg.png")
imbg_width, imbg_height = imbg.size
imfg_resized = imfg.resize((imbg_width, imbg_height), Image.LANCZOS)
imbg.paste(imfg_resized, None, imfg_resized)
imbg.save("overlay.png")

enter image description here

Discussion

The most important information you have given in your question were:

  • the aspect ratios of your foreground and background images are not equal, but similar
  • the top left and bottom right corners of both images need to be aligned in the end.

The conclusion from these points is: the aspect ratio of one of the images has to change. This can be achieved with the resize() method (not with thumbnail(), as explained below). To summarize, the goal simply is:

Resize the image with larger dimensions (foreground image) to the exact dimensions of the smaller background image. That is, do not necessarily maintain the aspect ratio of the foreground image.

That is what the code above is doing.

Two comments on your approach:

First of all, I recommend using the newest release of Pillow (Pillow is the continuation project of PIL, it is API-compatible). In the 2.7 release they have largely improved the image re-scaling quality. The documentation can be found at http://pillow.readthedocs.org/en/latest/reference.

Then, you obviously need to take control of how the aspect ratio of both images evolves throughout your program. thumbnail(), for instance, does not alter the aspect ratio of the image, even if your size tuple does not have the same aspect ratio as the original image. Quote from the thumbnail() docs:

This method modifies the image to contain a thumbnail version of itself, no larger than the given size. This method calculates an appropriate thumbnail size to preserve the aspect of the image

So, I am not sure where you were going exactly with your (643,597) tuple and if you are possibly relying on the thumbnail to have this exact size afterwards.

Post a Comment for "Pil: Overlaying Images With Different Dimensions And Aspect Ratios"