|
|
@@ -0,0 +1,467 @@
|
|
|
+"""
|
|
|
+步骤:
|
|
|
+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))
|