""" 步骤: 1、整理需要处理的款号图-输出款号图文件夹 2、整理所有相关的图片作为素材图 3、按要求进行拼接 """ import os from PIL import ImageFont import sys import settings # from module.view_control.generate_goods_no_detail_pic.detail_generate_base import DetailBase # from module.view_control.generate_goods_no_detail_pic.pic_deal import PictureProcessing is_test_plugins = False try: is_test_plugins = settings.is_test_plugins except: is_test_plugins = False if is_test_plugins: from custom_plugins.plugins_mode.detail_generate_base import DetailBase from custom_plugins.plugins_mode.pic_deal import PictureProcessing else: from plugins_mode.detail_generate_base import DetailBase from plugins_mode.pic_deal import PictureProcessing plugins_name = "详情模板" company_name_list = ["miniso"] template_name = "miniso-1" # 运动鞋详情页 class DetailPicGet(DetailBase): need_view = ["俯视", "侧视", "后跟", "鞋底", "内里"] root = r"{}\resources\detail_temp\miniso\1".format(os.getcwd()) def __init__(self, goods_no, goods_no_value: dict, out_put_dir, windows=None, test=False, excel_data=None, assigned_page_list=None, **kwargs): super().__init__(goods_no, goods_no_value, out_put_dir, windows=windows, excel_data=excel_data, assigned_page_list=assigned_page_list) self.template_name = template_name self.root = r"{}\resources\detail_temp\miniso\1".format(os.getcwd()) self.basic_width = PictureProcessing(r"{}\1.jpg".format(self.root)).width print(f"run {template_name}") # 红色 self.red_color = (248, 55, 69) # 灰色 self.gray_color = (227, 227, 227) self.white_color = (255, 255, 255) self.black_color = (0, 0, 0) self.base_bg_color = (255, 255, 255) self.deal_pic_func_list = [ self.deal_pic_1, self.deal_pic_2, self.deal_pic_3, self.deal_pic_4, # self.deal_pic_5, ] if test: self.run_test() else: self.run_all() def run_test(self): detailed_images = [] detailed_images.append(self.deal_pic_1()) detailed_images.append(self.deal_pic_2()) detailed_images.append(self.deal_pic_3()) detailed_images.append(self.deal_pic_4()) # detailed_images.append(self.deal_pic_5()) img = self.add_pic(detailed_images) if img: self.create_folder(r"{}/{}".format(self.out_put_dir, template_name)) img.save(r"{}/{}/{}.jpg".format(self.out_put_dir, template_name, self.goods_no, format="JPEG")) img.show() # 斜视图展示 多色进行拼接 def deal_pic_1(self): detailed_images = [] font_title = ImageFont.truetype(r"resources\ttf\mi\MiSans-Bold.ttf", 60) # 颜色名称 font_ml = ImageFont.truetype(r"resources\ttf\mi\MiSans-Bold.ttf", 40) # 颜色名称 first_bg = PictureProcessing(r"{}\2.jpeg".format(self.root)) first_bg = first_bg.resize(value=self.basic_width) circle_bg = PictureProcessing(r"{}\circle.png".format(self.root)) circle_bg = circle_bg.resize(value=circle_bg.width + 60) circle_bg = circle_bg.resize(base='high', value=circle_bg.height + 10) title_text = self.get_text_value("标题一") ml_text = self.get_text_value("毫升") title_bg = PictureProcessing().get_text_image_advanced( font=font_title, text=title_text, fill=self.white_color, return_mode="min_image", ) ml_bg = PictureProcessing().get_text_image_advanced( font=font_ml, text=ml_text, fill=self.white_color, return_mode="min_image", ) first_bg = first_bg.paste_img(top_img=title_bg, value=(40, 100), base="nw") circle_bg = circle_bg.paste_img(top_img=ml_bg, value=(0, 0), base="cc") first_bg = first_bg.paste_img(top_img=circle_bg, value=(40, 300), base="nw") goods_art_no_list = list(self.data.keys()) pp_jpg_1, pp_png_1 = self.image_one_pic(return_orign=True, goods_art_no=goods_art_no_list[0], name="俯视", ) pp_jpg_1 = pp_jpg_1.resize(value=self.basic_width / 2.8) pp_png_1 = pp_png_1.resize(value=self.basic_width / 2.8) first_bg = first_bg.to_overlay_pic_advance(top_img=pp_jpg_1, top_png_img=pp_png_1, base="nc", value=(0, 380)) # 图2 second_bg = PictureProcessing("RGB", (self.basic_width, 825), self.white_color) second_bg = second_bg.radius(value=80, circular_pos=(1, 1, 1, 1)) second_font_title = ImageFont.truetype(r"resources\ttf\mi\MiSans-Bold.ttf", 70) # 颜色名称 second_title_text = self.get_text_value("标题二") second_title_bg = PictureProcessing().get_text_image_advanced( font=second_font_title, text=second_title_text, fill=self.black_color, return_mode="min_image", ) second_bg = second_bg.paste_img(top_img=second_title_bg, value=(68, 50), base="nw") second_sub_bg = PictureProcessing("RGB", (self.basic_width * 0.9, 500), self.red_color) second_sub_bg = second_sub_bg.radius(value=80, circular_pos=(1, 1, 1, 1)) _, pp_png_1 = self.image_one_pic(return_orign=True, goods_art_no=goods_art_no_list[0], name="内里", ) pp_cup = pp_png_1.resize(value=second_sub_bg.width * 0.6) second_sub_bg = second_sub_bg.paste_img(top_img=pp_cup, value=(0, 0), base="cc") second_bg = second_bg.paste_img(top_img=second_sub_bg, value=(0, 260), base="nc") # 图2结束 basic_bg = PictureProcessing("RGB", (self.basic_width, first_bg.height + second_bg.height - 100), (227, 227, 227)) basic_bg = basic_bg.paste_img(top_img=first_bg, value=(0, 0), base="nc") basic_bg = basic_bg.paste_img(top_img=second_bg, value=(0, first_bg.height - 120), base="nc") detailed_images.append(basic_bg) return PictureProcessing(im=self.add_pic(detailed_images)) # 展示基础信息 def deal_pic_2(self): detailed_images = [] goods_art_no_list = list(self.data.keys()) # 区域1 font_title = ImageFont.truetype(r"resources\ttf\mi\MiSans-Bold.ttf", 60) # 颜色名称 title_text = self.get_text_value("标题三") area_1 = PictureProcessing("RGB", (self.basic_width * 0.9, 500), self.red_color) area_1 = area_1.radius(value=80, circular_pos=(1, 1, 1, 1)) _, pp_png_1 = self.image_one_pic(return_orign=True, goods_art_no=goods_art_no_list[0], name="侧视", ) pp_png_1_copy = pp_png_1 pp_png_1 = pp_png_1.resize(value=area_1.width * 0.4) pp_png_1 = pp_png_1.rotate_advance(doge=40) area_1 = area_1.paste_img(top_img=pp_png_1, value=(-100, 20), base="en") # 区域1结束 # 区域2 area_2 = PictureProcessing("RGB", (self.basic_width * 0.43, 500), self.red_color) area_2 = area_2.radius(value=40, circular_pos=(1, 1, 1, 1)) pp_png_1_copy = pp_png_1_copy.resize(value=area_2.width * 1.1) pp_png_1_copy = pp_png_1_copy.rotate_advance(doge=40) area_2 = area_2.paste_img(top_img=pp_png_1_copy, value=(-area_2.width * 1.1, 50), base="en") # 区域2结束 # 区域3 _, pp_png_3 = self.image_one_pic(return_orign=True, goods_art_no=goods_art_no_list[0], name="后跟", ) area_3 = PictureProcessing("RGB", (self.basic_width * 0.43, area_2.height / 2 - 20), self.red_color) area_3 = area_3.radius(value=40, circular_pos=(1, 1, 1, 1)) pp_png_3 = pp_png_3.resize(value=area_3.width / 1.5) area_3 = area_3.paste_img(top_img=pp_png_3, value=(0, 0), base="en") # 区域3结束 # 区域4 _, pp_png_4 = self.image_one_pic(return_orign=True, goods_art_no=goods_art_no_list[0], name="鞋底", ) area_4 = PictureProcessing("RGB", (self.basic_width * 0.43, area_2.height / 2 - 20), self.red_color) area_4 = area_4.radius(value=40, circular_pos=(1, 1, 1, 1)) pp_png_4 = pp_png_4.resize(value=area_4.width / 1.2) pp_png_4 = pp_png_4.rotate_advance(doge=36) area_4 = area_4.paste_img(top_img=pp_png_4, value=(-40, -80), base="en") # 区域4结束 title_bg = PictureProcessing().get_text_image_advanced( font=font_title, text=title_text, fill=self.black_color, return_mode="min_image", ) basic_bg = PictureProcessing("RGB", (self.basic_width, area_1.height + area_2.height + 170), self.white_color) basic_bg = basic_bg.radius(value=80, circular_pos=(1, 1, 1, 1)) basic_bg = basic_bg.paste_img(top_img=area_1, value=(0, 150), base="nc") basic_bg = basic_bg.paste_img(top_img=area_2, value=(self.basic_width * 0.05, area_1.height + 170), base="nw") basic_bg = basic_bg.paste_img(top_img=area_3, value=(self.basic_width * 0.05, area_1.height + 170), base="en") basic_bg = basic_bg.paste_img(top_img=area_4, value=(self.basic_width * 0.05, area_1.height + area_3.height + 210), base="en") basic_bg = basic_bg.paste_img(top_img=title_bg, value=(self.basic_width * 0.1, 50), base="nw") basic_bg = basic_bg.radius(value=80, circular_pos=(1, 1, 0, 0)) # 文本介绍 # 介绍卖点 font_desc = ImageFont.truetype(r"resources\ttf\mi\MiSans-Semibold.ttf", 35) # 颜色名称 text_list = [ { "text": "细节一", "default": "轻盈缓震,健步如飞,久走不累", "pos": (self.basic_width * 0.08, 458), "base": "nw", }, { "text": "细节二", "default": "透气网面,干爽舒适,告别闷热", "pos": (self.basic_width * 0.08, 1078), "base": "nw", }, { "text": "细节三", "default": "柔韧大底,灵活弯折,自在穿行", "pos": (self.basic_width * 0.3, 858), "base": "en", }, { "text": "细节四", "default": "柔韧大底,灵活弯折,自在穿行", "pos": (self.basic_width * 0.33, 1118), "base": "en", }, ] for text_data in text_list: text = self.get_text_value(text_data["text"]) if not text: text = text_data["default"] temp_pp = PictureProcessing().get_text_image_advanced( font=font_desc, text=text, fill=self.white_color, return_mode="min_image", ) basic_bg = basic_bg.paste_img(top_img=temp_pp, value=text_data["pos"], base=text_data["base"]) hide_basic_bg = PictureProcessing("RGB", (self.basic_width, basic_bg.height), self.gray_color) hide_basic_bg = hide_basic_bg.paste_img(top_img=basic_bg, value=(0, 0), base="cc") detailed_images.append(hide_basic_bg) bottom_bg = PictureProcessing("RGB", (self.basic_width, 150), self.white_color) small_title = ImageFont.truetype(r"resources\ttf\mi\MiSans-Light.ttf", 20) # 颜色名称 small_text = "*数据为第三方实验室侧视所得。保温效果因使用环境\n及初始水温可能略有差异,请以实际为准。" small_text_bg = PictureProcessing().get_text_image_advanced( font=small_title, text=small_text, fill=self.black_color, align="center", return_mode="min_image", ) hide_bottom_bg = PictureProcessing("RGB", (self.basic_width, bottom_bg.height + 20), self.gray_color) bottom_bg = bottom_bg.paste_img(top_img=small_text_bg, value=(0, 0), base="cc") bottom_bg = bottom_bg.radius(value=80, circular_pos=(0, 0, 1, 1)) hide_bottom_bg = hide_bottom_bg.paste_img(top_img=bottom_bg, value=(0, 0), base="nc") detailed_images.append(hide_bottom_bg) return PictureProcessing(im=self.add_pic(detailed_images)) # 细节展示 def deal_pic_3(self): detailed_images = [] goods_art_no_list = list(self.data.keys()) hidden_bg = PictureProcessing("RGB", (self.basic_width, 1140), self.gray_color) white_bg = PictureProcessing("RGB", (self.basic_width, hidden_bg.height - 50), self.white_color) white_bg = white_bg.radius(value=80, circular_pos=(1, 1, 1, 1)) red_bg = PictureProcessing(r"{}\2.jpeg".format(self.root)) red_bg = red_bg.resize(value=white_bg.width * 0.9) red_bg = red_bg.resize(value=white_bg.height - 60, base='high') # 粘贴 pp_jpg_1, pp_png_1 = self.image_one_pic(return_orign=True, goods_art_no=goods_art_no_list[0], name="俯视", ) pp_jpg_1 = pp_jpg_1.resize(value=self.basic_width / 2.3) pp_png_1 = pp_png_1.resize(value=self.basic_width / 2.3) red_bg = red_bg.to_overlay_pic_advance(top_img=pp_jpg_1, top_png_img=pp_png_1, base="nc", value=(0, 80)) red_bg = red_bg.radius(value=80, circular_pos=(1, 1, 1, 1)) font_ml = ImageFont.truetype(r"resources\ttf\mi\MiSans-Bold.ttf", 40) # 颜色名称 circle_bg = PictureProcessing(r"{}\circle.png".format(self.root)) circle_bg = circle_bg.resize(value=circle_bg.width + 80) ml_text = "产品实拍" ml_bg = PictureProcessing().get_text_image_advanced( font=font_ml, text=ml_text, fill=self.white_color, return_mode="min_image", ) circle_bg = circle_bg.paste_img(top_img=ml_bg, value=(0, 0), base="cc") red_bg = red_bg.paste_img(top_img=circle_bg, value=(40, 50), base="nw") white_bg = white_bg.paste_img(top_img=red_bg, value=(0, 0), base="cc") hidden_bg = hidden_bg.paste_img(top_img=white_bg, value=(0, 0), base="cc") # 展示鞋面材质 粘贴内里顶视图 detailed_images.append(hidden_bg) # raise 1 return PictureProcessing(im=self.add_pic(detailed_images)) # 展示产品信息和颜色图 def deal_pic_4(self): detailed_images = [] face = PictureProcessing(r"{}\face.png".format(self.root)) goods_art_no_list = list(self.data.keys()) font_1 = ImageFont.truetype(r"resources\ttf\mi\MiSans-Bold.ttf", 60) # 颜色名称 hidden_bg = PictureProcessing("RGB", (self.basic_width, 950), self.gray_color) white_bg = PictureProcessing("RGB", (self.basic_width, hidden_bg.height), self.white_color) white_bg = white_bg.radius(value=80, circular_pos=(1, 1, 0, 0)) red_bg2 = PictureProcessing("RGB", (white_bg.width * 0.9, 800), self.red_color) red_bg2 = red_bg2.radius(value=80, circular_pos=(1, 1, 1, 1)) ml_text = "产品信息" ml_bg = PictureProcessing().get_text_image_advanced( font=font_1, text=ml_text, fill=self.black_color, return_mode="min_image", ) _, pp_png_fu = self.image_one_pic(return_orign=True, goods_art_no=goods_art_no_list[0], name="俯视", ) pp_png_fu = pp_png_fu.resize(value=red_bg2.width * 0.4) _, pp_png_ce = self.image_one_pic(return_orign=True, goods_art_no=goods_art_no_list[0], name="侧视", ) pp_png_ce = pp_png_ce.resize(value=red_bg2.width * 0.4) red_bg2 = red_bg2.paste_img(top_img=pp_png_fu, value=(40, 50), base="wc") red_bg2 = red_bg2.paste_img(top_img=pp_png_ce, value=(40, 50), base="ec") white_bg = white_bg.paste_img(top_img=red_bg2, value=(0, 130), base="nc") white_bg = white_bg.paste_img(top_img=face, value=(40, 50), base="en") white_bg = white_bg.paste_img(top_img=ml_bg, value=(40, 50), base="nw") hidden_bg = hidden_bg.paste_img(top_img=white_bg, value=(0, 0), base="cc") detailed_images.append(hidden_bg) bottom = PictureProcessing(r"{}\1.jpg".format(self.root)) detailed_images.append(bottom) return PictureProcessing(im=self.add_pic(detailed_images)) # 添加注意事项 def deal_pic_5(self): detailed_images = [] detailed_images.append(PictureProcessing(r"{}\19.jpg".format(self.root))) detailed_images.append(PictureProcessing(r"{}\20.jpg".format(self.root))) return PictureProcessing(im=self.add_pic(detailed_images)) def copy_view(self, pp_jpg: PictureProcessing, pp_png: PictureProcessing): pp_bg_jpg = PictureProcessing("RGB", (1600, 1600), (255, 255, 255)) pp_bg_png = PictureProcessing("RGBA", (1600, 1600), (255, 255, 255, 0)) pp_jpg_1_list = [pp_jpg, pp_jpg] pp_png_1_list = [pp_png, pp_png] x, y = 0, 0 for index, pp_jpg in enumerate(pp_jpg_1_list): pp_bg_jpg = pp_bg_jpg.to_overlay_pic_advance(top_img=pp_jpg, value=(x, y)) x += pp_jpg.width - 20 x, y = 0, 0 for index, pp_png in enumerate(pp_png_1_list): pp_bg_png = pp_bg_png.paste_img(top_img=pp_png, value=(x, y)) x += pp_jpg.width - 20 min_bbox = pp_bg_png.getbbox() min_bbox = PictureProcessing().expand_bbox(min_bbox, value=50) pp_bg_jpg = pp_bg_jpg.crop(bbox=min_bbox) pp_bg_png = pp_bg_png.crop(bbox=min_bbox) return pp_bg_jpg, pp_bg_png