python之Pillow库的使用,实现图片拼接技术,解决报错问题(内含模板代码!!!)

文章目录

  • 前言
  • 1、安装Pillow库
  • 2、基本使用方法
  • 3、图片拼接模板,实现水平拼接和垂直拼接
  • 3.1 模板代码
  • 3.2 图片拼接案例
  • 4、异常处理,解决报错信息
  • 前言

    在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格式是更好的选择。

    作者:盲敲代码的阿豪

    物联沃分享整理
    物联沃-IOTWORD物联网 » python之Pillow库的使用,实现图片拼接技术,解决报错问题(内含模板代码!!!)

    发表回复