你如何在Python中用PIL将图像合成到另一个图像上?

我需要拍摄一张图像并将其放到新的生成的白色背景上,以便将其转换为可下载的桌面壁纸。 所以这个过程将会是:

  1. 生成1440×900尺寸的全新白色图像
  2. 将现有图像置于顶部,居中
  3. 保存为单个图像

在PIL中,我看到了ImageDraw对象,但没有任何迹象表明它可以将现有的图像数据绘制到另一个图像上。 build议或链接任何人都可以推荐?

这可以通过一个Image实例的paste方法来完成:

 from PIL import Image img = Image.open('/pathto/file', 'r') img_w, img_h = img.size background = Image.new('RGBA', (1440, 900), (255, 255, 255, 255)) bg_w, bg_h = background.size offset = ((bg_w - img_w) / 2, (bg_h - img_h) / 2) background.paste(img, offset) background.save('out.png') 

这和许多其他PIL技巧可以在Nadia Alramli的PIL教程中find

基于unutbus的回答:

 #!/usr/bin/env python from PIL import Image import math def resize_canvas(old_image_path="314.jpg", new_image_path="save.jpg", canvas_width=500, canvas_height=500): """ Place one image on another image. Resize the canvas of old_image_path and store the new image in new_image_path. Center the image on the new canvas. """ im = Image.open(old_image_path) old_width, old_height = im.size # Center the image x1 = int(math.floor((canvas_width - old_width) / 2)) y1 = int(math.floor((canvas_height - old_height) / 2)) mode = im.mode if len(mode) == 1: # L, 1 new_background = (255) if len(mode) == 3: # RGB new_background = (255, 255, 255) if len(mode) == 4: # RGBA, CMYK new_background = (255, 255, 255, 255) newImage = Image.new(mode, (canvas_width, canvas_height), new_background) newImage.paste(im, (x1, y1, x1 + old_width, y1 + old_height)) newImage.save(new_image_path) resize_canvas() 

记住使用Pillow( Documentation , GitHub , PyPI )而不是python-imaging,因为Pillow使用Python 2.X和Python 3.X.

Image.blend() ? [ 链接 ]

或者,更好的是, Image.paste() ,相同的链接。

也许为时已晚,但对于这样的图像操作,我们在原始图像的模型中使用ImageSpecField [ link ]。

这是做类似的事情

我在哪里开始是通过在Photoshop中生成“白色背景”并将其导出为PNG文件。 那是我得到im1(图1)。 然后使用粘贴function,因为它更容易。

 from PIL import Image im1 = Image.open('image/path/1.png') im2 = Image.open('image/path/2.png') area = (40, 1345, 551, 1625) im1.paste(im2, area) l>(511+40) l>(280+1345) | l> From 0 (move, 1345px down) -> From 0 (top left, move 40 pixels right) 

Okay so where did these #'s come from? (40, 1345, 551, 1625) im2.size (511, 280) Because I added 40 right and 1345 down (40, 1345, 511, 280) I must add them to the original image size which = (40, 1345, 551, 1625)

 im1.show() 

展现你的新形象