图片拼接小工具,可以将多个图片拼接成长图,并确保一个指定的图片位于正中心
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

96 lines
3.8 KiB

from PIL import Image, ImageOps
import os
input_pre_path = 'inputs'
output_pre_path = 'outputs'
def resize_to_width(image, target_width):
w, h = image.size
ratio = target_width / w
new_height = int(h * ratio)
return image.resize((target_width, new_height))
def open_and_correct_image(path):
img = Image.open(path)
return ImageOps.exif_transpose(img)
def create_vertical_mosaic(up_list_path, down_list_path, center_path, target_width = 800, interval = 10, bg_color = (255, 255, 255)):
# 加载图片
print('加载图片...')
up_imgs = [open_and_correct_image(os.path.join(input_pre_path, p)) for p in up_list_path]
down_imgs = [open_and_correct_image(os.path.join(input_pre_path, p)) for p in down_list_path]
center_img = open_and_correct_image(os.path.join(input_pre_path, center_path))
print('加载完成')
# 缩放图片
print('缩放图片...')
up_imgs = [resize_to_width(img, target_width) for img in up_imgs]
down_imgs = [resize_to_width(img, target_width) for img in down_imgs]
center_img = resize_to_width(center_img, target_width)
print('缩放完成')
# 计算高度
total_height = center_img.height + max(sum(img.height + interval for img in up_imgs), sum(img.height + interval for img in down_imgs)) * 2
# 创建长图
mosaic = Image.new('RGB', (target_width, total_height), color=bg_color)
# 放置图片到对应位置 -----------------
# 中心图片
print('绘制中心...')
mosaic.paste(center_img, (0, (total_height - center_img.height) // 2))
# 上方图片
print('绘制上方...')
y_offset = (total_height - center_img.height) // 2 - sum(img.height + interval for img in up_imgs)
for img in up_imgs:
mosaic.paste(img, (0, y_offset))
y_offset += img.height + interval
# 下方图片
print('绘制下方...')
y_offset = (total_height + center_img.height) // 2 + interval
for img in down_imgs:
mosaic.paste(img, (0, y_offset))
y_offset += img.height + interval
# 保存 --------------------------------
return mosaic
# output_path = os.path.join(output_pre_path, output_name)
# mosaic.save(output_path)
# print(f"保存至 {output_path}")
# =============================================================================================================================================
# 贵阳 -------------------------------------------------------
input_pre_path = os.path.join(input_pre_path, '贵阳')
up_img_list = ['D.jpg', 'C.jpg', 'E.jpg', 'H.jpg', 'F.jpg']
down_img_list = ['G.jpg', 'A.jpg', 'B.jpg']
center_img = '中心.jpg'
output_name = '贵阳.jpg'
# 重庆 -------------------------------------------------------
# input_pre_path = os.path.join(input_pre_path, '重庆')
# up_img_list = ['A2.jpg', 'J.jpg', 'D.jpg', 'C.jpg', 'E.jpg']
# down_img_list = ['F.jpg', 'G.jpg', 'H.jpg', 'I2.jpg', 'B.jpg']
# center_img = '中心.jpg'
# output_name = '重庆2.jpg'
# 洛阳 -------------------------------------------------------
# input_pre_path = os.path.join(input_pre_path, '洛阳')
# up_img_list = ['A.jpg', 'D.jpg', 'C.jpg', 'G.jpg']
# down_img_list = ['F.jpg', 'E.jpg', 'H2.jpg', 'B.jpg', 'I.jpg']
# center_img = '中心.jpg'
# output_name = '洛阳2.jpg'
# 上海 -------------------------------------------------------
# input_pre_path = os.path.join(input_pre_path, '上海')
# up_img_list = ['G.jpg', 'J.jpg', 'D.jpg', 'E.jpg', 'C.jpg', 'A.jpg']
# down_img_list = ['B.jpg', 'F.jpg', 'H.jpg', 'I.jpg']
# center_img = '中心.jpg'
# output_name = '上海.jpg'
print('开始处理...')
result = create_vertical_mosaic(up_img_list, down_img_list, center_img, 1580, 30)
output_path = os.path.join(output_pre_path, output_name)
result.save(output_path)
print(f"保存至 {output_path}")
print('处理结束')