detail_huilima3.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. """
  2. 步骤:
  3. 1、整理需要处理的款号图-输出款号图文件夹
  4. 2、整理所有相关的图片作为素材图
  5. 3、按要求进行拼接
  6. """
  7. import os
  8. from PIL import ImageFont
  9. import sys
  10. import settings
  11. # from module.view_control.generate_goods_no_detail_pic.detail_generate_base import DetailBase
  12. # from module.view_control.generate_goods_no_detail_pic.pic_deal import PictureProcessing
  13. is_test_plugins = False
  14. try:
  15. is_test_plugins = settings.is_test_plugins
  16. except:
  17. is_test_plugins = False
  18. if is_test_plugins:
  19. from custom_plugins.plugins_mode.detail_generate_base import DetailBase
  20. from custom_plugins.plugins_mode.pic_deal import PictureProcessing
  21. else:
  22. from plugins_mode.detail_generate_base import DetailBase
  23. from plugins_mode.pic_deal import PictureProcessing
  24. plugins_name = "详情模板"
  25. company_name_list = ["全部"]
  26. template_name = "huilima-3"
  27. # 运动鞋详情页
  28. class DetailPicGet(DetailBase):
  29. need_view = ["俯视", "侧视", "后跟", "鞋底", "内里"]
  30. root = r"{}\resources\detail_temp\huilima\3".format(os.getcwd())
  31. def __init__(self, goods_no, goods_no_value: dict, out_put_dir, windows=None, test=False, excel_data=None,
  32. assigned_page_list=None, **kwargs):
  33. super().__init__(goods_no, goods_no_value, out_put_dir, windows=windows, excel_data=excel_data,
  34. assigned_page_list=assigned_page_list)
  35. self.template_name = template_name
  36. self.root = r"{}\resources\detail_temp\huilima\3".format(os.getcwd())
  37. print("run huilima-3 ")
  38. self.base_bg_color = (255, 255, 255)
  39. self.deal_pic_func_list = [
  40. self.deal_pic_1,
  41. self.deal_pic_2,
  42. self.deal_pic_3,
  43. self.deal_pic_4,
  44. self.deal_pic_5,
  45. ]
  46. if test:
  47. self.run_test()
  48. else:
  49. self.run_all()
  50. def run_test(self):
  51. detailed_images = []
  52. detailed_images.append(self.deal_pic_1())
  53. detailed_images.append(self.deal_pic_2())
  54. detailed_images.append(self.deal_pic_3())
  55. detailed_images.append(self.deal_pic_4())
  56. detailed_images.append(self.deal_pic_5())
  57. img = self.add_pic(detailed_images)
  58. if img:
  59. self.create_folder(r"{}/{}".format(self.out_put_dir, template_name))
  60. img.save(r"{}/{}/{}.jpg".format(self.out_put_dir, template_name, self.goods_no, format="JPEG"))
  61. img.show()
  62. # 使用动态拼接的方式进行实现
  63. def deal_pic_1_other(self):
  64. pp_bg = PictureProcessing(r"{}\2.jpg".format(self.root))
  65. goods_art_no_list = list(self.data.keys())
  66. # 粘贴多色图,步骤
  67. # 创建一个白色底大画布,循环粘贴鞋子,先粘贴所有的阴影图,再粘贴透明图,记录最大边。
  68. # 剪裁再粘贴到背景上
  69. pp_jpg_1_list = []
  70. pp_png_1_list = []
  71. for goods_art_no_dict in self.goods_no_value["货号资料"]:
  72. color_name = goods_art_no_dict["颜色名称"]
  73. goods_art_no = goods_art_no_dict["货号"]
  74. pp_jpg_1, pp_png_1 = self.image_one_pic(return_orign=True,
  75. goods_art_no=goods_art_no,
  76. name="俯视",
  77. )
  78. pp_jpg_1_list.append(pp_jpg_1)
  79. pp_png_1_list.append(pp_png_1)
  80. x, y = 0, 0
  81. pp_bg_jpg = PictureProcessing("RGB", (1600, 1600), (255, 255, 255))
  82. if len(pp_jpg_1_list) == 1:
  83. _resize_value = 1100
  84. else:
  85. _resize_value = 900
  86. for index, pp_jpg in enumerate(pp_jpg_1_list):
  87. pp_jpg = pp_jpg.resize(value=_resize_value + 100 * index)
  88. pp_bg_jpg = pp_bg_jpg.to_overlay_pic_advance(top_img=pp_jpg,
  89. value=(x, y))
  90. x += 180
  91. y += 60
  92. x, y = 0, 0
  93. pp_bg_png = PictureProcessing("RGBA", (1600, 1600), (255, 255, 255, 0))
  94. for index, pp_png in enumerate(pp_png_1_list):
  95. pp_png = pp_png.resize(value=_resize_value + 100 * index)
  96. pp_bg_png = pp_bg_png.paste_img(top_img=pp_png,
  97. value=(x, y))
  98. x += 180
  99. y += 60
  100. min_bbox = pp_bg_png.getbbox()
  101. min_bbox = PictureProcessing().expand_bbox(min_bbox)
  102. pp_bg_jpg = pp_bg_jpg.crop(bbox=min_bbox)
  103. pp_bg_png = pp_bg_png.crop(bbox=min_bbox)
  104. pp_bg = pp_bg.to_overlay_pic_advance(top_img=pp_bg_jpg, top_png_img=pp_bg_png, base="cc")
  105. return pp_bg
  106. # 斜视图展示 多色进行拼接
  107. def deal_pic_1(self):
  108. detailed_images = []
  109. detailed_images.append(PictureProcessing(r"{}\1.jpg".format(self.root)))
  110. goods_art_no_list = list(self.data.keys())
  111. # 粘贴多色图,步骤
  112. # 创建一个白色底大画布,循环粘贴鞋子,先粘贴所有的阴影图,再粘贴透明图,记录最大边。
  113. # 剪裁再粘贴到背景上
  114. pp_jpg, pp_png = self.image_one_pic(return_orign=True,
  115. goods_art_no=goods_art_no_list[0],
  116. name="组合",
  117. )
  118. if pp_jpg:
  119. pp_bg = PictureProcessing(r"{}\2.jpg".format(self.root))
  120. pp_jpg = pp_jpg.resize(value=1312)
  121. pp_png = pp_png.resize(value=1312)
  122. pp_bg = pp_bg.to_overlay_pic_advance(top_img=pp_jpg, top_png_img=pp_png, base="cc")
  123. else:
  124. pp_bg = self.deal_pic_1_other()
  125. detailed_images.append(pp_bg)
  126. pp_bg_2 = PictureProcessing(r"{}\3.jpg".format(self.root))
  127. font_1 = ImageFont.truetype(r"resources\ttf\puhui\Regular.ttf", 60) # 颜色名称
  128. text = self.get_text_value("标题")
  129. if text:
  130. _pp = PictureProcessing().get_text_image_advanced(
  131. font=font_1,
  132. text=text,
  133. fill=(255, 255, 255),
  134. return_mode="min_image",
  135. )
  136. pp_bg_2 = pp_bg_2.paste_img(top_img=_pp, value=(0, 362), base="nc")
  137. detailed_images.append(pp_bg_2)
  138. return PictureProcessing(im=self.add_pic(detailed_images))
  139. # 展示基础信息
  140. def deal_pic_2(self):
  141. detailed_images = []
  142. detailed_images.append(PictureProcessing(r"{}\4.jpg".format(self.root)))
  143. pp_bg_1 = PictureProcessing(r"{}\5.jpg".format(self.root))
  144. # 粘贴侧视图
  145. goods_art_no_list = list(self.data.keys())
  146. pp_jpg_1, pp_png_1 = self.image_one_pic(return_orign=True,
  147. goods_art_no=goods_art_no_list[0],
  148. name="侧视",
  149. )
  150. pp_jpg_1 = pp_jpg_1.resize(value=1312)
  151. pp_png_1 = pp_png_1.resize(value=1312)
  152. pp_bg_1 = pp_bg_1.to_overlay_pic_advance(top_img=pp_jpg_1, top_png_img=pp_png_1, base="cc")
  153. # pp_bg_1.show()
  154. detailed_images.append(pp_bg_1)
  155. # 介绍卖点
  156. font_1 = ImageFont.truetype(r"resources\ttf\puhui\Medium.ttf", 60) # 颜色名称
  157. text_list = [
  158. {"text": "卖点1标题", "pos": (0, 58)},
  159. {"text": "卖点2标题", "pos": (0, 283)},
  160. {"text": "卖点3标题", "pos": (0, 505)},
  161. ]
  162. pp_bg_2 = PictureProcessing(r"{}\6.jpg".format(self.root))
  163. for text_data in text_list:
  164. text = self.get_text_value(text_data["text"])
  165. if text:
  166. _pp = PictureProcessing().get_text_image_advanced(
  167. font=font_1,
  168. text=text,
  169. fill=(0, 0, 0),
  170. return_mode="min_image",
  171. )
  172. pp_bg_2 = pp_bg_2.paste_img(top_img=_pp, value=text_data["pos"], base="nc")
  173. detailed_images.append(pp_bg_2)
  174. return PictureProcessing(im=self.add_pic(detailed_images))
  175. # 细节展示
  176. def deal_pic_3(self):
  177. detailed_images = []
  178. goods_art_no_list = list(self.data.keys())
  179. # 展示鞋面材质 粘贴内里顶视图
  180. detailed_images.append(PictureProcessing(r"{}\7.jpg".format(self.root)))
  181. _, pp_png_1 = self.image_one_pic(return_orign=True,
  182. goods_art_no=goods_art_no_list[0],
  183. name="内里",
  184. )
  185. pp_png_1: PictureProcessing
  186. pp_png_1 = pp_png_1.resize(value=2254)
  187. pp_png_1 = pp_png_1.transpose(mode="left_right")
  188. pp_png_1 = pp_png_1.rotate_advance(doge=-30)
  189. pp_bg_1 = PictureProcessing(r"{}\8.jpg".format(self.root))
  190. pp_bg_1 = pp_bg_1.paste_img(top_img=pp_png_1, value=(50, 50))
  191. detailed_images.append(pp_bg_1)
  192. detailed_images.append(PictureProcessing(r"{}\9.jpg".format(self.root)))
  193. # 展示后跟
  194. _, pp_png_2 = self.image_one_pic(return_orign=True,
  195. goods_art_no=goods_art_no_list[0],
  196. name="侧视",
  197. )
  198. pp_png_2: PictureProcessing
  199. pp_png_2 = pp_png_2.resize(value=2116)
  200. # pp_png_1 = pp_png_1.transpose(mode="left_right")
  201. pp_png_2 = pp_png_2.rotate_advance(doge=30)
  202. pp_bg_2 = PictureProcessing(r"{}\10.jpg".format(self.root))
  203. pp_bg_2 = pp_bg_2.paste_img(top_img=pp_png_2, value=(100, 80), base="ne")
  204. detailed_images.append(pp_bg_2)
  205. detailed_images.append(PictureProcessing(r"{}\11.jpg".format(self.root)))
  206. # 展示鞋头
  207. _, pp_png_3 = self.image_one_pic(return_orign=True,
  208. goods_art_no=goods_art_no_list[0],
  209. name="侧视",
  210. )
  211. pp_png_3: PictureProcessing
  212. pp_png_3 = pp_png_3.resize(value=2116)
  213. # pp_png_1 = pp_png_1.transpose(mode="left_right")
  214. pp_png_3 = pp_png_3.rotate_advance(doge=30)
  215. pp_bg_3 = PictureProcessing(r"{}\12.jpg".format(self.root))
  216. pp_bg_3 = pp_bg_3.paste_img(top_img=pp_png_3, value=(294, 125), base="sw")
  217. detailed_images.append(pp_bg_3)
  218. detailed_images.append(PictureProcessing(r"{}\13.jpg".format(self.root)))
  219. # 展示鞋垫
  220. _, pp_png_4 = self.image_one_pic(return_orign=True,
  221. goods_art_no=goods_art_no_list[0],
  222. name="内里",
  223. )
  224. pp_png_4: PictureProcessing
  225. pp_png_4 = pp_png_4.resize(value=2300)
  226. pp_png_4 = pp_png_4.transpose(mode="left_right")
  227. pp_png_4 = pp_png_4.rotate_advance(doge=30)
  228. pp_bg_4 = PictureProcessing(r"{}\14.jpg".format(self.root))
  229. pp_bg_4 = pp_bg_4.paste_img(top_img=pp_png_4, value=(220, 89), base="ne")
  230. detailed_images.append(pp_bg_4)
  231. detailed_images.append(PictureProcessing(r"{}\15.jpg".format(self.root)))
  232. # raise 1
  233. return PictureProcessing(im=self.add_pic(detailed_images))
  234. # 展示产品信息和颜色图
  235. def deal_pic_4(self):
  236. detailed_images = []
  237. detailed_images.append(PictureProcessing(r"{}\16.jpg".format(self.root)))
  238. goods_art_no_list = list(self.data.keys())
  239. font_1 = ImageFont.truetype(r"resources\ttf\puhui\Regular.ttf", 44) # 颜色名称
  240. view_data_list = ["俯视", "内里", "后跟", "鞋底"]
  241. for goods_art_no_dict in self.goods_no_value["货号资料"]:
  242. color_name = goods_art_no_dict["颜色名称"]
  243. goods_art_no = goods_art_no_dict["货号"]
  244. pp_bg_2 = PictureProcessing(r"{}\17.jpg".format(self.root))
  245. # ==================
  246. text_list = [
  247. {"text": "商品货号", "pos": (83, 1137)},
  248. ]
  249. for text_data in text_list:
  250. text = self.get_text_value(text_data["text"])
  251. if text:
  252. _pp = PictureProcessing().get_text_image_advanced(
  253. font=font_1,
  254. text=text,
  255. fill=(136, 136, 136),
  256. return_mode="min_image",
  257. )
  258. pp_bg_2 = pp_bg_2.paste_img(top_img=_pp, value=text_data["pos"])
  259. # ===================
  260. for view_name in view_data_list:
  261. pp_jpg, pp_png = self.image_one_pic(return_orign=True,
  262. goods_art_no=goods_art_no,
  263. name=view_name,
  264. )
  265. pp_jpg: PictureProcessing
  266. pp_png: PictureProcessing
  267. if view_name == "俯视":
  268. resize_value = 723
  269. value = (418, 735)
  270. if view_name == "内里":
  271. resize_value = 512
  272. value = (1243, 273)
  273. if view_name == "后跟":
  274. pp_jpg = pp_jpg.resize(value=500)
  275. pp_png = pp_png.resize(value=500)
  276. pp_jpg, pp_png = self.copy_view(pp_jpg, pp_png)
  277. resize_value = 469
  278. value = (1243, 681)
  279. if view_name == "鞋底":
  280. resize_value = 512
  281. value = (1243, 1111)
  282. pp_jpg = pp_jpg.resize(value=resize_value)
  283. pp_png = pp_png.resize(value=resize_value)
  284. value = (value[0] - pp_jpg.width / 2, value[1] - pp_jpg.height / 2)
  285. pp_bg_2 = pp_bg_2.to_overlay_pic_advance(top_img=pp_jpg, top_png_img=pp_png, base="nw", value=value)
  286. detailed_images.append(pp_bg_2)
  287. return PictureProcessing(im=self.add_pic(detailed_images))
  288. # 添加注意事项
  289. def deal_pic_5(self):
  290. detailed_images = []
  291. detailed_images.append(PictureProcessing(r"{}\19.jpg".format(self.root)))
  292. detailed_images.append(PictureProcessing(r"{}\20.jpg".format(self.root)))
  293. return PictureProcessing(im=self.add_pic(detailed_images))
  294. def copy_view(self, pp_jpg: PictureProcessing, pp_png: PictureProcessing):
  295. pp_bg_jpg = PictureProcessing("RGB", (1600, 1600), (255, 255, 255))
  296. pp_bg_png = PictureProcessing("RGBA", (1600, 1600), (255, 255, 255, 0))
  297. pp_jpg_1_list = [pp_jpg, pp_jpg]
  298. pp_png_1_list = [pp_png, pp_png]
  299. x, y = 0, 0
  300. for index, pp_jpg in enumerate(pp_jpg_1_list):
  301. pp_bg_jpg = pp_bg_jpg.to_overlay_pic_advance(top_img=pp_jpg,
  302. value=(x, y))
  303. x += pp_jpg.width - 20
  304. x, y = 0, 0
  305. for index, pp_png in enumerate(pp_png_1_list):
  306. pp_bg_png = pp_bg_png.paste_img(top_img=pp_png,
  307. value=(x, y))
  308. x += pp_jpg.width - 20
  309. min_bbox = pp_bg_png.getbbox()
  310. min_bbox = PictureProcessing().expand_bbox(min_bbox, value=50)
  311. pp_bg_jpg = pp_bg_jpg.crop(bbox=min_bbox)
  312. pp_bg_png = pp_bg_png.crop(bbox=min_bbox)
  313. return pp_bg_jpg, pp_bg_png