[英]How do you composite an image onto another image with PIL in Python?
我需要拍摄一张图像并将其放置在新生成的白色背景上,以便将其转换为可下载的桌面墙纸。 所以这个过程会进行:
在 PIL 中,我看到了ImageDraw
对象,但没有任何迹象表明它可以将现有的图像数据绘制到另一个图像上。 任何人都可以推荐的建议或链接?
这可以通过 Image 实例的paste
方法来完成:
from PIL import Image
img = Image.open('/path/to/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 教程中学习
基于 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(文档、 GitHub 、 PyPI )而不是 python-imaging,因为 Pillow 可与 Python 2.X 和 Python 3.X 一起使用。
这是做类似的事情
我开始的地方是在 Photoshop 中生成“白色背景”并将其导出为 PNG 文件。 那就是我得到 im1 的地方(图 1)。 然后使用粘贴功能,因为它更容易。
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()
显示您的新图像
也许为时已晚,但对于此类图像操作,我们确实在具有原始图像的模型中使用了ImageSpecField
。
Image.blend()
? [链接]
或者,更好的是, Image.paste()
,相同的链接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.