评价生成器

2020-08-28 14:44:31 浏览数 (1)

做一个评价器——来自大树的需求。

如果有好的想法,可以留言,有时间有能力可以帮助实现你的想法。

很多老师写评价,如果没有好工具,只能通过PPT或者一些其它排版工具,复制粘贴一堆内容,还要调整大小,位置,很不方便。

学生多的话,重复的做也是一件很无聊的事情。

看了一下需要的效果。

有5个地方的内容是填写的,后面是一张背景图片。

原始背景图

要实现可以写评价的效果,其实就转化为在背景图上写文字和粘贴图片。

处理图片立马想到使用pillow库,里面有现成的写文字和粘贴图片的方法,最麻烦的就是这些内容需要定位。

需要解决的问题:

坐标定位

学生名字,课程题目,照片粘贴位置,二维码位置,评价内容坐标位置等的计算。

自适应计算

标题要居中,评价内容如何实现自动换行,如何实现图片刚好适应背景图片框。

版本一:代码操作

代码语言:javascript复制
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()

版本二:界面操作

代码语言:javascript复制
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

改进拓展方向:

可实现不同模板,文字图片位置不同,可以上传多张图片,支持手机操作。

如果有好的想法,可以留言哦,一起交流。

(全文完)

0 人点赞