python使用PIL完成图片的拼接和文字的添加

对两张图片进行拼接

图片拼接,对于两张相同宽度和不同高度的图片进行拼接

1、首先获取到图片所在的位置,下面这段代码完成对当前目录下的image_test目录进行遍历,将所有jpg和png格式的图片放到一个列表中

def picture_spell():
    # 获取到图片格式的文件的路径
    path = "./image_test"
    result = []
    file_name_list = os.listdir(path)
    for file in file_name_list:
        if os.path.isfile(os.path.join(path, file)):
            if file.split(".")[1] in ['jpg', 'png']:
                result.append(os.path.join(path, file))
    print(result)

2、打开图片,放到列表中

ims = list()
for fn in result:
    ims.append(Image.open(fn))

# 获取各自的宽,高
width_one, height_one = ims[0].size
width_two, height_two = ims[1].size
print(width_one, height_one, width_two, height_two)

3、如果两张图片的宽度相同,不需要进行这一步操作,直接进行下一步操作即可,两张图片的宽度如若不同,进行此步操作

# 将两张图片转化为相同宽度的图片
new_img_one = ims[0].resize((1200, height_one), Image.BILINEAR)
new_img_two = ims[1].resize((1200, height_two), Image.BILINEAR)

4、创建一个新图片,定义好宽和高,将两张图片paste进去保存即可
因个人需求,需要将高度小的放在最上面,所以对高度进行判断识别,对于(0, 0, 1200, height_one),相当于(x, y, width, height),
第一张图片起点都是0, 0 宽度固定1200, 高度为图片的高度
第二张图片起点为0和第一张图片的高度, 宽度和第一张图片一致1200,高度为第二张图片的高度

target_images = Image.new('RGB', (1200, height_one + height_two))
if height_one < height_two:
    target_images.paste(new_img_one, (0, 0, 1200, height_one))
    target_images.paste(new_img_two, (0, height_one, 1200, height_one + height_two))
else:
    target_images.paste(new_img_two, (0, 0, 1200, height_two))
    target_images.paste(new_img_one, (0, height_two, 1200, height_one + height_two))
target_images.save("result.png")

完整代码

下面为对图片拼接的完整代码,运行系统mac

import os
from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw


def picture_spell():
    # 获取到图片格式的文件的路径,此路径为图片所在的文件夹
    path = "./image_test"
    result = []
    file_name_list = os.listdir(path)
    for file in file_name_list:
        if os.path.isfile(os.path.join(path, file)):
            if file.split(".")[1] in ['jpg', 'png']:
                result.append(os.path.join(path, file))
    print(result)

    ims = list()
    for fn in result:
        ims.append(Image.open(fn))

    # 获取各自的宽,高
    width_one, height_one = ims[0].size
    width_two, height_two = ims[1].size
    print(width_one, height_one, width_two, height_two)

    # 将两张图片转化为相同宽度的图片
    new_img_one = ims[0].resize((1200, height_one), Image.BILINEAR)
    new_img_two = ims[1].resize((1200, height_two), Image.BILINEAR)

    # 创建一个新图片,定义好宽和高
    target_images = Image.new('RGB', (1200, height_one + height_two))
    if height_one < height_two:
        target_images.paste(new_img_one, (0, 0, 1200, height_one))
        target_images.paste(new_img_two, (0, height_one, 1200, height_one + height_two))
    else:
        target_images.paste(new_img_two, (0, 0, 1200, height_two))
        target_images.paste(new_img_one, (0, height_two, 1200, height_one + height_two))
        
    # 注意存储路径
    target_images.save("result.png")


if __name__ == '__main__':
    picture_spell()

对图片的指定位置进行添加位置

完整代码

可能遇到的问题

一、OSError: cannot write mode RGBA as JPEG

RGBA意思是红色,绿色,蓝色,Alpha的色彩空间,Alpha指透明度。而JPG不支持透明度,所以要么丢弃Alpha,要么保存为.png文件
解决办法:
第一种

img=img.convert('RGB')
img.save('code.jpg')

第二种

img.save('code.png')

参考链接

OSError
简书参考

猜你喜欢

转载自www.cnblogs.com/ppwang06/p/12513017.html