Pārlūkot izejas kodu

场景图生成

rambo 6 mēneši atpakaļ
vecāks
revīzija
6a18731080

+ 467 - 0
python/custom_plugins/plugins/detail_template/huilima/detail_huilima6.py

@@ -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))

+ 2 - 2
python/detail_template_test.py

@@ -4,7 +4,7 @@ import settings
 settings.is_test_plugins = True
 
 
-from custom_plugins.plugins.detail_template.xinnuo.detail_xinnuo1 import (
+from custom_plugins.plugins.detail_template.huilima.detail_huilima6 import (
     DetailPicGet,
 )
 
@@ -14,7 +14,7 @@ for goods_no, value in data.items():
     d = DetailPicGet(
         goods_no=goods_no,
         goods_no_value=value,
-        out_put_dir=r"C:\Development\project\python\CameraMachine\python\output\xinnuo-1",
+        out_put_dir=r"C:\Development\project\python\CameraMachine\python\output\huilima-6",
         test=True,
     )
 print("生成成功")