前言

在Python中,可以使用Pillow库(Python Imaging Library的一个分支)来将多张图片拼接在一起。Pillow库提供了强大的图像处理功能,可以轻松实现图片的拼接。

1、安装Pillow库

命令:pip install pillow

2、基本使用方法


1、导入模块

语法:from PIL import Image


2、打开图片,生成图片对象

语法:image = Image.open('图片路径')
示例:image = Image.open(‘D:/imgs/图片.jpg’)

在这里插入图片描述


3、通过图片对象获取图片的高度和宽度

1、高度
语法:图片对象.height

2.、宽度
语法:图片对象.width

注意: 图片的大小单位为像素(px)

示例:
在这里插入图片描述

4、显示图片

语法:图片对象.show()
会启动电脑默认的工具打开图片

示例:
在这里插入图片描述

5、生成一张图片,获得图片对象

语法:new_im = Image.new(mode=模式,size=大小,color=颜色)
参数说明:

  1. mode:表示图像模式,比如 RGB(真彩图像)、L(灰度图像)、CMYK(色彩图打印模式)等;一般我们都使用RGB模式
  2. size:代表图片大小,用元组表示,如:(宽度,高度)
  3. color:图片颜色,默认值为 0 表示黑色,参数值支持(R,G,B)三元组数字格式、颜色的十六进制值以及颜色英文单词。

示例:
在这里插入图片描述

6、向图片上粘贴图片

语法:图片对象.paste(image,point)
参数说明:

  1. image:表示要粘贴的图片对象
  2. point:图片粘贴的坐标位置,以元组表示(x,y),单位像素,如:(0,0)表示从图片左上顶点位置粘贴,(20,0)表示在顶部向右移动20px粘贴,(30,30)表示在向右移动30px,向下移动30px位置处粘贴

示例:可以看到我们在生成的黑色图片上的(0,0)位置粘贴了一张图片
在这里插入图片描述


7、保存图片

语法:图片对象.save('保存路径')
可以将图片另存为其它位置

在这里插入图片描述

3、图片拼接模板,实现水平拼接和垂直拼接

3.1 模板代码

# 导入模块
from PIL import Image


def concatenate_images(image_paths, direction='垂直'):
    # 打开所有图片,得到每张图片的对象,封装到一个列表中
    images = [Image.open(img_path) for img_path in image_paths]

    # 选择 '水平拼接'
    if direction == '水平':
        # 计算得到所有图片宽度之和的总宽度
        total_width = sum(img.width for img in images)
        # 筛选得到所有图片中的最大高度
        max_height = max(img.height for img in images)
        # 根据总宽度和最大高度创建一张可以粘贴所有图片的画布
        new_im = Image.new('RGB', (total_width, max_height))

        x_offset = 0  # 水平偏移量
        for img in images:
            # 将图片依次水平粘贴在画布上,完成拼接
            new_im.paste(img, (x_offset, 0))
            # 每粘贴一张图片,偏移量加上该图片的宽度,这样才能水平连接
            x_offset += img.width

    # 选择 '垂直拼接'
    elif direction == '垂直':
        # 计算得到所有图片高度之和的总高度
        total_height = sum(img.height for img in images)
        # 筛选得到所有图片中的最大宽度度
        max_width = max(img.width for img in images)
        # 根据总高度和最大宽度创建一张可以粘贴所有图片的画布
        new_im = Image.new('RGB', (max_width, total_height))

        y_offset = 0  # 垂直偏移量
        for img in images:
            # 将图片依次垂直粘贴在画布上,完成拼接
            new_im.paste(img, (0, y_offset))
            # 每粘贴一张图片,偏移量加上该图片的高度,这样才能垂直连接
            y_offset += img.height

    else:  # 输出提示信息
        raise ValueError("Direction must be 'horizontal' or 'vertical'")

    return new_im  # 返回最后拼接好的图片


# 1、准备好所有需要拼接的图片路径
image_paths = ['image1.jpg', 'image2.jpg', 'image3.jpg']

# 2、调用concatenate_images函数完成拼接,得到拼接好的图片
concatenated_image = concatenate_images(image_paths, direction='垂直')  # 参数1:图片路径 参数2:自定义选择垂直拼接还是水平拼接

# 3、将最终拼接好的图片保存至指定路径下,格式最好指定为png,避免兼容问题
concatenated_image.save('concatenated_image.png')

# 4、显示拼接好的图片
concatenated_image.show()

3.2 图片拼接案例

这里推荐一个爬虫实战案例,该案例很好的运用了图片拼接技术
网址:https://blog.csdn.net/m0_59470317/article/details/144087584

4、异常处理,解决报错信息


1、我们在拼接图片时,出现报错信息:OSError: broken data stream when writing image file

出现这种问题,大概率是图片保存格式出现了问题,例如:我们拼接的图片是.jpeg格式的,最后拼接完成后,若将拼接的图片也保存为.jpeg格式,则很可能会报错,解决方法:将其存为.png格式即可;这涉及到图片格式兼容的问题


2、图片拼接大小问题

我们在拼接图片时,通常会提前计算所有图片的大小然后生成一张固定大小的画布,用来粘贴需要拼接的每一张图片,因此每张图片的大小不能差距过大,最好相等或相近,不然超出画布的大小,图片拼接完成后可能损坏,导致无法显示,若图片大小实在差距过大,则需要对图片进行填充或裁剪


3、图片格式兼容问题

我们在拼接图片,以及最后保存图片时,通常会遇到图片格式不兼容的问题,这通常是每种图片格式的性质不同导致的,接下来我将以.jpeg和.png两种格式的图片,为大家讲解一下不同图片格式的区别


1、JPEG与PNG格式的区别

  1. JPEG格式:
    采用有损压缩方式,存储空间小,可压缩画质。
    主要用于电子设备之间的相互传输,以减少传输和加载时间,但画质会有所牺牲。
    支持三通道RGB模式,不支持透明度。
  2. PNG格式:
    采用无损压缩方式,能够保持图像的高质量。
    支持透明度处理,即支持四通道RGBA模式。
    文件大小可能相对较大,但适用于需要保持图像细节和透明度的场景。


2、为什么选择保存为PNG格式?

  1. 保持图像质量:由于PNG格式采用无损压缩,因此在拼接完成后保存为PNG格式可以最大程度地保持图像的质量,避免JPEG格式可能带来的画质损失。
  2. 支持透明度:如果拼接的图像中包含透明区域,或者需要在拼接后的图像中保留透明区域,那么保存为PNG格式是更好的选择,因为PNG格式支持透明度处理。
  3. 避免格式转换问题:在拼接过程中,如果直接将JPEG格式的图片拼接后保存为JPEG格式,可能会因为格式不兼容或色彩模式不一致而导致错误。而保存为PNG格式则可以避免这些问题,因为PNG格式具有更广泛的兼容性和更灵活的色彩模式。


注意事项

  1. 在保存为PNG格式时,需要确保Pillow库已经正确安装,并且拼接后的图像没有超出PNG格式所支持的颜色深度和分辨率范围。
  2. 如果拼接后的图像不需要透明度处理,并且希望减小文件大小,可以考虑将图像保存为JPEG格式,并适当调整压缩参数以平衡文件大小和质量。

综上所述,虽然在使用Pillow模块拼接.jpeg格式的图片时并不必须保存为PNG格式,但保存为PNG格式可以最大程度地保持图像质量、支持透明度处理,并避免格式转换问题。因此,在需要保持图像细节和透明度的场景中,保存为PNG格式是更好的选择。

Logo

科技之力与好奇之心,共建有温度的智能世界

更多推荐