def put_txt_img(self, img, t, total_dis, xy, dis_line, fill, font_name, font_size, addSPC='None'): fontInput = self.fonts(font_name, font_size) if addSPC == 'add_2spaces': ind = 'yes' else: ind = 'no' # txt=self.split_txt(total_dis,font_size,t,Indent='no') txt, p_num = composing.split_txt_Chn_eng(total_dis, font_size, t, Indent=ind) # font_sig = self.fonts('丁永康硬笔楷书',40) draw = ImageDraw.Draw(img) # logging.info(txt) n = 0 for t in txt: m = 0 for tt in t: x, y = xy[0], xy[1] + (font_size + dis_line) * n if addSPC == 'add_2spaces': #首行缩进 if m == 0: # tt=' '+tt #首先前面加上两个空格 logging.info('字数:' + str(len(tt)) + ',坐标:' + str(x) + ',' + str(y)) logging.info(tt) draw.text((x - font_size * 0.2, y), tt, fill=fill, font=fontInput) else: logging.info('字数:' + str(len(tt)) + ',坐标:' + str(x) + ',' + str(y)) logging.info(tt) draw.text((x, y), tt, fill=fill, font=fontInput) else: logging.info('字数:' + str(len(tt)) + ',坐标:' + str(x) + ',' + str(y)) logging.info(tt) draw.text((x, y), tt, fill=fill, font=fontInput) m += 1 n += 1
def PosterDraw(self, crs_nameInput, dateInput, TeacherSig='阿晓老师'): crs_name = crs_nameInput[4:] crs_code = crs_nameInput[0:4] def basic_para(): print('正在初始化参数……', end='') picWid = self.picWid r = 0.75 picX1, picX3 = 10, 10 picX2, picX4 = picX1 + picWid + 20, picX1 + picWid + 20 picY1, picY2 = 720, 720 picY3, picY4 = picY1 + picWid * r + 20, picY1 + picWid * r + 20 pic0 = pic_xy(picWid, int(picWid * r), 440, 290) #标题图 pic1 = pic_xy(picWid, int(picWid * r), picX1, picY1) #照片一 pic2 = pic_xy(picWid, int(picWid * r), picX2, picY2) #照片二 pic3 = pic_xy(picWid, int(picWid * r), picX3, picY3) #照片三 pic4 = pic_xy(picWid, int(picWid * r), picX4, picY4) #照片四 print('完成') return [ picWid, picX1, picX2, picX3, picX4, picY1, picY2, picY3, picY4, pic0, pic1, pic2, pic3, pic4 ] def sortPics(files): newfiles = {} for fn in files: if fn[-3:].lower() == 'jpg': with open(fn, 'rb') as fd: tag = exifread.process_file(fd) t = str(tag['EXIF DateTimeOriginal']).replace( ':', '-', 2) if t in newfiles.keys(): t = t[0:-2] + str(int(t[-2:]) + 1).zfill(2) newfiles[t] = fn else: newfiles[t] = fn # print('exifInfo:',t,fn) newList = [] for i in sorted(newfiles): newList.append(newfiles[i]) return newList def read_excel(): print('正在读取学员和课程信息……', end='') infos=WashData.comments_after_class(crs_name_input=crs_nameInput,weekday=self.weekday, \ crs_list=self.crsList,crs_student=self.crsStudent, \ tch_cmt=self.eachStd) print('完成') return infos def pic_xy(picWid, picHig, x0, y0): #白色矩形 recX0 = x0 recY0 = y0 recX1 = x0 + picWid + 10 recY1 = y0 + picHig + 10 #照片 picX0 = recX0 + 5 picY0 = recY0 + 5 picX1 = picX0 + picWid picY1 = picY0 + picHig return [[int(recX0), int(recY0), int(recX1), int(recY1)], [int(picX0), int(picY0), int(picX1), int(picY1)]] def color_list(list_num='202002'): colors_202002 = { 'title_bg': '#FF9E11', #乐高机器人课 'name': '#FFFFFF', # 姓名 年龄 'crs': '#00b578', #课程 'pics': '#f7f7f7', #照片大框 'pics_box': '#ffffff', #照片相框 'pic01': '#ffffff', 'pic02': '#ffffff', 'pic03': '#ffffff', 'pic04': '#ffffff', 'comments': '#00bde3', #老师评语 'logo': '#ffffff', #logo 't_title_ke1': '#ffffff', 't_title_xue': '#ffffff', 't_title_ji': '#ffffff', 't_title_qi': '#ffffff', 't_title_ren': '#ffffff', 't_title_ke4': '#ffffff', 't_name': '#00b578', #姓名 't_kdgtn': '#00b578', #幼儿园 't_class': '#00b578', #班级 't_crs': '#FFE340', #课程名称 't_diff': '#ffffff', #难度 't_tool': '#ffffff', #教具 't_knlg': '#ffffff', #知识点 't_date': '#ffffff', #日期 't_tch_cmt': '#ffffff', #老师评语 't_tch_sig': '#ffffff', #签名 't_bottom': '#656564' #二维码文字 } colors_202101 = { 'title_bg': '#f7f3c3', #乐高机器人课 'name': '#FFFFFF', # 姓名 年龄 'crs': '#f1f9ee', #课程 'pics': '#f7f7f7', #照片大框 'pics_box': '#ffffff', #照片相框 'pic01': '#ffffff', 'pic02': '#ffffff', 'pic03': '#ffffff', 'pic04': '#ffffff', 'comments': '#f9f9f9', #老师评语 'logo': '#ffffff', #logo 't_title_ke1': '#009ce6', 't_title_xue': '#33b171', 't_title_ji': '#ef9c10', 't_title_qi': '#8bbe19', 't_title_ren': '#dc9ee7', 't_title_ke4': '#b18046', 't_name': '#99633f', #姓名 't_kdgtn': '#99633f', #幼儿园 't_class': '#99633f', #班级 't_crs': '#37a751', #课程名称 't_diff': '#8b988e', #难度 't_tool': '#8b988e', #教具 't_knlg': '#8b988e', #知识点 't_date': '#8b988e', #日期 't_tch_cmt': '#795022', #老师评语 't_tch_sig': '#795022', #签名 't_bottom': '#656564' #二维码文字 } out = eval('colors_' + list_num) return out def basic_bg(num): color = color_list('202101') s1 = 100 s2 = 140 s3 = 450 s4 = 700 self.s4 = s4 s5 = (self.comment_font_size + self.comment_dis_line) * self.para_num + 120 self.s5 = s5 s6 = 200 self.s6 = s6 sprt = 5 total_len = s1 + s2 + s3 + s4 + s5 + s6 + sprt * 5 y1 = s1 y2 = y1 + sprt y2_2 = y2 + s2 y3 = y2_2 + sprt y3_2 = y3 + s3 y4 = y3_2 + sprt y4_2 = y4 + s4 self.y4 = y4 self.y4_2 = y4_2 y5 = y4_2 + sprt y5_2 = y5 + s5 self.y5 = y5 self.y5_2 = y5_2 y6 = y5_2 + sprt y6_2 = y6 + s6 self.y6 = y6 self.y6_2 = y6_2 if num == 4: img = Image.new("RGB", (900, total_len), (255, 255, 255)) draw = ImageDraw.Draw(img) draw.rectangle([(0, 0), (900, y1)], fill=color['title_bg']) #乐高机器人课 draw.rectangle([(0, y2), (900, y2_2)], fill=color['name']) # 姓名 年龄 draw.rectangle([(0, y3), (900, y3_2)], fill=color['crs']) # 课程 draw.rectangle([(0, y4), (900, y4_2)], fill=color['pics']) # 照片 draw.rectangle([(0, y5), (900, y5_2)], fill=color['comments']) # 能力测评 draw.rectangle([(0, y6), (900, y6_2)], fill=color['logo']) # logo draw.rectangle([(pic0[0][0], pic0[0][1]), (pic0[0][2], pic0[0][3])], fill=color['pics_box']) #相框_课程 draw.rectangle([(pic1[0][0], pic1[0][1]), (pic1[0][2], pic1[0][3])], fill=color['pic01']) #相框_1 draw.rectangle([(pic2[0][0], pic2[0][1]), (pic2[0][2], pic2[0][3])], fill=color['pic02']) #相框_2 draw.rectangle([(pic3[0][0], pic3[0][1]), (pic3[0][2], pic3[0][3])], fill=color['pic03']) #相框_3 draw.rectangle([(pic4[0][0], pic4[0][1]), (pic4[0][2], pic4[0][3])], fill=color['pic04']) #相框_4 elif num == 2: img = Image.new("RGB", (900, int(total_len - s4 / 2)), (255, 255, 255)) draw = ImageDraw.Draw(img) draw.rectangle([(0, 0), (900, y1)], fill=color['title_bg']) #乐高机器人课 draw.rectangle([(0, y2), (900, y2_2)], fill=color['name']) # 姓名 年龄 draw.rectangle([(0, y3), (900, y3_2)], fill=color['crs']) # 课程 draw.rectangle([(0, y4), (900, y4_2 - s4 / 2)], fill=color['pics']) # 照片 draw.rectangle([(0, y5 - s4 / 2), (900, y5_2 - s4 / 2)], fill=color['comments']) # 能力测评 draw.rectangle([(0, y6 - s4 / 2), (900, y6_2 - s4 / 2)], fill=color['logo']) # logo draw.rectangle([(pic0[0][0], pic0[0][1]), (pic0[0][2], pic0[0][3])], fill=color['pics_box']) #相框_课程 draw.rectangle([(pic1[0][0], pic1[0][1]), (pic1[0][2], pic1[0][3])], fill=color['pic01']) #相框_1 draw.rectangle([(pic2[0][0], pic2[0][1]), (pic2[0][2], pic2[0][3])], fill=color['pic02']) #相框_2 # draw.rectangle([(pic3[0][0],pic3[0][1]),(pic3[0][2],pic3[0][3])],fill=color['pic03']) #相框_3 # draw.rectangle([(pic4[0][0],pic4[0][1]),(pic4[0][2],pic4[0][3])],fill=color['pic04']) #相框_4 return img def pick_pics(stdName): # print('stdname:',stdName) pic_title_addr = os.path.join(self.ConsDir, crs_nameInput, crs_name + '.jpg') #课程的标题图 ptn = '-.*-' pics_for_crs = [] for root, dirs, files in os.walk( os.path.join(self.picStdDir, stdName)): #学员的照片 for file in files: try: if re.findall(ptn, file)[0][1:-1] == crs_nameInput: PicTags = readConfig.code_to_str( iptcinfo3.IPTCInfo( os.path.join(self.picStdDir, stdName, file))) # print('tags:',PicTags) if '每周课程4+' in PicTags: pics_for_crs.append( os.path.join(self.picStdDir, stdName, file)) except: pass # print(pics_for_crs) # pics=pick_pics(stdName) if len(pics_for_crs) > 3: num = 4 else: num = 2 # print('number:',num) pics_stds_addrs = random.sample(pics_for_crs, num) # print(pics_stds_addrs) sorted_pics_stds_addrs = sortPics(pics_stds_addrs) pics = [pic_title_addr] pics.extend(sorted_pics_stds_addrs) return pics def putImg(img, stdName): print(' 正在置入图片……', end='') pics = pick_pics(stdName) if self.bg_img_num > 3: f_crs, f_01, f_02, f_03, f_04 = pics pic_crs = self.pic_resize(Image.open(f_crs), picWid) pic_01 = self.pic_resize(Image.open(f_01), picWid) pic_02 = self.pic_resize(Image.open(f_02), picWid) pic_03 = self.pic_resize(Image.open(f_03), picWid) pic_04 = self.pic_resize(Image.open(f_04), picWid) _pic_logo = Image.open( 'I:\\大智小超\\公共素材\\图片类\\大智小超新logo.png').convert('RGBA') pic_logo = _pic_logo.resize((350, int(350 / 2.76))) r, g, b, a = pic_logo.split() _pic_qrcode = Image.open( 'I:\\大智小超\\公共素材\\图片类\\大智小超视频号二维码2.png') pic_qrcode = _pic_qrcode.resize((130, 130)) logging.info('照片尺寸:' + ','.join(self.sstr(pic_crs.size))) img.paste(pic_crs, (pic0[1][0], pic0[1][1])) img.paste(pic_01, (pic1[1][0], pic1[1][1])) img.paste(pic_02, (pic2[1][0], pic2[1][1])) img.paste(pic_03, (pic3[1][0], pic3[1][1])) img.paste(pic_04, (pic4[1][0], pic4[1][1])) img.paste(pic_logo, (50, int(self.y5_2 + self.s6 / 2 - 350 / 2.76 / 2)), mask=a) img.paste(pic_qrcode, (700, int(self.y5_2 + self.s6 / 2 - 130 / 2))) else: f_crs, f_01, f_02 = pics pic_crs = self.pic_resize(Image.open(f_crs), picWid) pic_01 = self.pic_resize(Image.open(f_01), picWid) pic_02 = self.pic_resize(Image.open(f_02), picWid) _pic_logo = Image.open( 'I:\\大智小超\\公共素材\\图片类\\大智小超新logo.png').convert('RGBA') pic_logo = _pic_logo.resize((350, int(350 / 2.76))) r, g, b, a = pic_logo.split() _pic_qrcode = Image.open( 'I:\\大智小超\\公共素材\\图片类\\大智小超视频号二维码2.png') pic_qrcode = _pic_qrcode.resize((130, 130)) logging.info('照片尺寸:' + ','.join(self.sstr(pic_crs.size))) img.paste(pic_crs, (pic0[1][0], pic0[1][1])) img.paste(pic_01, (pic1[1][0], pic1[1][1])) img.paste(pic_02, (pic2[1][0], pic2[1][1])) img.paste(pic_logo, (50, int(self.y5_2 - self.s4 / 2) + int(self.s6 / 2 - 350 / 2.76 / 2)), mask=a) img.paste(pic_qrcode, (700, int(self.y5_2 - self.s4 / 2) + int(self.s6 / 2 - 130 / 2))) print('完成') def expScript(name_input): stdname = name_input nickname = teacherCmt[teacherCmt['学生姓名'] == stdname]['昵称'].values.tolist()[0] teacherCmtTxt = teacherCmt[teacherCmt['学生姓名'] == stdname][ str(dateInput) + '-' + crs_nameInput].values.tolist()[0] prsTxt = random.choice(self.PraiseTxt) if teacherCmtTxt != '-': script = stdname + '在“' + crs_info[0] + '”这节课中,' + crs_info[ 2] + '\n' + teacherCmtTxt else: script = stdname + '在“' + crs_info[0] + '”这节课中,' + crs_info[ 2] + '\n' + prsTxt if '#' in script: script = script.replace('#', stdname) if '$' in script: if nickname == '-': nickname = stdname script = script.replace('$', nickname) return script def putTxt(img, stdName, stdAge, KdgtName, ClassName): print(' 正在置入文本……', end='') color = color_list('202101') draw = ImageDraw.Draw(img) draw.text((170, 5), '科', fill=color['t_title_ke1'], font=self.fonts('汉仪超级战甲', 75)) #大题目 draw.text((270, 5), '学', fill=color['t_title_xue'], font=self.fonts('汉仪超级战甲', 75)) #大题目 draw.text((370, 5), '机', fill=color['t_title_ji'], font=self.fonts('汉仪超级战甲', 75)) #大题目 draw.text((470, 5), '器', fill=color['t_title_qi'], font=self.fonts('汉仪超级战甲', 75)) #大题目 draw.text((570, 5), '人', fill=color['t_title_ren'], font=self.fonts('汉仪超级战甲', 75)) #大题目 draw.text((670, 5), '课', fill=color['t_title_ke4'], font=self.fonts('汉仪超级战甲', 75)) #大题目 draw.text((350, 120), stdName, fill=color['t_name'], font=self.fonts('汉仪心海行楷w', 60)) #姓名 # draw.text((530,160), str(stdAge)+'岁', fill = '#6AB34A',font=self.fonts('微软雅黑',60)) #年龄 draw.text((280, 200), KdgtName, fill=color['t_kdgtn'], font=self.fonts('杨任东竹石体', 33)) #幼儿园 draw.text((460, 200), ClassName, fill=color['t_class'], font=self.fonts('杨任东竹石体', 33)) #班级 draw.text((50, 290), '• ' + crs_info[0] + ' •', fill=color['t_crs'], font=self.fonts('华康海报体W12(p)', 40)) #课程名称 draw.text((50, 360), '难度:' + crs_info[3], fill=color['t_diff'], font=self.fonts('汉仪锐智w', 25)) #难度 draw.text((530, 630), '使用教具:' + crs_info[4], fill=color['t_tool'], font=self.fonts('微软雅黑', 22)) #教具 self.put_txt_img(img, crs_info[1], 450, [25, 420], 25, fill=color['t_knlg'], font_name='汉仪锐智w', font_size=28) #知识点 date_txt = '-'.join( [str(dateInput)[0:4], str(dateInput)[4:6], str(dateInput)[6:]]) draw.text((100, 630), date_txt, fill=color['t_date'], font=self.fonts('汉仪心海行楷w', 35)) #日期 # draw.text((50,1490), '能力测评', fill = '#6AB34A',font=font_2) #能力测评 # draw.text((50,1560), 'XX力', fill = '#6AB34A',font=font_3) #XX力 # draw.text((50,1610), 'XX力', fill = '#6AB34A',font=font_3) #XX力 # draw.text((50,1660), 'XX力', fill = '#6AB34A',font=font_3) #XX力 # draw.text((50,1710), 'XX力', fill = '#6AB34A',font=font_3) #XX力 script = expScript(stdName) if self.bg_img_num > 3: self.put_txt_img(img, script, 780, [60, 1440], 20, fill=color['t_tch_cmt'], font_name='丁永康硬笔楷书', font_size=36, addSPC='add_2spaces') #老师评语 draw.text((650, int(self.y5_2 - 45 * 2 + 45 / 2)), TeacherSig, fill=color['t_tch_sig'], font=self.fonts('丁永康硬笔楷书', 45)) #签名 draw.text((500, int(self.y5_2 + self.s6 / 2 - 30)), '长按二维码 → \n关注视频号 →', fill=color['t_bottom'], font=self.fonts('微软雅黑', 30)) else: self.put_txt_img(img, script, 780, [60, 1100], 20, fill=color['t_tch_cmt'], font_name='丁永康硬笔楷书', font_size=36, addSPC='add_2spaces') #老师评语 draw.text( (650, int(self.y5_2 - self.s4 / 2 - 45 * 2 + 45 / 2)), TeacherSig, fill=color['t_tch_sig'], font=self.fonts('丁永康硬笔楷书', 45)) #签名 draw.text( (500, int(self.y5_2 - self.s4 / 2) + int(self.s6 / 2 - 30)), '长按二维码 → \n关注视频号 →', fill=color['t_bottom'], font=self.fonts('微软雅黑', 30)) print('完成') para = basic_para() picWid,picX1,picX2,picX3,picX4,picY1,picY2,picY3,picY4,pic0,pic1,pic2,pic3,pic4= \ para[0],para[1],para[2],para[3],para[4],para[5],para[6],para[7],para[8],para[9],para[10],para[11],para[12],para[13] INFO = read_excel() std_list, crs_info, teacherCmt = INFO['std_list'], INFO[ 'crs_info'], INFO['tch_cmt'] for std in std_list: print('正在处理 {} 的图片:'.format(std[3])) # img=basic_bg() KdgtName, ClassName, stdPY, stdName, stdAge = std[0], std[1], std[ 2], std[3], '-' totalTxt = expScript(stdName) self.allTxt, self.para_num = composing.split_txt_Chn_eng( wid=780, font_size=self.comment_font_size, txt_input=totalTxt, Indent='yes') self.bg_img_num = len(pick_pics(std[2] + std[3])) if self.bg_img_num > 3: img = basic_bg(4) else: img = basic_bg(2) putImg(img, stdPY + stdName) putTxt(img, stdName, stdAge, KdgtName, ClassName) print('正在保存 {} 的图片……'.format(std[3]), end='') if not os.path.exists( os.path.join(self.bg, str(dateInput) + '-' + crs_nameInput)): os.mkdir( os.path.join(self.bg, str(dateInput) + '-' + crs_nameInput)) img.save( os.path.join( self.bg, str(dateInput) + '-' + crs_nameInput, std[2] + stdName + '-' + str(dateInput) + '-' + crs_nameInput + '.jpg')) print('完成') # img.show() print('\n全部完成,保存文件夹:{} 下面的学生文件名'.format(self.bg))
def ht_cal(): txt = txts() wide = 720 ht_title = 220 ht_small_title = 100 ht_book = 300 ht_bottom = 300 ht_gap = 10 ftsize_small_title = 36 ftsize_behavior = 30 dat_behavior = composing.split_txt_Chn_eng( wid=700, font_size=ftsize_behavior, txt_input=txt['behavior'], Indent='no') txt_behavior = dat_behavior[0] ht_behavior = int(dat_behavior[1] * ftsize_behavior * 2.5) ftsize_analysis = 30 dat_analysis = composing.split_txt_Chn_eng( wid=700, font_size=ftsize_analysis, txt_input=txt['analysis'], Indent='no') txt_analysis = dat_analysis[0] ht_analysis = int(dat_analysis[1] * ftsize_analysis * 2.3) ftsize_exp = 30 dat_exp = composing.split_txt_Chn_eng(wid=700, font_size=ftsize_exp, txt_input=txt['exp'], Indent='no') txt_exp = dat_exp[0] ht_exp = int(dat_exp[1] * ftsize_exp * 2.2) ht_exp += 300 total_ht = ht_title + ht_small_title + ht_behavior + ht_book + ht_analysis + ht_exp + ht_bottom + ht_gap * 6 ht = { 'wide': { 'total_wt': wide, 'total': wide, 'small_title': 650, 'behavior': 650, 'book': 650, 'analysis': 650, 'exp': 650, 'bottom': wide }, 'ht': { 'total_ht': total_ht, 'bg_title': ht_title, 'bg_small_title': ht_small_title, 'bg_behavior': ht_behavior, 'bg_book': ht_book, 'bg_analysis': ht_analysis, 'bg_exp': ht_exp, 'bg_bottom': ht_bottom, 'gap': ht_gap }, 'ftsize': { 'small_title': ftsize_small_title, 'behavior': ftsize_behavior, 'exp': ftsize_exp, 'analysis': ftsize_analysis }, 'indent_small_box': 30 } return {'ht': ht, 'txt': txt}
def exp_poster(self, std_name='韦宇浠', start_date='20200930', end_date='20210121', weekday='2', term='2020秋', tch_name='阿晓老师'): info = self.draw_std_term_crs(std_name=std_name, start_date=start_date, end_date=end_date, weekday=weekday) total_crs = info['total_crs'] total_crs.dropna(inplace=True) std_crs = info['std_crs'] std_crs.dropna(inplace=True) std_info = info['std_info'] #学期课程总数 total_crs_num = total_crs.shape[0] #格子的行数 if total_crs_num / 4 == total_crs_num // 4: crs_lines = total_crs_num // 4 else: crs_lines = total_crs_num // 4 + 1 #所有课程格子的总高度 ht_crs = (170 + 14) * crs_lines #学生基本信息 std_school = std_info['机构'].values[0] std_class = std_info['班级'].values[0] comments = WashData.std_feedback(std_name=std_name, xls=self.feedback_xls, weekday=2)['df_term_comment'] #学生学期末评语 comments_for_std = comments[comments['姓名'] == std_name][ term + '学期总结'].values.tolist()[0].replace('#', std_name) std_crs_num = std_crs.shape[0] if total_crs_num == std_crs_num: std_crs_num_txt = '{0}同学在上一阶段的{1}节科学机器人课中,完成了全部课程的学习!'.format( std_name, total_crs_num) else: std_crs_num_txt = '{0}同学在上一阶段的{1}节科学机器人课中,完成了{2}节课的学习,请假{3}节。'.format( std_name, total_crs_num, std_crs_num, total_crs_num - std_crs_num) comments_for_std = std_crs_num_txt + '\n' + comments_for_std font_size_cmt = 30 prgh_nums = composing.split_txt_Chn_eng(wid=636, font_size=font_size_cmt, txt_input=comments_for_std)[1] #评语标题高度 ht_cmt_title = 60 #评语高度 ht_prgh = font_size_cmt * 1.5 * (prgh_nums + 4) ht_title = 110 ht_std = 100 ht_bottom = 210 gap_0 = 12 gap_1 = 13 y_std_1 = 120 y_std_2 = y_std_1 + 100 blocks = [ht_title, ht_std, ht_crs, ht_cmt_title, ht_prgh, ht_bottom] #计算总的高度 ht_total_bg = int(sum(blocks) + gap_0 * 4 + gap_1 * (prgh_nums - 1)) #课程标题坐标 y_crs_title = y_std_2 + gap_0 + 80 #课程格最左上角坐标 y_left_up = y_crs_title + gap_0 def draw_bg(): bg = Image.new('RGBA', (720, ht_total_bg), '#F3F9E4') draw = ImageDraw.Draw(bg) #白底 draw.rectangle([(13, 110), (707, ht_total_bg - 25)], fill='#FFFFFF') #名字绿底 draw.rectangle([(36, y_std_1), (250, y_std_2)], fill='#F3F9E4') draw.rectangle([(36, y_std_2), (684, y_std_2 + 2)], fill='#F3F9E4') return bg def crs_pic(total_crs=total_crs, std_crs=std_crs, odr=0): wid_crs, ht_crs = 150, 170 #学生上过的课程和总课程的差集 sub_set = total_crs.copy() sub_set = sub_set.append(std_crs) sub_set = sub_set.append(std_crs) sub_set.drop_duplicates(subset=['课程名称'], keep=False, inplace=True) crs_bg = Image.new('RGB', (wid_crs, ht_crs), '#F3F3E4') crs_name = total_crs.iloc[odr, :]['课程名称'] crs_date = total_crs.iloc[odr, :]['上课日期'] crs_pic = Image.open( os.path.join(self.design_dir, crs_name, crs_name[4:] + '.jpg')) crs_pic = crs_pic.crop((560, 0, 1280, 720)).resize((110, 110)) crs_bg.paste(crs_pic, (20, 6)) draw = ImageDraw.Draw(crs_bg) ft_size = 19 x_txt = int((150 - len(crs_name[4:]) * ft_size) / 2 + 3) draw.text((x_txt, 122), crs_name[4:], fill='#8fc31f', font=self.font('方正韵动粗黑简', ft_size)) #课程名称 #判断是否有不上的课,如有,变灰 if crs_name not in sub_set['课程名称'].values: draw.text((35, 148), str(crs_date)[:11], fill='#8fc31f', font=self.font('方正韵动粗黑简', 12)) #课程日期 else: draw.text((35, 148), '---------', fill='#8fc31f', font=self.font('方正韵动粗黑简', 12)) #课程日期 crs_bg = ImageEnhance.Brightness(crs_bg).enhance(1.4) crs_bg = crs_bg.convert('L') # crs_bg.show() return crs_bg def draw_crs(): #使用并改变母函数的变量 nonlocal y_left_up bg = draw_bg() wid_crs, ht_crs = 150, 170 draw = ImageDraw.Draw(bg) #分隔线 draw.rectangle([(36, y_crs_title), (684, y_crs_title + 2)], fill='#F3F3E4') cnt = 0 for i in range(crs_lines): x_begin = 40 for j in range(4): if cnt < total_crs_num: crs_block = crs_pic(total_crs=total_crs, std_crs=std_crs, odr=cnt) bg.paste(crs_block, (x_begin, y_left_up)) x_begin = x_begin + wid_crs + 13 cnt += 1 y_left_up = y_left_up + ht_crs + gap_1 #分隔线 draw.rectangle([(36, y_left_up + gap_0), (684, y_left_up + gap_0 + 2)], fill='#F3F3E4') #评语绿底 y_cmt_bg = y_left_up + gap_0 + ht_cmt_title + ht_prgh + 10 draw.rectangle([(36, y_left_up + gap_0 + ht_cmt_title + 10), (684, y_cmt_bg)], fill='#F3F3E4') #二维码,logo _pic_logo = Image.open( 'I:\\大智小超\\公共素材\\图片类\\大智小超新logo.png').convert('RGBA') pic_logo = _pic_logo.resize((210, int(210 / 2.76))) r, g, b, a = pic_logo.split() y_logo = ht_total_bg - 130 _pic_qrcode = Image.open('I:\\大智小超\\公共素材\\图片类\\大智小超视频号二维码2.png') pic_qrcode = _pic_qrcode.resize((100, 100)) bg.paste(pic_logo, (40, int(y_logo + 10)), mask=a) bg.paste(pic_qrcode, (580, int(y_logo))) #文字部分 #标题 draw.text((130, 5), '科学机器人课', fill='#8fc31f', font=self.font('汉仪超级战甲', 78)) #姓名班级 draw.text((60, 142), std_name, fill='#F8B62D', font=self.font('汉仪字酷堂义山楷w', 60)) draw.text((400, 182), std_school + ' ' + std_class, fill='#6C8466', font=self.font('汉仪字酷堂义山楷w', 30)) draw.text((45, y_crs_title - 52), '点亮的课程', fill='#8fc31f', font=self.font('鸿蒙印品', 35)) draw.text((45, y_left_up + gap_0 + 20), '学期评语', fill='#8fc31f', font=self.font('鸿蒙印品', 35)) #评语 composing.put_txt_img(draw=draw,tt=comments_for_std,total_dis=628, \ xy=[45,y_left_up+gap_0+110],dis_line=20,fill='#595757', \ font_name='丁永康硬笔楷书',font_size=font_size_cmt,addSPC="add_2spaces") draw.text((520, y_cmt_bg - 46), tch_name, fill='#595757', font=self.font('丁永康硬笔楷书', 35)) draw.text((380, y_logo + 10), '长按二维码 → \n关注视频号 →', fill='#8E9184', font=self.font('微软雅黑', 25)) bg.show() # bg=bg.convert('RGB') # bg.save('e:/temp/kkkk2.jpg',quality=90) draw_crs()
def PosterDraw(self, crs_nameInput, dateInput, TeacherSig='阿晓老师'): crs_name = crs_nameInput[4:] crs_code = crs_nameInput[0:4] def basic_para(): print('正在初始化参数……', end='') picWid = self.picWid r = 0.75 picX1, picX3 = 10, 10 picX2, picX4 = picX1 + picWid + 20, picX1 + picWid + 20 picY1, picY2 = 720, 720 picY3, picY4 = picY1 + picWid * r + 20, picY1 + picWid * r + 20 pic0 = pic_xy(picWid, int(picWid * r), 440, 290) #标题图 pic1 = pic_xy(picWid, int(picWid * r), picX1, picY1) #照片一 pic2 = pic_xy(picWid, int(picWid * r), picX2, picY2) #照片二 pic3 = pic_xy(picWid, int(picWid * r), picX3, picY3) #照片三 pic4 = pic_xy(picWid, int(picWid * r), picX4, picY4) #照片四 print('完成') return [ picWid, picX1, picX2, picX3, picX4, picY1, picY2, picY3, picY4, pic0, pic1, pic2, pic3, pic4 ] def sortPics(files): newfiles = {} for fn in files: if fn[-3:].lower() == 'jpg': with open(fn, 'rb') as fd: tag = exifread.process_file(fd) t = str(tag['EXIF DateTimeOriginal']).replace( ':', '-', 2) if t in newfiles.keys(): t = t[0:-2] + str(int(t[-2:]) + 1).zfill(2) newfiles[t] = fn else: newfiles[t] = fn # print('exifInfo:',t,fn) newList = [] for i in sorted(newfiles): newList.append(newfiles[i]) return newList def read_excel(): print('正在读取学员和课程信息……', end='') infos=WashData.comments_after_class(crs_name_input=crs_nameInput,weekday=self.weekday, \ crs_list=self.crsList,std_info=self.crsStudent, \ tch_cmt=self.eachStd) print('完成') return infos def read_scores(place_input, term, weekday): print('正在读取积分信息……', end='') wd = days_calculate.num_to_ch(str(weekday)) xls_this = os.path.join(self.std_sig_dir, self.place_input, '学生信息表', term + '-学生信息表(周' + wd + ').xlsx') df_this_crs_score = WashData.std_score_this_crs(xls_this) place_dir = os.path.join(self.std_sig_dir, self.place_input) df_all_scores = WashData.std_all_scores(place_dir) print('完成') return { 'this_score': df_this_crs_score, 'all_scores': df_all_scores } def pic_xy(picWid, picHig, x0, y0): #白色矩形 recX0 = x0 recY0 = y0 recX1 = x0 + picWid + 10 recY1 = y0 + picHig + 10 #照片 picX0 = recX0 + 5 picY0 = recY0 + 5 picX1 = picX0 + picWid picY1 = picY0 + picHig return [[int(recX0), int(recY0), int(recX1), int(recY1)], [int(picX0), int(picY0), int(picX1), int(picY1)]] def color_list(list_num='202002'): colors_202002 = { 'title_bg': '#FF9E11', #乐高机器人课 'name': '#FFFFFF', # 姓名 年龄 'crs': '#00b578', #课程 'pics': '#f7f7f7', #照片大框 'pics_box': '#ffffff', #照片相框 'pic01': '#ffffff', 'pic02': '#ffffff', 'pic03': '#ffffff', 'pic04': '#ffffff', 'comments': '#00bde3', #老师评语 'logo': '#ffffff', #logo 't_title_ke1': '#ffffff', 't_title_xue': '#ffffff', 't_title_ji': '#ffffff', 't_title_qi': '#ffffff', 't_title_ren': '#ffffff', 't_title_ke4': '#ffffff', 'scores': '#f7f7f7', #积分底色 'score_left': '#ffffff', 'score_right': '#ffffff', 't_name': '#00b578', #姓名 't_kdgtn': '#00b578', #幼儿园 't_class': '#00b578', #班级 't_crs': '#FFE340', #课程名称 't_diff': '#ffffff', #难度 't_tool': '#ffffff', #教具 't_knlg': '#ffffff', #知识点 't_date': '#ffffff', #日期 't_scores_left': '#8b988e', #积分文字 't_scores_right': '#8b988e', #积分文字 't_scores_title': '#8b988e', #积分标题 't_tch_cmt_title': '#795022', #老师评语标题 't_tch_cmt': '#ffffff', #老师评语 't_tch_sig': '#ffffff', #签名 't_bottom': '#656564' #二维码文字 } colors_202101 = { 'title_bg': '#f7f3c3', #乐高机器人课 'name': '#FFFFFF', # 姓名 年龄 'crs': '#f1f9ee', #课程 'pics': '#f7f7f7', #照片大框 'pics_box': '#ffffff', #照片相框 'pic01': '#ffffff', 'pic02': '#ffffff', 'pic03': '#ffffff', 'pic04': '#ffffff', 'scores': '#f7f7f7', #积分底色 'score_left': '#ffffff', 'score_right': '#ffffff', 'comments': '#f9f9f9', #老师评语 'logo': '#ffffff', #logo 't_title_ke1': '#009ce6', 't_title_xue': '#33b171', 't_title_ji': '#ef9c10', 't_title_qi': '#8bbe19', 't_title_ren': '#dc9ee7', 't_title_ke4': '#b18046', 't_name': '#99633f', #姓名 't_kdgtn': '#99633f', #幼儿园 't_class': '#99633f', #班级 't_crs': '#37a751', #课程名称 't_diff': '#8b988e', #难度 't_tool': '#8b988e', #教具 't_knlg': '#8b988e', #知识点 't_date': '#8b988e', #日期 't_scores_left': '#cc8e28', #积分文字 't_scores_right': '#c8bb9b', #积分文字 't_scores_title': '#b4b4b5', #积分标题 't_tch_cmt_title': '#b4b4b5', #老师评语标题 't_tch_cmt': '#795022', #老师评语 't_tch_sig': '#795022', #签名 't_bottom': '#656564' #二维码文字 } out = eval('colors_' + list_num) return out def basic_bg(num): color = color_list('202101') # y1:第一块左上角纵坐标,y1_2:第一块右下角纵坐标,以此类推 # y及s后面的数字代表: # 1——标题 # 2——姓名、机构 # 3——课程、知识点 # 4——照片(2张或4张) # 5——课堂情况(老师评论),可变,随评论多少而改变。 # score——积分 # 6——logo、二维码 s1 = 100 s2 = 140 s3 = 450 s4 = 700 self.s4 = s4 #评论的高度 s5 = (self.comment_font_size + self.comment_dis_line) * self.para_num + 160 self.s5 = s5 #积分的高度 s_score = 380 #logo的高度 s6 = 200 self.s6 = s6 sprt = 10 if num > 3: total_len = s1 + s2 + s3 + s4 + s_score + s5 + s6 + sprt * 6 else: total_len = s1 + s2 + s3 + s4 + s_score + s5 + s6 + sprt * 6 - s4 // 2 #标题坐标 y1 = 0 y1_2 = y1 + s1 #姓名、机构坐标 y2 = y1_2 + sprt y2_2 = y2 + s2 #课程及知识点坐标 y3 = y2_2 + sprt y3_2 = y3 + s3 #照片坐标 y4 = y3_2 + sprt if num > 3: y4_2 = y4 + s4 else: y4_2 = y4 + s4 // 2 self.y4 = y4 self.y4_2 = y4_2 #课堂情况(老师评论)坐标,变量 y5 = y4_2 + sprt y5_2 = y5 + s5 self.y5 = y5 self.y5_2 = y5_2 #积分坐标 y_score = y5_2 + sprt y_score_2 = y_score + s_score self.y_score = y_score self.y_score_2 = y_score_2 #logo、二维码坐标 y6 = y_score_2 + sprt y6_2 = y6 + s6 self.y6 = y6 self.y6_2 = y6_2 if num == 4: img = Image.new("RGB", (900, total_len), (255, 255, 255)) draw = ImageDraw.Draw(img) draw.rectangle([(0, 0), (900, y1_2)], fill=color['title_bg']) #乐高机器人课 draw.rectangle([(0, y2), (900, y2_2)], fill=color['name']) # 姓名 年龄 draw.rectangle([(0, y3), (900, y3_2)], fill=color['crs']) # 课程 draw.rectangle([(0, y4), (900, y4_2)], fill=color['pics']) # 照片 draw.rectangle([(0, y5), (300, y5 + 80)], fill=color['comments']) # 能力测评标题背景 draw.rectangle([(0, y5 + 80), (900, y5_2)], fill=color['comments']) # 能力测评 draw.rectangle([(0, y6), (900, y6_2)], fill=color['logo']) # logo draw.rectangle([(pic0[0][0], pic0[0][1]), (pic0[0][2], pic0[0][3])], fill=color['pics_box']) #相框_课程 draw.rectangle([(pic1[0][0], pic1[0][1]), (pic1[0][2], pic1[0][3])], fill=color['pic01']) #相框_1 draw.rectangle([(pic2[0][0], pic2[0][1]), (pic2[0][2], pic2[0][3])], fill=color['pic02']) #相框_2 draw.rectangle([(pic3[0][0], pic3[0][1]), (pic3[0][2], pic3[0][3])], fill=color['pic03']) #相框_3 draw.rectangle([(pic4[0][0], pic4[0][1]), (pic4[0][2], pic4[0][3])], fill=color['pic04']) #相框_4 draw.rectangle([(0, y_score), (300, y_score + 80)], fill=color['scores']) #积分标题背景 draw.rectangle([(0, y_score + 80), (900, y_score_2)], fill=color['scores']) #积分 draw.rectangle([(20, y_score + 80 + 20), (440, y_score_2 - 20)], fill=color['score_left']) #积分左 draw.rectangle([(460, y_score + 80 + 20), (880, y_score_2 - 20)], fill=color['score_right']) #积分右 elif num == 2: img = Image.new("RGB", (900, int(total_len)), (255, 255, 255)) draw = ImageDraw.Draw(img) draw.rectangle([(0, 0), (900, y1_2)], fill=color['title_bg']) #乐高机器人课 draw.rectangle([(0, y2), (900, y2_2)], fill=color['name']) # 姓名 年龄 draw.rectangle([(0, y3), (900, y3_2)], fill=color['crs']) # 课程 draw.rectangle([(0, y4), (900, y4_2)], fill=color['pics']) # 照片 draw.rectangle([(0, y5), (300, y5 + 80)], fill=color['comments']) # 能力测评标题背景 draw.rectangle([(0, y5 + 80), (900, y5_2)], fill=color['comments']) # 能力测评 draw.rectangle([(0, y6), (900, y6_2)], fill=color['logo']) # logo draw.rectangle([(pic0[0][0], pic0[0][1]), (pic0[0][2], pic0[0][3])], fill=color['pics_box']) #相框_课程 draw.rectangle([(pic1[0][0], pic1[0][1]), (pic1[0][2], pic1[0][3])], fill=color['pic01']) #相框_1 draw.rectangle([(pic2[0][0], pic2[0][1]), (pic2[0][2], pic2[0][3])], fill=color['pic02']) #相框_2 # draw.rectangle([(pic3[0][0],pic3[0][1]),(pic3[0][2],pic3[0][3])],fill=color['pic03']) #相框_3 # draw.rectangle([(pic4[0][0],pic4[0][1]),(pic4[0][2],pic4[0][3])],fill=color['pic04']) #相框_4 draw.rectangle([(0, y_score), (300, y_score + 80)], fill=color['scores']) #积分标题背景 draw.rectangle([(0, y_score + 80), (900, y_score_2)], fill=color['scores']) #积分 draw.rectangle([(20, y_score + 80 + 20), (440, y_score_2 - 20)], fill=color['score_left']) #积分左 draw.rectangle([(460, y_score + 80 + 20), (880, y_score_2 - 20)], fill=color['score_right']) #积分右 return img def pick_pics(stdName): # print('stdname:',stdName) pic_title_addr = os.path.join(self.ConsDir, crs_nameInput, crs_name + '.jpg') #课程的标题图 ptn = '-.*-' pics_for_crs = [] for root, dirs, files in os.walk( os.path.join(self.picStdDir, stdName)): #学员的照片 for file in files: try: if re.findall(ptn, file)[0][1:-1] == crs_nameInput: PicTags = readConfig.code_to_str( iptcinfo3.IPTCInfo( os.path.join(self.picStdDir, stdName, file))) # print('tags:',PicTags) if '每周课程4+' in PicTags: pics_for_crs.append( os.path.join(self.picStdDir, stdName, file)) except: pass # print(pics_for_crs) # pics=pick_pics(stdName) if len(pics_for_crs) > 3: num = 4 else: num = 2 # print('number:',num) # print(pics_for_crs) pics_stds_addrs = random.sample(pics_for_crs, num) # print(pics_stds_addrs) sorted_pics_stds_addrs = sortPics(pics_stds_addrs) pics = [pic_title_addr] pics.extend(sorted_pics_stds_addrs) return pics def putImg(img, stdName): print(' 正在置入图片……', end='') pics = pick_pics(stdName) if self.bg_img_num > 3: f_crs, f_01, f_02, f_03, f_04 = pics pic_crs = self.pic_resize(Image.open(f_crs), picWid) pic_01 = self.pic_resize(Image.open(f_01), picWid) pic_02 = self.pic_resize(Image.open(f_02), picWid) pic_03 = self.pic_resize(Image.open(f_03), picWid) pic_04 = self.pic_resize(Image.open(f_04), picWid) _pic_logo = Image.open( 'I:\\大智小超\\公共素材\\图片类\\大智小超新logo.png').convert('RGBA') pic_logo = _pic_logo.resize((350, int(350 / 2.76))) r, g, b, a = pic_logo.split() _pic_qrcode = Image.open( 'I:\\大智小超\\公共素材\\图片类\\大智小超视频号二维码2.png') pic_qrcode = _pic_qrcode.resize((130, 130)) _pic_award = Image.open('I:\\大智小超\\公共素材\\图片类\\奖状.png') pic_award = _pic_award.resize((420, 420 * 261 // 419)) r_ad, g_ad, b_ad, a_ad = pic_award.split() logging.info('照片尺寸:' + ','.join(self.sstr(pic_crs.size))) img.paste(pic_crs, (pic0[1][0], pic0[1][1])) img.paste(pic_01, (pic1[1][0], pic1[1][1])) img.paste(pic_02, (pic2[1][0], pic2[1][1])) img.paste(pic_03, (pic3[1][0], pic3[1][1])) img.paste(pic_04, (pic4[1][0], pic4[1][1])) img.paste(pic_logo, (50, int(self.y6 + self.s6 / 2 - 350 / 2.76 / 2)), mask=a) img.paste(pic_qrcode, (700, int(self.y6 + self.s6 / 2 - 130 / 2))) img.paste(pic_award, (20, self.y_score + 100), mask=a_ad) else: f_crs, f_01, f_02 = pics pic_crs = self.pic_resize(Image.open(f_crs), picWid) pic_01 = self.pic_resize(Image.open(f_01), picWid) pic_02 = self.pic_resize(Image.open(f_02), picWid) _pic_logo = Image.open( 'I:\\大智小超\\公共素材\\图片类\\大智小超新logo.png').convert('RGBA') pic_logo = _pic_logo.resize((350, int(350 / 2.76))) r, g, b, a = pic_logo.split() _pic_qrcode = Image.open( 'I:\\大智小超\\公共素材\\图片类\\大智小超视频号二维码2.png') pic_qrcode = _pic_qrcode.resize((130, 130)) _pic_award = Image.open('I:\\大智小超\\公共素材\\图片类\\奖状.png') pic_award = _pic_award.resize((420, 420 * 261 // 419)) r_ad, g_ad, b_ad, a_ad = pic_award.split() logging.info('照片尺寸:' + ','.join(self.sstr(pic_crs.size))) img.paste(pic_crs, (pic0[1][0], pic0[1][1])) img.paste(pic_01, (pic1[1][0], pic1[1][1])) img.paste(pic_02, (pic2[1][0], pic2[1][1])) img.paste(pic_logo, (50, int(self.y6 + self.s6 / 2 - 350 / 2.76 / 2)), mask=a) img.paste(pic_qrcode, (700, int(self.y6 + self.s6 / 2 - 130 / 2))) img.paste(pic_award, (20, self.y_score + 100), mask=a_ad) print('完成') def expScript(name_input): stdname = name_input nickname = teacherCmt[teacherCmt['学生姓名'] == stdname]['昵称'].values.tolist()[0] teacherCmtTxt = teacherCmt[teacherCmt['学生姓名'] == stdname][ str(dateInput) + '-' + crs_nameInput].values.tolist()[0] # if teacherCmtTxt=='-': # teacherCmtTxt=teacherCmt[teacherCmt['学生姓名']=='通用评论'][str(dateInput)+'-'+crs_nameInput].values.tolist()[0] prsTxt = random.choice(self.PraiseTxt) if teacherCmtTxt != '-': script = stdname + '同学在“' + crs_info[0] + '”这节课中,' + crs_info[ 2] + '\n' + teacherCmtTxt else: # script=stdname+'同学在“'+crs_info[0]+'”这节课中,'+crs_info[2]+'\n'+prsTxt #如果该学生评论为空,则读取通用评论。 script = stdname + '同学在“' + crs_info[0] + '”这节课中,' + crs_info[ 2] + '\n' + teacherCmt[teacherCmt['学生姓名'] == '通用评论'][str( dateInput) + '-' + crs_nameInput].values.tolist()[0] if '#' in script: script = script.replace('#', stdname) if '$' in script: if nickname == '-': nickname = stdname script = script.replace('$', nickname) return script def get_std_scores(date_input, crs_name, std_name, df_this_crs_score): this_score = df_this_crs_score['this_score'] std_this_score = this_score[this_score['学生姓名'] == std_name][ str(date_input) + '-' + crs_name].tolist()[0] all_scores = df_this_crs_score['all_scores'] df_std_all_scores = all_scores[all_scores['学生姓名'] == std_name] crs_sc = df_std_all_scores['课堂总积分'].tolist()[0] vrfy_sc = df_std_all_scores['核销积分'].tolist()[0] remain_sc = df_std_all_scores['剩余积分'].tolist()[0] std_all_scores = { 'crs_sc': crs_sc, 'vrfy_sc': vrfy_sc, 'remain_sc': remain_sc } return { 'std_this_score': std_this_score, 'std_all_scores': std_all_scores } def putTxt(img, stdName, stdAge, KdgtName, ClassName): print(' 正在置入文本……', end='') color = color_list('202101') draw = ImageDraw.Draw(img) draw.text((170, 5), '科', fill=color['t_title_ke1'], font=self.fonts('汉仪超级战甲', 75)) #大题目 draw.text((270, 5), '学', fill=color['t_title_xue'], font=self.fonts('汉仪超级战甲', 75)) #大题目 draw.text((370, 5), '机', fill=color['t_title_ji'], font=self.fonts('汉仪超级战甲', 75)) #大题目 draw.text((470, 5), '器', fill=color['t_title_qi'], font=self.fonts('汉仪超级战甲', 75)) #大题目 draw.text((570, 5), '人', fill=color['t_title_ren'], font=self.fonts('汉仪超级战甲', 75)) #大题目 draw.text((670, 5), '课', fill=color['t_title_ke4'], font=self.fonts('汉仪超级战甲', 75)) #大题目 draw.text((350, 120), stdName, fill=color['t_name'], font=self.fonts('汉仪心海行楷w', 60)) #姓名 # draw.text((530,160), str(stdAge)+'岁', fill = '#6AB34A',font=self.fonts('微软雅黑',60)) #年龄 draw.text((280, 200), KdgtName, fill=color['t_kdgtn'], font=self.fonts('杨任东竹石体', 33)) #幼儿园 draw.text((460, 200), ClassName, fill=color['t_class'], font=self.fonts('杨任东竹石体', 33)) #班级 draw.text((50, 290), '• ' + crs_info[0] + ' •', fill=color['t_crs'], font=self.fonts('华康海报体W12(p)', 40)) #课程名称 draw.text((50, 360), '难度:' + crs_info[3], fill=color['t_diff'], font=self.fonts('汉仪锐智w', 25)) #难度 draw.text((530, 630), '使用教具:' + crs_info[4], fill=color['t_tool'], font=self.fonts('微软雅黑', 22)) #教具 self.put_txt_img(img, crs_info[1], 450, [25, 420], 25, fill=color['t_knlg'], font_name='汉仪锐智w', font_size=28) #知识点 date_txt = '-'.join( [str(dateInput)[0:4], str(dateInput)[4:6], str(dateInput)[6:]]) draw.text((100, 630), date_txt, fill=color['t_date'], font=self.fonts('汉仪心海行楷w', 35)) #日期 #评语&积分 script = expScript(stdName) self.put_txt_img(img, script, 780, [60, self.y5 + 115], 20, fill=color['t_tch_cmt'], font_name='汉仪字酷堂经解楷体w', font_size=36, addSPC='add_2spaces') #老师评语 draw.text((650, int(self.y5_2 - 80)), TeacherSig, fill=color['t_tch_sig'], font=self.fonts('汉仪字酷堂经解楷体w', 45)) #签名 draw.text((500, int(self.y6 + self.s6 / 2 - 35)), '长按二维码 → \n关注视频号 →', fill=color['t_bottom'], font=self.fonts('微软雅黑', 30)) draw.text((20, self.y5 + 5), '我的课堂情况', fill=color['t_tch_cmt_title'], font=self.fonts('汉仪糯米团', 45)) #我的课堂情况 draw.text((60, self.y_score + 5), '我的积分', fill=color['t_scores_title'], font=self.fonts('汉仪糯米团', 45)) #我的积分 draw.text((120, self.y_score + 120), '本节课积分', fill=color['t_scores_left'], font=self.fonts('汉仪糯米团', 45)) #本节课积分 std_scores = get_std_scores(date_input=dateInput, crs_name=crs_nameInput, std_name=stdName, df_this_crs_score=df_std_scores) std_this_score = std_scores['std_this_score'] crs_total_sc = std_scores['std_all_scores']['crs_sc'] remain_sc = std_scores['std_all_scores']['remain_sc'] vrfy_sc = std_scores['std_all_scores']['vrfy_sc'] draw.text((210, self.y_score + 200), str(std_this_score) + '分', fill=color['t_scores_left'], font=self.fonts('汉仪糯米团', 75)) #本节课积分 draw.text((490, self.y_score + 160), '可兑换积分:' + str(int(remain_sc)) + ' 分', fill=color['t_scores_right'], font=self.fonts('优设标题', 35)) #可兑换积分 draw.text((490, self.y_score + 210), '累计积分:' + str(int(crs_total_sc)) + ' 分', fill=color['t_scores_right'], font=self.fonts('优设标题', 35)) #累计总积分 draw.text((490, self.y_score + 260), '已兑换积分:' + str(int(vrfy_sc)) + ' 分', fill=color['t_scores_right'], font=self.fonts('优设标题', 35)) #消耗积分 print('完成') para = basic_para() picWid,picX1,picX2,picX3,picX4,picY1,picY2,picY3,picY4,pic0,pic1,pic2,pic3,pic4= \ para[0],para[1],para[2],para[3],para[4],para[5],para[6],para[7],para[8],para[9],para[10],para[11],para[12],para[13] INFO = read_excel() df_std_scores = read_scores(place_input=self.place_input, term=self.term, weekday=self.weekday) std_list, crs_info, teacherCmt = INFO['std_list'], INFO[ 'crs_info'], INFO['tch_cmt'] for std in std_list: print('正在处理 {} 的图片:'.format(std[3])) # img=basic_bg() KdgtName, ClassName, stdPY, stdName, stdAge = std[0], std[1], std[ 2], std[3], '-' totalTxt = expScript(stdName) self.allTxt, self.para_num = composing.split_txt_Chn_eng( wid=780, font_size=self.comment_font_size, txt_input=totalTxt, Indent='yes') self.bg_img_num = len(pick_pics(std[2] + std[3])) if self.bg_img_num > 3: img = basic_bg(4) else: img = basic_bg(2) putImg(img, stdPY + stdName) putTxt(img, stdName, stdAge, KdgtName, ClassName) print('正在保存 {} 的图片……'.format(std[3]), end='') if not os.path.exists( os.path.join(self.bg, str(dateInput)[0:4], str(dateInput) + '-' + crs_nameInput)): os.mkdir( os.path.join(self.bg, str(dateInput)[0:4], str(dateInput) + '-' + crs_nameInput)) img.save( os.path.join( self.bg, str(dateInput)[0:4], str(dateInput) + '-' + crs_nameInput, std[2] + stdName + '-' + str(dateInput) + '-' + crs_nameInput + '.jpg')) print('完成') # img.show() print('\n全部完成,保存文件夹:{} 下面的学生文件名'.format(self.bg))
def exp_poster(self,std_name='韦宇浠',start_date='20200930',end_date='20210121',cmt_date='20210407', \ tb_list=[['2020秋','w2'],['2021春','w4']],tch_name='阿晓老师',mode='all',k=1): print('正在处理……') info = self.get_std_term_crs(std_name=std_name, tb_list=tb_list, start_date=start_date, end_date=end_date) total_crs = info['total_crs'] total_crs.dropna(inplace=True) std_crs = info['std_crs'] std_crs.dropna(inplace=True) std_info = info['std_info'] #学期课程总数 total_crs_num = total_crs.shape[0] #格子的行数 if total_crs_num / 4 == total_crs_num // 4: crs_lines = total_crs_num // 4 else: crs_lines = total_crs_num // 4 + 1 #所有课程格子的总高度 ht_crs = int((170 * k + 14 * k) * crs_lines) #学生基本信息 std_school = std_info['机构'].values[0] std_class = std_info['班级'].values[0] #学生学期末评语 term, weekday = tb_list[-1][0], tb_list[-1][1][1] wd = days_calculate.num_to_ch(weekday) xls = os.path.join(self.feedback_dir, term + '-学生课堂学习情况反馈表(周' + wd + ').xlsx') comments = WashData.std_feedback(std_name=std_name, xls=xls)['df_term_comment'] comments_for_std = comments[comments['学生姓名'] == std_name][ term + '学期总结-' + str(cmt_date)].values.tolist()[0].replace( '#', std_name) std_crs_num = std_crs.shape[0] if mode == 'part': if total_crs_num == std_crs_num: std_crs_num_txt = '{0}同学在上一阶段的{1} 节科学机器人课中,完成了全部课程的学习!'.format( std_name, total_crs_num) else: std_crs_num_txt = '{0}同学在上一阶段的{1} 节科学机器人课中,完成了{2} 节课的学习,请假{3} 节。'.format( std_name, total_crs_num, std_crs_num, total_crs_num - std_crs_num) elif mode == 'all': # if total_crs_num==std_crs_num: std_crs_num_txt = '{0}已经完成了{1} 节科学机器人课程的学习!'.format( std_name, total_crs_num) # else: # std_crs_num_txt='{0}同学在上一阶段的{1} 节科学机器人课中,完成了{2} 节课的学习,请假{3} 节。'.format(std_name,total_crs_num,std_crs_num,total_crs_num-std_crs_num) comments_for_std = std_crs_num_txt + '\n' + comments_for_std font_size_cmt = int(30 * k) prgh_nums = composing.split_txt_Chn_eng(wid=int(636 * k), font_size=font_size_cmt, txt_input=comments_for_std)[1] #评语标题高度 ht_cmt_title = int(60 * k) #评语高度 ht_prgh = int(font_size_cmt * 1.5 * (prgh_nums + 4)) ht_title = int(110 * k) ht_std = int(100 * k) ht_bottom = int(210) gap_0 = int(12 * k) gap_1 = int(13 * k) y_std_1 = int(120 * k) y_std_2 = int((y_std_1 + 100)) blocks = [ht_title, ht_std, ht_crs, ht_cmt_title, ht_prgh, ht_bottom] #计算总的高度 ht_total_bg = int((sum(blocks) + gap_0 * 4 + gap_1 * (prgh_nums - 1))) #课程标题坐标 y_crs_title = int((y_std_2 + gap_0 + 80)) #课程格最左上角坐标 y_left_up = int((y_crs_title + gap_0)) #评语绿底右下坐标 y_cmt_bg = y_left_up + ht_crs + gap_0 + ht_cmt_title + ht_prgh + 30 # draw.rectangle([(int(36*k),y_left_up+gap_0+ht_cmt_title+10),(int(684*k),y_cmt_bg)],fill='#F3F3E4') def draw_bg(): bg = Image.new('RGBA', (int(720 * k), ht_total_bg), '#F3F9E4') draw = ImageDraw.Draw(bg) #白底 draw.rectangle([(int(13 * k), int(110 * k)), (int(707 * k), ht_total_bg - 25)], fill='#FFFFFF') #名字绿底 draw.rectangle([(int(36), y_std_1), (int(250 * k), y_std_2)], fill='#F3F9E4') draw.rectangle([(int(36), y_std_2), (int(684 * k), y_std_2 + 2)], fill='#F3F9E4') return bg def crs_pic(total_crs=total_crs, std_crs=std_crs, odr=0): wid_crs, ht_crs = int(150 * k), int(170 * k) #学生上过的课程和总课程的差集 sub_set = total_crs.copy() sub_set = sub_set.append(std_crs) sub_set = sub_set.append(std_crs) sub_set.drop_duplicates(subset=['课程名称'], keep=False, inplace=True) crs_bg = Image.new('RGB', (wid_crs, ht_crs), '#F3F3E4') crs_name = total_crs.iloc[odr, :]['课程名称'] crs_date = total_crs.iloc[odr, :]['上课日期'] crs_pic = Image.open( os.path.join(self.design_dir, crs_name, crs_name[4:] + '.jpg')) crs_pic = crs_pic.crop((560, 0, 1280, 720)).resize( (int(110 * k), int(110 * k))) crs_bg.paste(crs_pic, (int(20 * k), int(6 * k))) draw = ImageDraw.Draw(crs_bg) ft_size = int(19 * k) x_txt = int(((150 * k - len(crs_name[4:]) * ft_size) / 2 + 3)) draw.text((x_txt, int(122 * k)), crs_name[4:], fill='#8fc31f', font=self.font('方正韵动粗黑简', ft_size)) #课程名称 #判断是否有不上的课,如有,变灰 if crs_name not in sub_set['课程名称'].values: draw.text((int(35 * k), int(148 * k)), str(crs_date)[:11], fill='#8fc31f', font=self.font('方正韵动粗黑简', int(12 * k))) #课程日期 else: draw.text((int(35 * k), int(148 * k)), '---------', fill='#8fc31f', font=self.font('方正韵动粗黑简', int(12 * k))) #课程日期 crs_bg = ImageEnhance.Brightness(crs_bg).enhance(1.4) crs_bg = crs_bg.convert('L') # crs_bg.show() return crs_bg def draw_crs(): print('正在生成图片……', end='') #使用并改变母函数的变量 nonlocal y_left_up bg = draw_bg() wid_crs, ht_crs = int(150 * k), int(170 * k) draw = ImageDraw.Draw(bg) #分隔线 draw.rectangle([(int(36 * k), y_crs_title), (int(684 * k), y_crs_title + 2 * k)], fill='#F3F3E4') cnt = 0 for i in range(crs_lines): x_begin = int(40 * k) for j in range(4): if cnt < total_crs_num: crs_block = crs_pic(total_crs=total_crs, std_crs=std_crs, odr=cnt) bg.paste(crs_block, (x_begin, y_left_up)) x_begin = x_begin + wid_crs + int(13 * k) cnt += 1 y_left_up = y_left_up + ht_crs + gap_1 #分隔线 draw.rectangle([(int(36 * k), y_left_up + gap_0), (int(684 * k), y_left_up + gap_0 + 2)], fill='#F3F3E4') #评语绿底 # y_cmt_bg=y_left_up+gap_0+ht_cmt_title+ht_prgh draw.rectangle( [(int(36 * k), y_left_up + gap_0 + ht_cmt_title + 10), (int(684 * k), y_cmt_bg)], fill='#F3F3E4') #二维码,logo _pic_logo = Image.open( 'I:\\大智小超\\公共素材\\图片类\\大智小超新logo.png').convert('RGBA') pic_logo = _pic_logo.resize((int(210 * k), int(210 * k / 2.76))) r, g, b, a = pic_logo.split() y_logo = int((ht_total_bg - 140)) _pic_qrcode = Image.open('I:\\大智小超\\公共素材\\图片类\\大智小超视频号二维码2.png') pic_qrcode = _pic_qrcode.resize((int(100 * k), int(100 * k))) bg.paste(pic_logo, (int(40 * k), int(y_logo + 10)), mask=a) bg.paste(pic_qrcode, (int(580 * k), int(y_logo - 10))) #文字部分 #标题 draw.text((int(130 * k), int(5 * k)), '科学机器人课', fill='#8fc31f', font=self.font('汉仪超级战甲', int(78 * k))) #姓名班级 draw.text((int(60 * k * 0.9), int(142 * k * 0.9)), std_name, fill='#F8B62D', font=self.font('汉仪字酷堂义山楷w', int(60 * k))) draw.text((int(400 * k * 0.9), int(182 * k * 0.9)), std_school + ' ' + std_class, fill='#6C8466', font=self.font('汉仪字酷堂义山楷w', int(30 * k))) draw.text((int(45), int((y_crs_title - 52))), '点亮的课程', fill='#8fc31f', font=self.font('鸿蒙印品', int(35 * k))) draw.text((int(45), int((y_left_up + gap_0 + 20))), '学期评语', fill='#8fc31f', font=self.font('鸿蒙印品', int(35 * k))) #评语 composing.put_txt_img(draw=draw,tt=comments_for_std,total_dis=int(628*k*0.95), \ xy=[int(58),int((y_left_up+gap_0+110))],dis_line=int(20*k),fill='#595757', \ font_name='丁永康硬笔楷书',font_size=font_size_cmt,addSPC="add_2spaces") draw.text((int(520 * k), int((y_cmt_bg - 46))), tch_name, fill='#595757', font=self.font('丁永康硬笔楷书', 35)) draw.text((int(380 * k), int((y_logo + 10))), '长按二维码 → \n关注视频号 →', fill='#8E9184', font=self.font('微软雅黑', 25)) bg = bg.convert('RGB') savename = os.path.join( self.term_pic_dir, std_name + '-' + cmt_date + '-' + term + '阶段小结.jpg') bg.save(savename, quality=90, subsampling=0) # bg.show() print('图片保存完成,保存路径:{}'.format(savename)) draw_crs()
def exp_a4_16(self,std_name='韦宇浠',start_date='20200930',end_date='20210121',cmt_date='20210407', \ tb_list=[['2020秋','w2'],['2021春','w4']],tch_name='阿晓老师',mode='only16',k=1): print('正在处理……') info = self.get_std_term_crs(std_name=std_name, tb_list=tb_list, start_date=start_date, end_date=end_date) total_crs = info['total_crs'] total_crs.dropna(inplace=True) std_crs = info['std_crs'] std_crs.dropna(inplace=True) std_info = info['std_info'] if mode == 'only16': # if len(std_crs)<16: # print('{} 在{} - {} 期间总共上了{}节课,未上满16节。未生成报告。'.format(std_name,start_date,end_date,len(std_crs))) # exit(0) total_crs = std_crs #学期课程总数 total_crs_num = 16 crs_lines = 2 else: #学期课程总数 total_crs_num = total_crs.shape[0] # 格子的行数 if total_crs_num / 8 == total_crs_num // 8: crs_lines = total_crs_num // 8 else: crs_lines = total_crs_num // 8 + 1 #所有课程格子的总高度 ht_crs = int((316 + 30) * crs_lines) #学生基本信息 std_school = std_info['机构'].values[0] std_class = std_info['班级'].values[0] #学生学期末评语 term, weekday = tb_list[-1][0], tb_list[-1][1][1] wd = days_calculate.num_to_ch(weekday) xls = os.path.join(self.feedback_dir, term + '-学生课堂学习情况反馈表(周' + wd + ').xlsx') comments = WashData.std_feedback(std_name=std_name, xls=xls)['df_term_comment'] comments_for_std = comments[comments['学生姓名'] == std_name][ term + '学期总结-能力-' + str(cmt_date)].values.tolist()[0].replace( '#', std_name) comments_for_std_psycho = comments[comments['学生姓名'] == std_name][ term + '学期总结-心理-' + str(cmt_date)].values.tolist()[0].replace( '#', std_name) # print(std_crs) std_crs_num = std_crs.shape[0] # if mode=='only16': # if total_crs_num==std_crs_num: # std_crs_num_txt='{0}同学在上一阶段的{1} 节科学机器人课中,完成了全部课程的学习!'.format(std_name,total_crs_num) # else: # std_crs_num_txt='{0}同学在上一阶段的{1} 节科学机器人课中,完成了{2} 节课的学习,请假{3} 节。'.format(std_name,total_crs_num,std_crs_num,total_crs_num-std_crs_num) # elif mode=='all': # # if total_crs_num==std_crs_num: # std_crs_num_txt='{0}已经完成了{1} 节科学机器人课程的学习!'.format(std_name,total_crs_num) # else: # std_crs_num_txt='{0}同学在上一阶段的{1} 节科学机器人课中,完成了{2} 节课的学习,请假{3} 节。'.format(std_name,total_crs_num,std_crs_num,total_crs_num-std_crs_num) # comments_for_std=std_crs_num_txt+'\n'+comments_for_std font_size_cmt = int(50 * k) prgh_nums = composing.split_txt_Chn_eng(wid=int(636 * k), font_size=font_size_cmt, txt_input=comments_for_std)[1] #评语标题高度 ht_cmt_title = int(60 * k) #评语高度 ht_prgh = int(font_size_cmt * 1.5 * (prgh_nums + 4)) ht_title = int(110 * k) ht_std = int(100 * k) ht_bottom = int(210) gap_0 = int(12 * k) gap_1 = int(13 * k) y_std_1 = int(120 * k) y_std_2 = int((y_std_1 + 100)) blocks = [ht_title, ht_std, ht_crs, ht_cmt_title, ht_prgh, ht_bottom] #计算总的高度 # ht_total_bg=int((sum(blocks)+gap_0*4+gap_1*(prgh_nums-1))) ht_total_bg = 3508 #课程标题坐标 y_crs_title = int((y_std_2 + gap_0 + 80)) # y_crs_title= #课程格最左上角坐标 y_left_up = 800 #评语绿底右下坐标 y_cmt_bg = y_left_up + ht_crs + gap_0 + ht_cmt_title + ht_prgh + 30 # draw.rectangle([(int(36*k),y_left_up+gap_0+ht_cmt_title+10),(int(684*k),y_cmt_bg)],fill='#F3F3E4') def draw_bg(): bg = Image.new('RGBA', (2481, 3508), '#7197b4') draw = ImageDraw.Draw(bg) #白底 draw.rectangle([(50, 54), (2431, 3454)], fill='#FFFFFF') #评论大框 draw.rectangle([(166, 1720), (2315, 3202)], fill='#FFFFFF', outline='#7197b4', width=2) #玫瑰图底色 # draw.rectangle([(1595,1936),(2295,3155)],fill='#f0f8fb') # draw.rectangle([(1635,2695),(2255,2855)],fill='#ffffff') # draw.rectangle([(1635,2975),(2255,3125)],fill='#ffffff') #左边能力底色 draw.rectangle([(206, 1740), (1246, 3182)], fill='#f0f8fb') draw.rectangle([(226, 2537), (1226, 3162)], fill='#ffffff') #右边心理底色 draw.rectangle([(1275, 1740), (2295, 3182)], fill='#f0f8fb') draw.rectangle([(1295, 2537), (2275, 3162)], fill='#ffffff') return bg def crs_pic(total_crs=total_crs, std_crs=std_crs, odr=0): wid_crs, ht_crs = int(270 * k), int(351 * k) #学生上过的课程和总课程的差集 sub_set = total_crs.copy() sub_set = sub_set.append(std_crs) sub_set = sub_set.append(std_crs) sub_set.drop_duplicates(subset=['课程名称'], keep=False, inplace=True) crs_bg = Image.new('RGB', (wid_crs, ht_crs), '#7197b4') crs_name = total_crs.iloc[odr, :]['课程名称'] crs_date = total_crs.iloc[odr, :]['上课日期'] crs_pic = Image.open( os.path.join(self.design_dir, crs_name, crs_name[4:] + '.jpg')) crs_pic = crs_pic.crop((560, 0, 1280, 720)).resize( (int(230 * k), int(230 * k))) crs_bg.paste(crs_pic, (int(20 * k), int(20 * k))) draw = ImageDraw.Draw(crs_bg) ft_size = int(30 * k) x_txt = int(((270 * k - len(crs_name[4:]) * ft_size) / 2 + 3)) draw.text((x_txt, int(270 * k)), crs_name[4:], fill='#ffffff', font=self.font('方正韵动粗黑简', ft_size)) #课程名称 # draw.text((int(55*k),int(310*k)),str(crs_date)[:11],fill='#ffffff',font=self.font('方正韵动粗黑简',int(24*k))) #课程日期 #判断是否有不上的课,如有,变灰 if crs_name not in sub_set['课程名称'].values: draw.text((int(55 * k), int(310 * k)), str(crs_date)[:11], fill='#ffffff', font=self.font('方正韵动粗黑简', int(24 * k))) #课程日期 else: draw.text((int(55 * k), int(310 * k)), '---------', fill='#ffffff', font=self.font('方正韵动粗黑简', int(24 * k))) #课程日期 crs_bg = ImageEnhance.Brightness(crs_bg).enhance(1.4) crs_bg = crs_bg.convert('L') # crs_bg.show() return crs_bg def draw_crs(): print('正在生成图片……', end='') #使用并改变母函数的变量 nonlocal y_left_up bg = draw_bg() wid_crs, ht_crs = int(270 * k), int(351 * k) draw = ImageDraw.Draw(bg) #分隔线 # draw.rectangle([(int(36*k),y_crs_title),(int(684*k),y_crs_title+2*k)],fill='#F3F3E4') cnt = 0 for i in range(crs_lines): x_begin = int(80 * k) for j in range(8): if cnt < total_crs_num: try: crs_block = crs_pic(total_crs=total_crs, std_crs=std_crs, odr=cnt) bg.paste(crs_block, (x_begin, y_left_up)) x_begin = x_begin + wid_crs + int(23 * k) cnt += 1 except Exception as e: pass continue y_left_up = y_left_up + ht_crs + gap_1 #分隔线 # draw.rectangle([(int(36*k),y_left_up+gap_0),(int(684*k),y_left_up+gap_0+2)],fill='#F3F3E4') #评语绿底 # y_cmt_bg=y_left_up+gap_0+ht_cmt_title+ht_prgh # draw.rectangle([(int(36*k),y_left_up+gap_0+ht_cmt_title+10),(int(684*k),y_cmt_bg)],fill='#F3F3E4') #二维码,logo _pic_logo = Image.open( os.path.join(self.public_dir, '图片类', '大智小超新logo.png')).convert('RGBA') pic_logo = _pic_logo.resize((int(330 * k), int(330 * k / 2.76))) r, g, b, a = pic_logo.split() y_logo = int((ht_total_bg - 240)) _pic_qrcode = Image.open( os.path.join(self.public_dir, '图片类', '大智小超视频号二维码2.png')) pic_qrcode = _pic_qrcode.resize((int(210 * k), int(210 * k))) bg.paste(pic_logo, (int(130 * k), int(y_logo + 10)), mask=a) bg.paste(pic_qrcode, (int(2190 * k), int(y_logo - 40))) #玫瑰图 rose_and_bar = self.rose_and_bar(std_name=std_name, xls=xls) rose_mat = rose_and_bar['res_rose']['chart'] rose_pic = pic_transfer.mat_to_pil_img(rose_mat) rose_pic = rose_pic.resize( (640, 640 * rose_pic.size[1] // rose_pic.size[0])) rose_pic = rose_pic.crop((0, 0, 620, 640)) bg.paste(rose_pic, (421, 1890)) rose_data = rose_and_bar['res_rose']['data'] #柱形图 # bar_mat=rose_and_bar['res_bar']['chart'] # bar_pic=pic_transfer.mat_to_pil_img(bar_mat) # bar_pic=bar_pic.resize((640,640*rose_pic.size[1]//rose_pic.size[0])) # bar_pic=bar_pic.crop((0,0,620,640)) # bg.paste(bar_pic,(1460,1890)) #雷达图 radar_mat = rose_and_bar['res_radar']['chart'] radar_pic = pic_transfer.mat_to_pil_img(radar_mat) radar_pic = radar_pic.resize( (640, 640 * radar_pic.size[1] // radar_pic.size[0])) # radar_pic=radar_pic.crop((0,0,620,640)) bg.paste(radar_pic, (1460, 1890)) #签名(图片) tch_sig_txt = [] for m, tch_n in enumerate(tch_name): try: pic_tch_sig = Image.open( os.path.join(self.tch_sig_pic_dir, tch_n + '.png')) pic_tch_sig = pic_tch_sig.resize( (200, 200 * pic_tch_sig.size[1] // pic_tch_sig.size[0])) r_sig, g_sig, b_sib, a_sig = pic_tch_sig.split() bg.paste(pic_tch_sig, (950 + m * 1000, 3015), mask=pic_tch_sig) except FileNotFoundError as e: tch_sig_txt.append([m, tch_n]) # print(tch_n,e) #最高和高低的两个能力名称 abl_btm = [rose_data[0][0], rose_data[1][0]] abl_top = [rose_data[3][0], rose_data[4][0]] #文字部分 #标题 draw.text((int(1020 * k), int(101 * k)), '科学机器人课', fill='#7197b4', font=self.font('方正韵动粗黑简', int(78 * k))) draw.text((int(890 * k), int(220 * k)), '课程学习报告', fill='#7197b4', font=self.font('方正韵动粗黑简', int(120 * k))) #姓名班级 ftsz_name = 120 x_name = (2481 - ftsz_name * len(std_name)) // 2 draw.text((int(x_name), int(421 * k)), std_name, fill='#3e3a39', font=self.font('汉仪字酷堂义山楷w', int(ftsz_name * k))) # draw.text((int(400*k*0.9),int(182*k*0.9)),std_school+' '+std_class,fill='#6C8466',font=self.font('汉仪字酷堂义山楷w',int(30*k))) #课程信息 # print(total_crs) prd = total_crs['上课日期'].apply( lambda x: x.strftime('%Y-%m-%d')).tolist() mth_start = prd[0].split('-')[0] + '年' + prd[0].split('-')[1] + '月' mth_end = prd[-1].split('-')[0] + '年' + prd[-1].split('-')[1] + '月' prd_txt = '{}-{}'.format(mth_start, mth_end) std_crs_finish_number = len(std_crs) if len(std_crs) <= 16 else 16 draw.text((930, 580), prd_txt, fill='#7197b4', font=self.font('方正韵动粗黑简', int(50 * k))) # draw.text((820,730),'在大智小超科学实验室学习',fill='#7197b4',font=self.font('方正韵动粗黑简',int(50*k))) draw.text((700, 670), '完成了{}节科学机器人课程的学习'.format(std_crs_finish_number), fill='#7197b4', font=self.font('方正韵动粗黑简', int(72 * k))) draw.text((980, 1594), '学习情况总结', fill='#7197b4', font=self.font('优设标题', int(90 * k))) #能力描述 # format(abl_top[0],abl_top[1],abl_btm[0],abl_btm[1]) # draw.text((1790,2625),'你现在最棒的能力',fill='#9f9c9c',font=self.font('优设标题',int(50*k))) # draw.text((1750,2905),'还可以再提升的能力',fill='#9f9c9c',font=self.font('优设标题',int(50*k))) # draw.text((1750,2715),'• '+abl_top[1],fill=rose_data[-1][2],font=self.font('微软雅黑',int(70*k))) # draw.text((1750,2995),'• '+abl_btm[0],fill=rose_data[0][2],font=self.font('微软雅黑',int(70*k))) # composing.put_txt_img(draw=draw,tt='• '+abl_top[0]+'\n'+'• '+abl_top[1],total_dis=int(800*k*0.95), \ # xy=[1750,2705],dis_line=int(23*k),fill='#7197b4', \ # font_name='微软雅黑',font_size=40,addSPC="add_2spaces") # composing.put_txt_img(draw=draw,tt='• '+abl_btm[0]+'\n'+'• '+abl_btm[1],total_dis=int(800*k*0.95), \ # xy=[1750,2995],dis_line=int(23*k),fill='#7197b4', \ # font_name='微软雅黑',font_size=40,addSPC="add_2spaces") #评语 #左右标题 draw.text((608, 1764), '技能成长', fill='#7197b4', font=self.font('优设标题', int(80 * k))) draw.text((1598, 1764), '社会能力成长', fill='#7197b4', font=self.font('优设标题', int(80 * k))) draw.text((698, 3034), '上课老师:', fill='#7197b4', font=self.font('优设标题', int(50 * k))) draw.text((1618, 3034), '特约心理老师:', fill='#7197b4', font=self.font('优设标题', int(50 * k))) composing.put_txt_img(draw=draw,tt=comments_for_std,total_dis=int(980*k*0.95), \ xy=[248,2607],dis_line=int(23*k),fill='#3e3a39', \ font_name='丁永康硬笔楷书',font_size=font_size_cmt,addSPC="add_2spaces") composing.put_txt_img(draw=draw,tt=comments_for_std_psycho,total_dis=int(980*k*0.95), \ xy=[1313,2607],dis_line=int(23*k),fill='#3e3a39', \ font_name='丁永康硬笔楷书',font_size=font_size_cmt,addSPC="add_2spaces") #签名(如无图片,则用文字) #上课 # draw.text((950,3035),tch_name[0]+'老师',fill='#3e3a39',font=self.font('丁永康硬笔楷书',int(50*k))) draw.text((950, 3100), cmt_date[0:4] + '.' + cmt_date[4:6] + '.' + cmt_date[6:], fill='#3e3a39', font=self.font('丁永康硬笔楷书', int(40 * k))) #心理 # draw.text((1950,3035),tch_name[1]+'老师',fill='#3e3a39',font=self.font('丁永康硬笔楷书',int(50*k))) draw.text((1950, 3100), cmt_date[0:4] + '.' + cmt_date[4:6] + '.' + cmt_date[6:], fill='#3e3a39', font=self.font('丁永康硬笔楷书', int(40 * k))) if tch_sig_txt: for tch_sig_t in tch_sig_txt: if tch_sig_t[0] == 0: draw.text((950, 3035), tch_sig_t[1] + '老师', fill='#3e3a39', font=self.font('丁永康硬笔楷书', int(50 * k))) elif tch_sig_t[0] == 1: draw.text((1950, 3035), tch_sig_t[1] + '老师', fill='#3e3a39', font=self.font('丁永康硬笔楷书', int(50 * k))) else: print('没有该老师签名,请检查。') #slogan draw.text((600, 3300), '让孩子从小玩科学,爱科学,学科学。', fill='#c23030', font=self.font('楷体', int(82 * k))) # draw.text((int(380*k),int((y_logo+10))), '长按二维码 → \n关注视频号 →', fill = '#8E9184',font=self.font('微软雅黑',25)) bg = bg.convert('RGB') savename = os.path.join( self.term_pic_dir, std_name + '-' + cmt_date + '-' + term + '-课程学习报告.jpg') if not os.path.exists(self.term_pic_dir): os.makedirs(self.term_pic_dir) # savename=os.path.join('e:/temp/',std_name+'.jpg') bg.save(savename, quality=90, subsampling=0) # bg.save(savename,quality=95,dpi=(300,300)) # bg.show() print('图片保存完成,保存路径:{}'.format(savename)) draw_crs()