【问题标题】:How to merge multiple pictures diagonally into a single one using Python如何使用 Python 将多张图片对角线合并为一张图片
【发布时间】:2019-05-08 23:22:33
【问题描述】:

我正在尝试使用 Python 将多个图像对角地合并为一个图像。 我检查了很多问题,但没有找到与我的需求相似的内容。

我现在能做的就是简单地将文件相互叠加:

from PIL import Image

import numpy as np

img = Image.open("1.png")

background = Image.open("2.png")

background.paste(img, (0, 0), img)

background.save('result.png',"PNG")

这是要测试的图片:

image1image2image3

我需要将图片对角排列以适合最终 900 x 1200 像素大小的白色背景图片。可能它们需要缩小尺寸并适合?至少这是我在 Photoshop 中手动执行的过程(耗时)。

有时可以放 2 张图片,有时可以放 4 或 5 张。

【问题讨论】:

  • 白色背景将覆盖在生成的图像中。您应该改用具有透明背景的 svg 图片。
  • 有趣...所以我必须将 png(透明)转换为 svg 吗?这就是你想说的?
  • 我说第一步是在覆盖它们之前使背景透明,否则你最终会得到一张前面毛衣的图片和很多白色边框。
  • 对不起,为什么?我的文件已经是透明 png 的 .对我来说,最困难的部分是弄清楚如何像最终图片一样排列它们。
  • 我不好,以为背景是白色的。

标签: python numpy image-processing


【解决方案1】:

这应该可以完成工作:

from PIL import Image

images = ['1.png', '2.png', '3.png']

# shift between images
offset = (200, 100)
target_size = (900, 1200)

images = [Image.open(fn) for fn in images]
no_img = len(images)
image_size = [s+no_img*o for s, o in zip(images[0].size, offset)]

#create empty background
combined_image = Image.new('RGBA', image_size)

# paste each image at a slightly shifted position, start at top right
for idx, image in enumerate(images):
  combined_image.paste(image, ((no_img - idx - 1) * offset[0], idx * offset[1]), image)

# crop to non-empty area
combined_image = combined_image.crop(combined_image.getbbox())

# resizing and padding such that it fits 900 x 1200 px
scale = min(target_size[0] / combined_image.size[0], target_size[1] / combined_image.size[1])
combined_image = combined_image.resize((int(combined_image.size[0] * scale), int(combined_image.size[1] * scale)), Image.BICUBIC)
img_w, img_h = combined_image.size

finale_output = Image.new('RGB', target_size, (255, 255, 255))

offset = ((target_size[0] - img_w) // 2, (target_size[1] - img_h) // 2)
finale_output.paste(combined_image, offset, combined_image)

# display
finale_output.show()

编辑:我添加了用于调整大小和填充的代码,以便输出完全符合您想要的大小(同时保持纵横比)。

【讨论】:

  • 太棒了!我正要问你这个问题,因为我尝试使用 4 张图像,最终文件大于 900x1200 !你是我的英雄!
  • 我注意到在你更新你的答案后,最终的结果变得超级清晰:(你知道它可能是什么吗?
  • 重试,我添加了双三次插值,默认是最近邻。有一些库支持 PSD(我只是用谷歌搜索过),但我没有任何经验。考虑使用 TIFF,它也支持图层。
  • 在第 25 行 PIL.Image.BICUBIC 的代码中发现一个小错误 - 删除了 PIL。 - 工作正常!再次感谢您!
  • 是的,我有一个额外的导入。我修好了它。谢谢。
猜你喜欢
  • 2016-03-31
  • 2022-01-19
  • 2011-11-04
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多