python之Pillow库的使用,实现图片拼接技术,解决报错问题(内含模板代码!!!)
在Python中,可以使用Pillow库(Python Imaging Library的一个分支)来将多张图片拼接在一起。Pillow库提供了强大的图像处理功能,可以轻松实现图片的拼接。
前言
在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=颜色)
参数说明:
mode
:表示图像模式,比如 RGB(真彩图像)、L(灰度图像)、CMYK(色彩图打印模式)等;一般我们都使用RGB
模式size
:代表图片大小,用元组表示,如:(宽度,高度)color
:图片颜色,默认值为 0 表示黑色,参数值支持(R,G,B)三元组数字格式、颜色的十六进制值以及颜色英文单词。
示例:
6、向图片上粘贴图片
语法:
图片对象.paste(image,point)
参数说明:
image
:表示要粘贴的图片对象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格式的区别
JPEG格式:
采用有损压缩方式,存储空间小,可压缩画质。
主要用于电子设备之间的相互传输,以减少传输和加载时间,但画质会有所牺牲。
支持三通道RGB模式,不支持透明度。PNG格式:
采用无损压缩方式,能够保持图像的高质量。
支持透明度处理,即支持四通道RGBA模式。
文件大小可能相对较大,但适用于需要保持图像细节和透明度的场景。
2、为什么选择保存为PNG格式?
保持图像质量
:由于PNG格式采用无损压缩,因此在拼接完成后保存为PNG格式可以最大程度地保持图像的质量,避免JPEG格式可能带来的画质损失。支持透明度
:如果拼接的图像中包含透明区域,或者需要在拼接后的图像中保留透明区域,那么保存为PNG格式是更好的选择,因为PNG格式支持透明度处理。避免格式转换问题
:在拼接过程中,如果直接将JPEG格式的图片拼接后保存为JPEG格式,可能会因为格式不兼容或色彩模式不一致而导致错误。而保存为PNG格式则可以避免这些问题,因为PNG格式具有更广泛的兼容性和更灵活的色彩模式。
注意事项
- 在保存为PNG格式时,需要确保Pillow库已经正确安装,并且拼接后的图像没有超出PNG格式所支持的颜色深度和分辨率范围。
- 如果拼接后的图像不需要透明度处理,并且希望减小文件大小,可以考虑将图像保存为JPEG格式,并适当调整压缩参数以平衡文件大小和质量。
综上所述,虽然在使用Pillow模块拼接.jpeg格式
的图片时并不必须保存为PNG格式
,但保存为PNG格式可以最大程度地保持图像质量、支持透明度处理,并避免格式转换问题。因此,在需要保持图像细节和透明度的场景中,保存为PNG格式是更好的选择。
更多推荐
所有评论(0)