使用Python实现照片排版生成照片墙

一、需求描述
给定学生照片,照片用学生的学号命名,一个班一个文件夹,文件夹命名为班级名称。提供包含学生学号、名字、班级信息的Excel表。根据以上信息生成照片墙,一行14张照片,照片下显示学生姓名。

在这里插入图片描述
在这里插入图片描述
二、效果图
在这里插入图片描述
三、实现思路
一)、先思考如何将照片排好版逐个生成然后保存好整张图片。
1、生成一个大的整体的画布,用于放学生的照片。使用Python中‌PIL库的Image.new()方法创建空白画布,然后用ImageDraw创建一个画图对象,用于后期在该画布上绘制学生名字和班级名称。

new_image=Image.new('RGB',(24000,32000),(255,255,255))
drawer = ImageDraw.Draw(new_image)

2、根据文件夹路径名读取文件夹中的所有照片

image_files.extend([file for file in os.listdir('./'+class_name[i]) if file.endswith(('.jpg','.jpeg','.png','gif'))])

3、循环将每张照片生成在画布上,同时绘制出班级名称和学生姓名,然后使用save()方法将生成好的照片墙保存在本地

for image_file in image_files:
    num+=1
    if num>196 and (num-1)%196==0:
        new_image=Image.new('RGB',(3000,4000),(255,255,255))
        i+=1
        print(i)
    col=(num-1)%196%14
    row=int((num-1)%196/14)
    print(row,col)
    image_path=os.path.join('./images',image_file)
    image1=Image.open(image_path)
    image2=image1.resize((180,240))
    position=(105+col*200,200+row*350)
    position2=(160+col*200,450+row*350)
    new_image.paste(image2,position)
    drawer.text(position2, get_line(file_txt,num).split("#")[1], fill=(0, 0, 0), font=font)
    new_image.save('result2'+str(i)+'.jpg','JPEG')

二)、思考如何将文件夹中的照片和Excel表中对应的学生姓名对应起来。
1、用一个txt文件存储接下来要读取班级照片的班级名称,之后在程序中先读取这个文件,然后将班级名存储在数组中。
在这里插入图片描述

for line in open("./classNames.txt",encoding='utf-8'):
    print(line)
    class_num_list.append(line.split('#')[1])
    class_name_list.append(line.split('#')[0])
    class_name.append(line.split(' ')[0])

2、遍历存储班级名的数组,将对应班级名下的文件夹中的照片读取出来,在逐个照片处理的时候读取照片名字即学生的学号,再到Excel表中按学号查询出学生姓名,将学生姓名绘制在该照片底下。

wb=load_workbook('计算机学院18-20级.xlsx')
sheet=wb.active

def find_name_by_student_id(student_id):
    for row in sheet.iter_rows(min_row=2):
        if row[4].value==student_id:
            return row[5].value
    return "none"

绘制班级名

drawer.text((840,800), class_name_list[0], fill=(0, 0, 0), font=font2)

绘制学生姓名

drawer.text(position2, find_name_by_student_id(student_id), fill=(0, 0, 0), font=font)

绘制小照片并按照班级名命名为新图片保存在本地

    new_image.paste(image2,position)
    new_image.save('./result_imgs/'+class_name[0]+class_name[1]+'.jpg','JPEG')

四、最终生成结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值