一、需求描述
给定学生照片,照片用学生的学号命名,一个班一个文件夹,文件夹命名为班级名称。提供包含学生学号、名字、班级信息的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')
四、最终生成结果