""" 步骤: 1、整理需要处理的款号图-输出款号图文件夹 2、整理所有相关的图片作为素材图 3、按要求进行拼接 """ import os import time from PIL import Image, ImageFont import sys import settings import requests import json, base64, io # 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 = ["全部"] template_name = "huilima-4" def download_image_pil(url): yzmdata = requests.get(url) tempIm = io.BytesIO(yzmdata.content) im = Image.open(tempIm) return im # 乐福鞋 详情页 class DetailPicGet(DetailBase): need_view = ["俯视", "侧视", "后跟", "鞋底", "内里"] root = r"{}\resources\detail_temp\huilima\4".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, output_queue=None, **kwargs, ): super().__init__( goods_no, goods_no_value, out_put_dir, windows=windows, excel_data=excel_data, assigned_page_list=assigned_page_list, output_queue=output_queue, ) self.template_name = template_name self.root = r"{}\resources\detail_temp\huilima\4".format(os.getcwd()) print("run huilima-1 ") 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_7, self.deal_pic_4, self.deal_pic_5, self.deal_pic_6, ] 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_7()) detailed_images.append(self.deal_pic_4()) detailed_images.append(self.deal_pic_5()) detailed_images.append(self.deal_pic_6()) 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 = [] pp_bg_1 = PictureProcessing(r"{}\1.jpg".format(self.root)) font_1 = ImageFont.truetype(r"resources\ttf\puhui\Medium.ttf", 120) text_list = [ {"text": "标题", "pos": (89, 224)}, {"text": "副标题", "pos": (89, 345)}, ] for text_data in text_list: text = self.get_text_value(text_data["text"]) if text: _pp = PictureProcessing().get_text_image_advanced( font=font_1, text=text, fill=(0, 0, 0), return_mode="min_image", ) pp_bg_1 = pp_bg_1.paste_img( top_img=_pp, value=text_data["pos"], base="nw" ) detailed_images.append(pp_bg_1) # 粘贴组合图 goods_art_no_list = list(self.data.keys()) pp_jpg, pp_png = self.image_one_pic( return_orign=True, goods_art_no=goods_art_no_list[0], name="组合", ) if not pp_jpg: pp_jpg, pp_png = self.image_one_pic( return_orign=True, goods_art_no=goods_art_no_list[0], name="俯视", ) pp_jpg: PictureProcessing pp_png: PictureProcessing pp_jpg = pp_jpg.resize(value=1405) pp_png = pp_png.resize(value=1405) pp_bg_2 = PictureProcessing(r"{}\2.jpg".format(self.root)) pp_bg_2 = pp_bg_2.to_overlay_pic_advance( top_img=pp_jpg, top_png_img=pp_png, base="cc" ) detailed_images.append(pp_bg_2) return PictureProcessing(im=self.add_pic(detailed_images)) # 展示基础信息 def deal_pic_2(self): detailed_images = [] detailed_images.append(PictureProcessing(r"{}\3.jpg".format(self.root))) # 粘贴侧视图 goods_art_no_list = list(self.data.keys()) pp_jpg = self.get_overlay_pic_from_dict( goods_art_no=goods_art_no_list[0], color_name="侧视", bg_color=self.base_bg_color, ) pp_jpg = pp_jpg.resize(value=1098) pp_jpg = pp_jpg.paste_img_invert( top_img=PictureProcessing( "RGB", (1600, pp_jpg.height + 100), self.base_bg_color ), base="cc", ) detailed_images.append(pp_jpg) # 粘贴基础信息 pp_bg_2 = PictureProcessing(r"{}\5.jpg".format(self.root)) font_1 = ImageFont.truetype(r"resources\ttf\puhui\Regular.ttf", 62) text_list = [ {"text": "鞋面材质", "pos": (767, 176)}, {"text": "内里材质", "pos": (1213, 176)}, {"text": "鞋底材质", "pos": (767, 345)}, {"text": "鞋垫材质", "pos": (1213, 345)}, {"text": "跟高", "pos": (767, 616)}, {"text": "前底厚度", "pos": (1196, 616)}, ] for text_data in text_list: text = self.get_text_value(text_data["text"]) if text: _pp = PictureProcessing().get_text_image_advanced( font=font_1, text=text, fill=(0, 0, 0), return_mode="min_image", ) pp_bg_2 = pp_bg_2.paste_img( top_img=_pp, value=text_data["pos"], base="nw" ) detailed_images.append(pp_bg_2) return PictureProcessing(im=self.add_pic(detailed_images)) # 颜色展示 def deal_pic_3(self): detailed_images = [] font_1 = ImageFont.truetype(r"resources\ttf\puhui\Medium.ttf", 34) # 颜色名称 color_pic_list_1 = [] for goods_art_no_dict in self.goods_no_value["货号资料"]: color_name = goods_art_no_dict["颜色名称"] goods_art_no = goods_art_no_dict["货号"] pp_jpg = self.get_overlay_pic_from_dict( goods_art_no=goods_art_no, color_name="侧视", bg_color=self.base_bg_color, ) pp_jpg = pp_jpg.resize(value=390) pp_jpg = pp_jpg.paste_img_invert( top_img=PictureProcessing( "RGBA", (pp_jpg.width, pp_jpg.height + 70), (255, 255, 255, 0) ), base="nw", ) text_image = PictureProcessing().get_text_image_advanced( font=font_1, text="{} / COLOR".format(color_name), fill=(0, 0, 0), return_mode="min_image", ) pp_jpg = pp_jpg.paste_img(top_img=text_image, base="sc", value=(0, 10)) color_pic_list_1.append(pp_jpg) # 颜色列表进行等分展示 all_color_pp = PictureProcessing().horizontal_distribution( color_pic_list_1, bg_width=1114, line_spacing=10, number_per_row=2 ) all_color_pp = all_color_pp.paste_img_invert( top_img=PictureProcessing( "RGB", (1600, all_color_pp.height + 100), self.base_bg_color ), base="cc", value=(0, 0), ) detailed_images.append(all_color_pp) return PictureProcessing(im=self.add_pic(detailed_images)) def deal_pic_7(self): detailed_images = [] temp_bg = PictureProcessing(r"{}\8.jpg".format(self.root)) # temp_bg.width font_1 = ImageFont.truetype(r"resources\ttf\puhui\Bold.ttf", 68) # 颜色名称 goods_art_no_list = list(self.data.keys()) pp_jpg = self.get_overlay_pic_from_dict( goods_art_no=goods_art_no_list[0], color_name="俯视", bg_color=self.base_bg_color, ) # tips = "一只鞋放置在向日葵花园的草地上,鞋子后面有一块石头,石头上还有一只小猫,鞋得前面还有一条小溪,这就要求鞋子的角度、材质、纹理保持不变,背景要求富有创意且有真实感" tips = "The shoes are placed on a light green background.The sun shines from one side, creating a soft shadow effect, and the overall style is fresh and natural, suitable for summer wear. Keep the texture and material of this shoe intact" imageGenerateResult = self.getAiGenerateScenes(image_path=pp_jpg.im, tips=tips) if imageGenerateResult == None: return PictureProcessing(im=self.add_pic(detailed_images)) imageGenerateResult = imageGenerateResult.resize(value=temp_bg.width) imageGenerateResult = imageGenerateResult.radius( value=30, circular_pos=(1, 1, 1, 1) ) real_bg = PictureProcessing("RGB", (temp_bg.width, 500), self.base_bg_color) text_image = PictureProcessing().get_text_image_advanced( font=font_1, text="场景展示", fill=(0, 0, 0), return_mode="min_image", ) real_bg = real_bg.paste_img(top_img=text_image, base="cc", value=(0, 100)) detailed_images.append(real_bg) detailed_images.append(imageGenerateResult) detailed_images.append( PictureProcessing("RGB", (temp_bg.width, 300), self.base_bg_color) ) return PictureProcessing(im=self.add_pic(detailed_images)) def getAiGenerateScenes(self, image_path: Image, tips: str = ""): byte_io = io.BytesIO() # 将图片保存到BytesIO对象中,格式与原图相同 image_path.save(byte_io, format="JPEG") # 获取BytesIO对象中的二进制数据 image_data = byte_io.getvalue() # 使用base64编码将二进制数据转换成Base64字符串 encoded_string = base64.b64encode(image_data).decode("utf-8") url = "https://api.bfl.ai/v1/flux-kontext-max" headers = { "x-key": "70f91c34-e494-4dc2-a7d2-635295136d2d", "Content-Type": "application/json", } payload = json.dumps( { "prompt": tips, "input_image": f"data:image/png;base64,{encoded_string}", "output_format": "jpeg", "aspect_ratio": "9:12", "safety_tolerance": 2, } ) try: response = requests.request("POST", url, headers=headers, data=payload) response.raise_for_status() response_json = response.json() polling_url = response_json.get("polling_url") if polling_url == None: return None request_times = 30 result_image = None i = 0 while i < request_times: response_get = requests.request("GET", polling_url) response_get.raise_for_status() response_get_json = response_get.json() print("获取图片中...", i + 1, "次") print("json数据...", response_get_json) status = response_get_json.get("status") if status != "Ready": time.sleep(1) i += 1 continue result_image = response_get_json.get("result").get("sample") if result_image != None: image_obj = download_image_pil(result_image) print("图片获取成功...") return PictureProcessing(im=image_obj) time.sleep(1) i += 1 except: return None # 展示细节图 def deal_pic_4(self): detailed_images = [] detailed_images.append(PictureProcessing(r"{}\8.jpg".format(self.root))) goods_art_no_list = list(self.data.keys()) goods_art_no = goods_art_no_list[0] font_1 = ImageFont.truetype(r"resources\ttf\puhui\Medium.ttf", 85) # 颜色名称 view_data_list = ["俯视", "俯视", "侧视"] text_list = ["提示1主标题", "提示2主标题", "提示3主标题"] bg_name_list = ["10.jpg", "12.jpg", "14.jpg"] for index, view_name in enumerate(view_data_list): pp_jpg = self.get_overlay_pic_from_dict( goods_art_no=goods_art_no, color_name=view_name, bg_color=(246, 246, 246), ) if index == 0: resize_value = 3200 paste_base = "cc" paste_value = (0, 200) if index == 1: resize_value = 3200 paste_base = "ne" paste_value = (-100, 0) if index == 2: pp_jpg = pp_jpg.transpose(mode="left_right") resize_value = 3513 paste_base = "sw" paste_value = (0, 100) pp_jpg = pp_jpg.resize(value=resize_value) pp_jpg = pp_jpg.paste_img_invert( top_img=PictureProcessing("RGB", (1500, 1500), (246, 246, 246)), base=paste_base, value=paste_value, ) pp_jpg = pp_jpg.radius(value=100) pp_jpg = pp_jpg.paste_img_invert( top_img=PictureProcessing("RGB", (1600, 1600), (255, 255, 255)), base="cc", ) detailed_images.append(pp_jpg) # 添加文字 text = self.get_text_value(text_list[index]) if text: pp_text_bg = PictureProcessing( r"{}\{}".format(self.root, bg_name_list[index]) ) _pp = PictureProcessing().get_text_image_advanced( font=font_1, text=text, fill=(0, 0, 0), return_mode="min_image", ) pp_text_bg = pp_text_bg.paste_img(top_img=_pp, value=(73, 0), base="wc") detailed_images.append(pp_text_bg) return PictureProcessing(im=self.add_pic(detailed_images)) # 场景图--产品展示 def deal_pic_5(self): detailed_images = [] detailed_images.append(PictureProcessing(r"{}\15.jpg".format(self.root))) goods_art_no_list = list(self.data.keys()) goods_art_no = goods_art_no_list[0] _flag = True pp_jpg = self.get_overlay_pic_from_dict( goods_art_no=goods_art_no, color_name="组合1", bg_color=(255, 255, 255) ) if pp_jpg: pp_jpg = pp_jpg.paste_img_invert( top_img=PictureProcessing( "RGB", (1600, pp_jpg.height + 200), (255, 255, 255) ), base="cc", ) detailed_images.append(pp_jpg) else: _flag = False pp_jpg = self.get_overlay_pic_from_dict( goods_art_no=goods_art_no, color_name="组合2", bg_color=(255, 255, 255) ) if pp_jpg: pp_jpg = pp_jpg.paste_img_invert( top_img=PictureProcessing( "RGB", (1600, pp_jpg.height + 200), (255, 255, 255) ), base="cc", ) detailed_images.append(pp_jpg) else: _flag = False if not _flag: detailed_images = [] detailed_images.append(PictureProcessing(r"{}\15.jpg".format(self.root))) for goods_art_no_dict in self.goods_no_value["货号资料"]: color_name = goods_art_no_dict["颜色名称"] goods_art_no = goods_art_no_dict["货号"] pp_jpg = self.get_overlay_pic_from_dict( goods_art_no=goods_art_no, color_name="侧视", bg_color=self.base_bg_color, ) pp_jpg = pp_jpg.resize(value=1404) pp_jpg = pp_jpg.paste_img_invert( top_img=PictureProcessing( "RGB", (1600, pp_jpg.height + 200), (255, 255, 255) ), base="cc", ) detailed_images.append(pp_jpg) return PictureProcessing(im=self.add_pic(detailed_images)) # 添加注意事项 def deal_pic_6(self): detailed_images = [] detailed_images.append(PictureProcessing(r"{}\20.jpg".format(self.root))) detailed_images.append(PictureProcessing(r"{}\21.jpg".format(self.root))) return PictureProcessing(im=self.add_pic(detailed_images))