pythonpython-imaging-library

In Python, Python Image Library 1.1.6, how can I expand the canvas without resizing?


I am probably looking for the wrong thing in the handbook, but I am looking to take an image object and expand it without resizing (stretching/squishing) the original image.

Toy example: imagine a blue rectangle, 200 x 100, then I perform some operation and I have a new image object, 400 x 300, consisting of a white background upon which a 200 x 100 blue rectangle rests. Bonus if I can control in which direction this expands, or the new background color, etc.

Essentially, I have an image to which I will be adding iteratively, and I do not know what size it will be at the outset.

I suppose it would be possible for me to grab the original object, make a new, slightly larger object, paste the original on there, draw a little more, then repeat. It seems like it might be computationally expensive. However, I thought there would be a function for this, as I assume it is a common operation. Perhaps I assumed wrong.


Solution

  • The ImageOps.expand function will expand the image, but it adds the same amount of pixels in each direction.

    The best way is simply to make a new image and paste:

    newImage = Image.new(mode, (newWidth,newHeight))
    newImage.paste(srcImage, (x1,y1,x1+oldWidth,y1+oldHeight))
    

    If performance is an issue, make your original image bigger than needed and crop it after the drawing is done.