本文目录导读:

我来介绍几种使用Pillow拼接图片的方法:
水平拼接(横向拼接)
from PIL import Image
import os
def horizontal_concat(images_path, output_path="result_horizontal.jpg"):
"""水平拼接多张图片"""
images = []
# 读取所有图片
for path in images_path:
img = Image.open(path)
images.append(img)
# 计算总宽度和最大高度
total_width = sum(img.width for img in images)
max_height = max(img.height for img in images)
# 创建新画布
new_image = Image.new('RGB', (total_width, max_height), (255, 255, 255))
# 粘贴图片
x_offset = 0
for img in images:
new_image.paste(img, (x_offset, 0))
x_offset += img.width
new_image.save(output_path)
return new_image
# 使用示例
images = ["image1.jpg", "image2.jpg", "image3.jpg"]
horizontal_concat(images)
垂直拼接(纵向拼接)
def vertical_concat(images_path, output_path="result_vertical.jpg"):
"""垂直拼接多张图片"""
images = []
for path in images_path:
img = Image.open(path)
images.append(img)
# 计算最大宽度和总高度
max_width = max(img.width for img in images)
total_height = sum(img.height for img in images)
# 创建新画布
new_image = Image.new('RGB', (max_width, total_height), (255, 255, 255))
# 粘贴图片
y_offset = 0
for img in images:
# 水平居中
x_offset = (max_width - img.width) // 2
new_image.paste(img, (x_offset, y_offset))
y_offset += img.height
new_image.save(output_path)
return new_image
# 使用示例
images = ["image1.jpg", "image2.jpg", "image3.jpg"]
vertical_concat(images)
网格拼接(矩阵排列)
def grid_concat(images_path, cols=3, output_path="result_grid.jpg"):
"""网格拼接多张图片"""
images = [Image.open(path) for path in images_path]
# 获取图片尺寸(取最大尺寸)
widths = [img.width for img in images]
heights = [img.height for img in images]
# 计算每个单元格的尺寸
cell_width = max(widths)
cell_height = max(heights)
# 计算行数
rows = (len(images) + cols - 1) // cols
# 创建新画布
new_image = Image.new('RGB',
(cell_width * cols, cell_height * rows),
(255, 255, 255))
# 粘贴图片
for i, img in enumerate(images):
row = i // cols
col = i % cols
# 计算位置
x = col * cell_width + (cell_width - img.width) // 2
y = row * cell_height + (cell_height - img.height) // 2
new_image.paste(img, (x, y))
new_image.save(output_path)
return new_image
# 使用示例
images = ["image1.jpg", "image2.jpg", "image3.jpg", "image4.jpg"]
grid_concat(images, cols=2) # 2列网格
自动拼接(包含调整大小)
def auto_concat(images_path, direction='horizontal',
resize=None, padding=10, output_path="result.jpg"):
"""
自动拼接图片,可选择调整大小和添加间距
参数:
- direction: 'horizontal' 或 'vertical'
- resize: 统一尺寸,如 (300, 200)
- padding: 图片间距
"""
images = []
for path in images_path:
img = Image.open(path)
# 调整大小
if resize:
img = img.resize(resize, Image.Resampling.LANCZOS)
images.append(img)
if direction == 'horizontal':
# 水平拼接
total_width = sum(img.width for img in images) + padding * (len(images) - 1)
max_height = max(img.height for img in images)
new_image = Image.new('RGB', (total_width, max_height), (255, 255, 255))
x_offset = 0
for img in images:
y_offset = (max_height - img.height) // 2
new_image.paste(img, (x_offset, y_offset))
x_offset += img.width + padding
else:
# 垂直拼接
max_width = max(img.width for img in images)
total_height = sum(img.height for img in images) + padding * (len(images) - 1)
new_image = Image.new('RGB', (max_width, total_height), (255, 255, 255))
y_offset = 0
for img in images:
x_offset = (max_width - img.width) // 2
new_image.paste(img, (x_offset, y_offset))
y_offset += img.height + padding
new_image.save(output_path)
return new_image
# 使用示例
auto_concat(["img1.jpg", "img2.jpg"],
direction='horizontal',
resize=(400, 300),
padding=20)
批量文件夹图片拼接
def batch_concat_from_folder(folder_path, output_path="batch_result.jpg"):
"""从文件夹读取图片并拼接"""
# 获取所有图片文件
image_extensions = ['.jpg', '.jpeg', '.png', '.bmp', '.gif']
images_path = []
for file in os.listdir(folder_path):
ext = os.path.splitext(file)[1].lower()
if ext in image_extensions:
images_path.append(os.path.join(folder_path, file))
# 按文件名排序
images_path.sort()
if not images_path:
print("未找到图片文件")
return None
# 拼接
return grid_concat(images_path, cols=3, output_path=output_path)
# 使用示例
batch_concat_from_folder("./images_folder")
的拼接
from PIL import Image, ImageDraw, ImageFont
def concat_with_titles(images_path, titles, output_path="titled_concat.jpg"):
"""带标题的图片拼接"""
# 读取并调整图片
images = []
for path in images_path:
img = Image.open(path)
img = img.resize((300, 200))
images.append(img)
# 创建标题图片height = 40images = []
for title in titles:
title_img = Image.new('RGB', (300, title_height), (240, 240, 240))
draw = ImageDraw.Draw(title_img)
# 尝试使用中文字体,如果失败则使用默认字体
try:
font = ImageFont.truetype("simhei.ttf", 20)
except:
font = ImageFont.load_default()
# 居中显示文字
bbox = draw.textbbox((0, 0), title, font=font)
text_width = bbox[2] - bbox[0]
text_height = bbox[3] - bbox[1]
x = (300 - text_width) // 2
y = (title_height - text_height) // 2
draw.text((x, y), title, fill='black', font=font)
title_images.append(title_img)
# 垂直拼接(每个图片带标题)
final_height = sum(img.height + title_img.height
for img, title_img in zip(images, title_images))
max_width = max(img.width for img in images)
new_image = Image.new('RGB', (max_width, final_height), (255, 255, 255))
y_offset = 0
for img, title_img in zip(images, title_images):
new_image.paste(title_img, (0, y_offset))
y_offset += title_img.height
x_offset = (max_width - img.width) // 2
new_image.paste(img, (x_offset, y_offset))
y_offset += img.height
new_image.save(output_path)
return new_image
# 使用示例
images = ["img1.jpg", "img2.jpg", "img3.jpg"]s = ["图片1", "图片2", "图片3"]
concat_with_titles(images, titles)
使用建议
- 图片格式:建议统一使用同一种格式(如JPG或PNG)
- 尺寸处理:如果图片尺寸差异大,建议先调整大小
- 内存管理:大量图片时注意释放内存
- 错误处理:添加try-except处理图片读取错误
这些方法可以满足大部分图片拼接需求,根据具体情况选择合适的方法。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播