| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479 |
- """
- 步骤:
- 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-6"
- 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 neutral beige tone 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)
- tips = "The image showcases a half-body shot of a model dressed in a gray dress and white ankle socks. The model is taking a step forward, with one foot slightly ahead. The shoes are precisely fitted to the model's feet, ensuring they are neither too large nor too small, with a subtly elevated heel. The background is a simple neutral beige, creating a clean and distraction-free visual effect. Throughout the process, it is essential to preserve the original texture and style of the shoes, including their unique design features and material feel, making the shoes appear realistic and natural as if truly worn by the model."
- imageGenerateResult = self.getAiGenerateScenes(image_path=pp_jpg.im, tips=tips)
- if imageGenerateResult == None:
- detailed_images.append(
- PictureProcessing("RGB", (temp_bg.width, 300), self.base_bg_color)
- )
- 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)
- )
- 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))
|