【发布时间】:2020-12-27 16:35:48
【问题描述】:
我正在学习如何使用 PIL,我想将 4 个单独的图像连接到一个网格中(全部为 256x256 PNG)。使用 PIL(以及可选的 NumPy)。通过我找到的几个示例,我已经能够通过stacking them all horizontally/vertically 或as a grid when I have exactly 4 images. 连接图像
我现在想要做的是将 最多 4 张图像组合成一个网格,即将 1 到 4 张图像之间的任意位置传递给一个函数。
用例:
我的第一个想法是将图像列表分成两对,水平连接每个结果,然后垂直连接两个结果,但感觉效率低下。
编辑:我已经使用 OpenCV 完成了上述工作,因为它比 PIL 更容易使用。这是我的代码:
images = ["images/img1.png", "images/img2.png", "images/img3.png", "images/img4.png"]
def combine(images):
if len(images) == 1:
img1 = cv2.imread(images[0])
return cv2.imwrite("Combined.png", img1)
elif len(images) == 2:
img1 = cv2.imread(images[0])
img2 = cv2.imread(images[1])
combined_image = cv2.hconcat([img1, img2])
return cv2.imwrite("Combined.png", combined_image)
elif len(images) == 3:
img1 = cv2.imread(images[0])
img2 = cv2.imread(images[1])
img3 = cv2.imread(images[2])
img4 = cv2.imread("images/Blank.png") # Just a transparent PNG
image_row_1 = cv2.hconcat([img1, img2])
image_row_2 = cv2.hconcat([img3, img4])
combined_image = cv2.vconcat([image_row_1, image_row_2])
return cv2.imwrite("Combined.png", combined_image)
elif len(images) == 4:
img1 = cv2.imread(images[0])
img2 = cv2.imread(images[1])
img3 = cv2.imread(images[2])
img4 = cv2.imread(images[3])
image_row_1 = cv2.hconcat([img1, img2])
image_row_2 = cv2.hconcat([img3, img4])
combined_image = cv2.vconcat([image_row_1, image_row_2])
return cv2.imwrite("Combined.png", combined_image)
combine(images)
有没有更好的办法?
【问题讨论】:
标签: python python-3.x numpy python-imaging-library