做一个评价器——来自大树的需求。
如果有好的想法,可以留言,有时间有能力可以帮助实现你的想法。
很多老师写评价,如果没有好工具,只能通过PPT或者一些其它排版工具,复制粘贴一堆内容,还要调整大小,位置,很不方便。
学生多的话,重复的做也是一件很无聊的事情。
看了一下需要的效果。
有5个地方的内容是填写的,后面是一张背景图片。
原始背景图
要实现可以写评价的效果,其实就转化为在背景图上写文字和粘贴图片。
处理图片立马想到使用pillow库,里面有现成的写文字和粘贴图片的方法,最麻烦的就是这些内容需要定位。
需要解决的问题:
坐标定位
学生名字,课程题目,照片粘贴位置,二维码位置,评价内容坐标位置等的计算。
自适应计算
标题要居中,评价内容如何实现自动换行,如何实现图片刚好适应背景图片框。
版本一:代码操作
import matplotlib.pyplot as plt
from PIL import Image, ImageDraw, ImageFont
font_name = ImageFont.truetype('anna.ttf', 60)
font_content = ImageFont.truetype('anna.ttf', 50)
student_name = "小花"
student_name_pos=(140,400)
work_name = "《蒸汽火车》"
work_name_pos_y = 1140
evaluate_info = """本次课题让孩子了解到火车的发展历史,学习了蒸汽火车的连杆机构。本次课程是宝贝们首次的合作课题,大家积极交流自己的想法,锻炼了宝贝们的团队合作能力。"""
evaluate_info_pos = (50, 1240)
line_words = int((1080-50*2)//50)
lines = len(evaluate_info)//line_words+1
new_evaluate_info=""
for line in range(lines):
new_evaluate_info += evaluate_info[line*line_words:(line+1)*line_words]
new_evaluate_info +="\n"
print(new_evaluate_info)
bg_img = "图片1.png"
bg_img_x=(1080,1920)
work_img = "学生.png"
work_img_pos=(110,500) #970-100,1080-500
qr_code_img = "code.png"
qr_code_img_size=(200,200)
qr_code_img_pos = (860, 1700)
bg_temp = Image.open(bg_img)
W,H=bg_temp.size
work_img_temp = Image.open(work_img).resize((870,580))
qr_code_img_temp = Image.open(qr_code_img).resize((200,200))
draw = ImageDraw.Draw(bg_temp)
draw.text(student_name_pos, student_name, fill=(0, 0, 0), font=font_name)
bg_temp.paste(work_img_temp,work_img_pos)
w, h = draw.textsize(work_name,font=font_name)
draw.text(((W-w)/2, work_name_pos_y), work_name, fill=(0, 0, 0), font=font_name)
draw.text(evaluate_info_pos, new_evaluate_info, fill=(0, 0, 0), font=font_content)
bg_temp.paste(qr_code_img_temp, qr_code_img_pos)
bg_temp.save("评价.png")
plt.imshow(bg_temp)
plt.show()
版本二:界面操作
from ui_evaluate import Ui_Evaluate
from PySide2.QtWidgets import *
import requests
import sys
from PIL import Image, ImageDraw, ImageFont
class Evaluate(QMainWindow, Ui_Evaluate):
def __init__(self):
super().__init__()
self.setupUi(self)
self.show()
#绑定查询按钮
self.pbtn_img.clicked.connect(self.select_img)
self.pbtn_evaluate.clicked.connect(self.process_img)
def select_img(self):
self.file_path = QFileDialog.getOpenFileName(self,"图片选择",filter=("*.jpg *.png"))[0]
self.lb_img_info.setText(self.file_path)
def process_img(self):
try:
font_name = ImageFont.truetype('anna.ttf', 60)
font_content = ImageFont.truetype('anna.ttf', 50)
student_name = self.l_name.text()
student_name_pos = (140, 400)
work_name = self.l_work_name.text()
work_name_pos_y = 1140
evaluate_info = self.text_evaluate.toPlainText()
evaluate_info_pos = (50, 1240)
line_words = int((1080-50*2)//50)
lines = len(evaluate_info)//line_words+1
new_evaluate_info = ""
for line in range(lines):
new_evaluate_info += evaluate_info[line*line_words:(line+1)*line_words]
new_evaluate_info += "\n"
bg_img = "图片1.png"
bg_img_x = (1080, 1920)
work_img = self.file_path
work_img_pos = (110, 500) # 970-100,1080-500
qr_code_img = "code.png"
qr_code_img_size = (200, 200)
qr_code_img_pos = (860, 1700)
bg_temp = Image.open(bg_img)
W, H = bg_temp.size
work_img_temp = Image.open(work_img).resize((870, 580))
qr_code_img_temp = Image.open(qr_code_img).resize((200, 200))
draw = ImageDraw.Draw(bg_temp)
draw.text(student_name_pos, student_name, fill=(0, 0, 0), font=font_name)
bg_temp.paste(work_img_temp, work_img_pos)
w, h = draw.textsize(work_name, font=font_name)
draw.text(((W-w)/2, work_name_pos_y), work_name,
fill=(0, 0, 0), font=font_name)
draw.text(evaluate_info_pos, new_evaluate_info,
fill=(0, 0, 0), font=font_content)
bg_temp.paste(qr_code_img_temp, qr_code_img_pos)
bg_temp.save("评价.png")
QMessageBox.information(self, "提示", "评价图片完成")
except:
QMessageBox.information(self, "提示", "缺少内容未填写")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Evaluate()
sys.exit(app.exec_())
注:
版本一:安装对应的库直接就可以运行,中文的还需要字体文件,可以自己找一个喜欢的字体;
版本二 :同样安装对应的库,如果需要界面可以链接获取。
https://shimo.im/docs/QtCG8kKqXGQxtqgk
改进拓展方向:
可实现不同模板,文字图片位置不同,可以上传多张图片,支持手机操作。
如果有好的想法,可以留言哦,一起交流。
(全文完)