Paste another image into an image with Python, Pillow
The Image
module of the image processing library Pillow (PIL) of Python provides paste()
for pasting an image
Please refer to the following article for the installation and basic usage of Pillow (PIL).
This article describes the following contents.
- Normal paste
- Specify the position to paste
- Use mask image
Import Image
from PIL
and open the base (background) image and the image to paste.
ImageDraw
and ImageFilter
are used to set the mask image described last. You may omit it if you simply paste it.
from PIL import Image, ImageDraw, ImageFilter
im1 = Image.open('data/src/rocket.jpg')
im2 = Image.open('data/src/lena.jpg')
Normal paste
Call the paste()
method from the background image and set the image to paste.
By default, the image is pasted at the position where the upper left of the paste image is the origin (upper left) of the base image.
im1.paste(im2)
im1.save('data/dst/rocket_pillow_paste.jpg', quality=95)
paste()
overwrites the base image itself, so if you want to keep the original image, use the copied image with copy()
.
im1 = Image.open('data/src/rocket.jpg')
im2 = Image.open('data/src/lena.jpg')
back_im = im1.copy()
back_im.paste(im2)
back_im.save('data/dst/rocket_pillow_paste.jpg', quality=95)
Specify the position to paste
The position to paste is specified by a tuple (x coordinate in upper left, y coordinate in upper left)
in the second parameter box
.
back_im = im1.copy()
back_im.paste(im2, (100, 50))
back_im.save('data/dst/rocket_pillow_paste_pos.jpg', quality=95)
If the pasted image extends outside the region of the base image, the area that extends is ignored.
back_im = im1.copy()
back_im.paste(im2, (400, 100))
back_im.save('data/dst/rocket_pillow_paste_out.jpg', quality=95)
Use mask image
If a mask image is specified as the third parameter mask
, the pasted image can be cut out and pasted not only in a rectangle but in various shapes.
The image that can be used as a mask image has the same size as the pasted image and the following three types of mode
.
1
: 1 bit image (binary image)L
: 8-bit grayscale imageRGBA
: Image with alpha channel
When the mask image is 8-bit grayscale (mode='L'
), the base image is output when the value of the mask image is 0 (black), and the pasted image is output when 255 (white). For other values, the two images are blended according to the value.
Draw a white circle on a black background with the ImageDraw
module to generate a mask image.
mask_im = Image.new("L", im2.size, 0)
draw = ImageDraw.Draw(mask_im)
draw.ellipse((140, 50, 260, 170), fill=255)
mask_im.save('data/dst/mask_circle.jpg', quality=95)
See the following article for drawing with Pillow.
Paste processing is performed using this image as a mask. You can mask the pasted image into a circle.
back_im = im1.copy()
back_im.paste(im2, (0, 0), mask_im)
back_im.save('data/dst/rocket_pillow_paste_mask_circle.jpg', quality=95)
When the mask image is blurred using the ImageFilter
module, the boundaries can be blended and pasted.
mask_im_blur = mask_im.filter(ImageFilter.GaussianBlur(10))
mask_im_blur.save('data/dst/mask_circle_blur.jpg', quality=95)
back_im = im1.copy()
back_im.paste(im2, (0, 0), mask_im_blur)
back_im.save('data/dst/rocket_pillow_paste_mask_circle_blur.jpg', quality=95)
Not limited to geometric figures drawn by ImageDraw
, they can be pasted in any shape as long as a mask image is prepared.
Try using a black and white horse-shaped image (scikit-image sample: skimage.data.horse()).
After the image is read by open()
, it is adjusted to the size of the pasted image by resize()
, and the mode is converted to 'L'
(grayscale) by convert()
.
mask_im = Image.open('data/src/horse.png').resize(im2.size).convert('L')
back_im = im1.copy()
back_im.paste(im2, (100, 50), mask_im)
back_im.save('data/dst/rocket_pillow_paste_mask_horse.jpg', quality=95)
Although not a good example, it is pasted in a complicated shape. If you prepare images like star or heart shape, it can be used in various situations.
If you want to reverse the black and white of the mask image, please refer to the following article.