python生成九宫格个图片效果如下:
完整代码:
# -*- coding: UTF-8 -*-
"""
九宫格图片生成
"""
import cv2
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
# 读取图片
im = Image.open('../images/girl1.jpg')
print(im.size)
# 宽高各除以3,获取裁剪后的单张图片大小
src_w = im.size[0]
src_h = im.size[1]
width = src_w / 3
height = src_h / 3
# 裁剪图片的左上角坐标
start_x = 0
start_y = 0
# 用于给图片命名
im_name = 1
sub_images = []
# 循环裁剪图片
for i in range(3):
for j in range(3):
crop = im.crop((start_x, start_y, start_x + width, start_y + height))
crop.save(str(im_name) + '.jpg')
sub_images.append(crop)
# 将左上角坐标的 x 轴向右移动
start_x += width
im_name += 1
# 当第一行裁剪完后 x 继续从 0 开始裁剪
start_x = 0
# 裁剪第二行
start_y += height
# 效果测试
num = 330
for i in range(9):
num = num + 1
plt.subplot(int(num)), plt.imshow(sub_images[i]), plt.axis('off')
plt.show()
# 合并成单张大图
internal = 5
big_image = np.ones([src_h + internal*2, src_w + internal*2, 3], dtype='uint8')*255
n = 0
start_x = 0
start_y = 0
for i in range(3):
for j in range(3):
print('image i: ', n)
sub_im = np.array(sub_images[n])
sub_h, sub_w = np.shape(sub_im)[0:2]
big_image[int(start_y):int(start_y+sub_h), int(start_x):int(start_x+sub_w), :] = sub_im
n += 1
start_x += width + internal
start_x = 0
# 裁剪第二行
start_y += height + internal
plt.imshow(big_image), plt.axis('off')
plt.show()
big_image = cv2.cvtColor(big_image, cv2.COLOR_BGR2RGB)
cv2.imwrite("big_image_nine.jpg", big_image)