detail_miniso1.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  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 = ["miniso"]
  26. template_name = "miniso-1"
  27. # 运动鞋详情页
  28. class DetailPicGet(DetailBase):
  29. need_view = ["俯视", "侧视", "后跟", "鞋底", "内里"]
  30. root = r"{}\resources\detail_temp\miniso\1".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\miniso\1".format(os.getcwd())
  37. self.basic_width = PictureProcessing(r"{}\1.jpg".format(self.root)).width
  38. print(f"run {template_name}")
  39. # 红色
  40. self.red_color = (248, 55, 69)
  41. # 灰色
  42. self.gray_color = (227, 227, 227)
  43. self.white_color = (255, 255, 255)
  44. self.black_color = (0, 0, 0)
  45. self.base_bg_color = (255, 255, 255)
  46. self.deal_pic_func_list = [
  47. self.deal_pic_1,
  48. self.deal_pic_2,
  49. self.deal_pic_3,
  50. self.deal_pic_4,
  51. # self.deal_pic_5,
  52. ]
  53. if test:
  54. self.run_test()
  55. else:
  56. self.run_all()
  57. def run_test(self):
  58. detailed_images = []
  59. detailed_images.append(self.deal_pic_1())
  60. detailed_images.append(self.deal_pic_2())
  61. detailed_images.append(self.deal_pic_3())
  62. detailed_images.append(self.deal_pic_4())
  63. # detailed_images.append(self.deal_pic_5())
  64. img = self.add_pic(detailed_images)
  65. if img:
  66. self.create_folder(r"{}/{}".format(self.out_put_dir, template_name))
  67. img.save(r"{}/{}/{}.jpg".format(self.out_put_dir, template_name, self.goods_no, format="JPEG"))
  68. img.show()
  69. # 斜视图展示 多色进行拼接
  70. def deal_pic_1(self):
  71. detailed_images = []
  72. font_title = ImageFont.truetype(r"resources\ttf\mi\MiSans-Bold.ttf", 60) # 颜色名称
  73. font_ml = ImageFont.truetype(r"resources\ttf\mi\MiSans-Bold.ttf", 40) # 颜色名称
  74. first_bg = PictureProcessing(r"{}\2.jpeg".format(self.root))
  75. first_bg = first_bg.resize(value=self.basic_width)
  76. circle_bg = PictureProcessing(r"{}\circle.png".format(self.root))
  77. circle_bg = circle_bg.resize(value=circle_bg.width + 60)
  78. circle_bg = circle_bg.resize(base='high', value=circle_bg.height + 10)
  79. title_text = self.get_text_value("标题一")
  80. ml_text = self.get_text_value("毫升")
  81. title_bg = PictureProcessing().get_text_image_advanced(
  82. font=font_title,
  83. text=title_text,
  84. fill=self.white_color,
  85. return_mode="min_image",
  86. )
  87. ml_bg = PictureProcessing().get_text_image_advanced(
  88. font=font_ml,
  89. text=ml_text,
  90. fill=self.white_color,
  91. return_mode="min_image",
  92. )
  93. first_bg = first_bg.paste_img(top_img=title_bg, value=(40, 100), base="nw")
  94. circle_bg = circle_bg.paste_img(top_img=ml_bg, value=(0, 0), base="cc")
  95. first_bg = first_bg.paste_img(top_img=circle_bg, value=(40, 300), base="nw")
  96. goods_art_no_list = list(self.data.keys())
  97. pp_jpg_1, pp_png_1 = self.image_one_pic(return_orign=True,
  98. goods_art_no=goods_art_no_list[0],
  99. name="俯视",
  100. )
  101. pp_jpg_1 = pp_jpg_1.resize(value=self.basic_width / 2.8)
  102. pp_png_1 = pp_png_1.resize(value=self.basic_width / 2.8)
  103. first_bg = first_bg.to_overlay_pic_advance(top_img=pp_jpg_1, top_png_img=pp_png_1, base="nc", value=(0, 380))
  104. # 图2
  105. second_bg = PictureProcessing("RGB", (self.basic_width, 825), self.white_color)
  106. second_bg = second_bg.radius(value=80, circular_pos=(1, 1, 1, 1))
  107. second_font_title = ImageFont.truetype(r"resources\ttf\mi\MiSans-Bold.ttf", 70) # 颜色名称
  108. second_title_text = self.get_text_value("标题二")
  109. second_title_bg = PictureProcessing().get_text_image_advanced(
  110. font=second_font_title,
  111. text=second_title_text,
  112. fill=self.black_color,
  113. return_mode="min_image",
  114. )
  115. second_bg = second_bg.paste_img(top_img=second_title_bg, value=(68, 50), base="nw")
  116. second_sub_bg = PictureProcessing("RGB", (self.basic_width * 0.9, 500), self.red_color)
  117. second_sub_bg = second_sub_bg.radius(value=80, circular_pos=(1, 1, 1, 1))
  118. _, pp_png_1 = self.image_one_pic(return_orign=True,
  119. goods_art_no=goods_art_no_list[0],
  120. name="内里",
  121. )
  122. pp_cup = pp_png_1.resize(value=second_sub_bg.width * 0.6)
  123. second_sub_bg = second_sub_bg.paste_img(top_img=pp_cup, value=(0, 0), base="cc")
  124. second_bg = second_bg.paste_img(top_img=second_sub_bg, value=(0, 260), base="nc")
  125. # 图2结束
  126. basic_bg = PictureProcessing("RGB", (self.basic_width, first_bg.height + second_bg.height - 100),
  127. (227, 227, 227))
  128. basic_bg = basic_bg.paste_img(top_img=first_bg, value=(0, 0), base="nc")
  129. basic_bg = basic_bg.paste_img(top_img=second_bg, value=(0, first_bg.height - 120), base="nc")
  130. detailed_images.append(basic_bg)
  131. return PictureProcessing(im=self.add_pic(detailed_images))
  132. # 展示基础信息
  133. def deal_pic_2(self):
  134. detailed_images = []
  135. goods_art_no_list = list(self.data.keys())
  136. # 区域1
  137. font_title = ImageFont.truetype(r"resources\ttf\mi\MiSans-Bold.ttf", 60) # 颜色名称
  138. title_text = self.get_text_value("标题三")
  139. area_1 = PictureProcessing("RGB", (self.basic_width * 0.9, 500), self.red_color)
  140. area_1 = area_1.radius(value=80, circular_pos=(1, 1, 1, 1))
  141. _, pp_png_1 = self.image_one_pic(return_orign=True,
  142. goods_art_no=goods_art_no_list[0],
  143. name="侧视",
  144. )
  145. pp_png_1_copy = pp_png_1
  146. pp_png_1 = pp_png_1.resize(value=area_1.width * 0.4)
  147. pp_png_1 = pp_png_1.rotate_advance(doge=40)
  148. area_1 = area_1.paste_img(top_img=pp_png_1, value=(-100, 20), base="en")
  149. # 区域1结束
  150. # 区域2
  151. area_2 = PictureProcessing("RGB", (self.basic_width * 0.43, 500), self.red_color)
  152. area_2 = area_2.radius(value=40, circular_pos=(1, 1, 1, 1))
  153. pp_png_1_copy = pp_png_1_copy.resize(value=area_2.width * 1.1)
  154. pp_png_1_copy = pp_png_1_copy.rotate_advance(doge=40)
  155. area_2 = area_2.paste_img(top_img=pp_png_1_copy, value=(-area_2.width * 1.1, 50), base="en")
  156. # 区域2结束
  157. # 区域3
  158. _, pp_png_3 = self.image_one_pic(return_orign=True,
  159. goods_art_no=goods_art_no_list[0],
  160. name="后跟",
  161. )
  162. area_3 = PictureProcessing("RGB", (self.basic_width * 0.43, area_2.height / 2 - 20), self.red_color)
  163. area_3 = area_3.radius(value=40, circular_pos=(1, 1, 1, 1))
  164. pp_png_3 = pp_png_3.resize(value=area_3.width / 1.5)
  165. area_3 = area_3.paste_img(top_img=pp_png_3, value=(0, 0), base="en")
  166. # 区域3结束
  167. # 区域4
  168. _, pp_png_4 = self.image_one_pic(return_orign=True,
  169. goods_art_no=goods_art_no_list[0],
  170. name="鞋底",
  171. )
  172. area_4 = PictureProcessing("RGB", (self.basic_width * 0.43, area_2.height / 2 - 20), self.red_color)
  173. area_4 = area_4.radius(value=40, circular_pos=(1, 1, 1, 1))
  174. pp_png_4 = pp_png_4.resize(value=area_4.width / 1.2)
  175. pp_png_4 = pp_png_4.rotate_advance(doge=36)
  176. area_4 = area_4.paste_img(top_img=pp_png_4, value=(-40, -80), base="en")
  177. # 区域4结束
  178. title_bg = PictureProcessing().get_text_image_advanced(
  179. font=font_title,
  180. text=title_text,
  181. fill=self.black_color,
  182. return_mode="min_image",
  183. )
  184. basic_bg = PictureProcessing("RGB", (self.basic_width, area_1.height + area_2.height + 170), self.white_color)
  185. basic_bg = basic_bg.radius(value=80, circular_pos=(1, 1, 1, 1))
  186. basic_bg = basic_bg.paste_img(top_img=area_1, value=(0, 150), base="nc")
  187. basic_bg = basic_bg.paste_img(top_img=area_2, value=(self.basic_width * 0.05, area_1.height + 170), base="nw")
  188. basic_bg = basic_bg.paste_img(top_img=area_3, value=(self.basic_width * 0.05, area_1.height + 170), base="en")
  189. basic_bg = basic_bg.paste_img(top_img=area_4,
  190. value=(self.basic_width * 0.05, area_1.height + area_3.height + 210), base="en")
  191. basic_bg = basic_bg.paste_img(top_img=title_bg, value=(self.basic_width * 0.1, 50), base="nw")
  192. basic_bg = basic_bg.radius(value=80, circular_pos=(1, 1, 0, 0))
  193. # 文本介绍
  194. # 介绍卖点
  195. font_desc = ImageFont.truetype(r"resources\ttf\mi\MiSans-Semibold.ttf", 35) # 颜色名称
  196. text_list = [
  197. {
  198. "text": "细节一",
  199. "default": "轻盈缓震,健步如飞,久走不累",
  200. "pos": (self.basic_width * 0.08, 458),
  201. "base": "nw",
  202. },
  203. {
  204. "text": "细节二",
  205. "default": "透气网面,干爽舒适,告别闷热",
  206. "pos": (self.basic_width * 0.08, 1078),
  207. "base": "nw",
  208. },
  209. {
  210. "text": "细节三",
  211. "default": "柔韧大底,灵活弯折,自在穿行",
  212. "pos": (self.basic_width * 0.3, 858),
  213. "base": "en",
  214. },
  215. {
  216. "text": "细节四",
  217. "default": "柔韧大底,灵活弯折,自在穿行",
  218. "pos": (self.basic_width * 0.33, 1118),
  219. "base": "en",
  220. },
  221. ]
  222. for text_data in text_list:
  223. text = self.get_text_value(text_data["text"])
  224. if not text:
  225. text = text_data["default"]
  226. temp_pp = PictureProcessing().get_text_image_advanced(
  227. font=font_desc,
  228. text=text,
  229. fill=self.white_color,
  230. return_mode="min_image",
  231. )
  232. basic_bg = basic_bg.paste_img(top_img=temp_pp, value=text_data["pos"], base=text_data["base"])
  233. hide_basic_bg = PictureProcessing("RGB", (self.basic_width, basic_bg.height),
  234. self.gray_color)
  235. hide_basic_bg = hide_basic_bg.paste_img(top_img=basic_bg, value=(0, 0), base="cc")
  236. detailed_images.append(hide_basic_bg)
  237. bottom_bg = PictureProcessing("RGB", (self.basic_width, 150), self.white_color)
  238. small_title = ImageFont.truetype(r"resources\ttf\mi\MiSans-Light.ttf", 20) # 颜色名称
  239. small_text = "*数据为第三方实验室侧视所得。保温效果因使用环境\n及初始水温可能略有差异,请以实际为准。"
  240. small_text_bg = PictureProcessing().get_text_image_advanced(
  241. font=small_title,
  242. text=small_text,
  243. fill=self.black_color,
  244. align="center",
  245. return_mode="min_image",
  246. )
  247. hide_bottom_bg = PictureProcessing("RGB", (self.basic_width, bottom_bg.height + 20),
  248. self.gray_color)
  249. bottom_bg = bottom_bg.paste_img(top_img=small_text_bg, value=(0, 0), base="cc")
  250. bottom_bg = bottom_bg.radius(value=80, circular_pos=(0, 0, 1, 1))
  251. hide_bottom_bg = hide_bottom_bg.paste_img(top_img=bottom_bg, value=(0, 0), base="nc")
  252. detailed_images.append(hide_bottom_bg)
  253. return PictureProcessing(im=self.add_pic(detailed_images))
  254. # 细节展示
  255. def deal_pic_3(self):
  256. detailed_images = []
  257. goods_art_no_list = list(self.data.keys())
  258. hidden_bg = PictureProcessing("RGB", (self.basic_width, 1140), self.gray_color)
  259. white_bg = PictureProcessing("RGB", (self.basic_width, hidden_bg.height - 50), self.white_color)
  260. white_bg = white_bg.radius(value=80, circular_pos=(1, 1, 1, 1))
  261. red_bg = PictureProcessing(r"{}\2.jpeg".format(self.root))
  262. red_bg = red_bg.resize(value=white_bg.width * 0.9)
  263. red_bg = red_bg.resize(value=white_bg.height - 60, base='high')
  264. # 粘贴
  265. pp_jpg_1, pp_png_1 = self.image_one_pic(return_orign=True,
  266. goods_art_no=goods_art_no_list[0],
  267. name="俯视",
  268. )
  269. pp_jpg_1 = pp_jpg_1.resize(value=self.basic_width / 2.3)
  270. pp_png_1 = pp_png_1.resize(value=self.basic_width / 2.3)
  271. red_bg = red_bg.to_overlay_pic_advance(top_img=pp_jpg_1, top_png_img=pp_png_1, base="nc", value=(0, 80))
  272. red_bg = red_bg.radius(value=80, circular_pos=(1, 1, 1, 1))
  273. font_ml = ImageFont.truetype(r"resources\ttf\mi\MiSans-Bold.ttf", 40) # 颜色名称
  274. circle_bg = PictureProcessing(r"{}\circle.png".format(self.root))
  275. circle_bg = circle_bg.resize(value=circle_bg.width + 80)
  276. ml_text = "产品实拍"
  277. ml_bg = PictureProcessing().get_text_image_advanced(
  278. font=font_ml,
  279. text=ml_text,
  280. fill=self.white_color,
  281. return_mode="min_image",
  282. )
  283. circle_bg = circle_bg.paste_img(top_img=ml_bg, value=(0, 0), base="cc")
  284. red_bg = red_bg.paste_img(top_img=circle_bg, value=(40, 50), base="nw")
  285. white_bg = white_bg.paste_img(top_img=red_bg, value=(0, 0), base="cc")
  286. hidden_bg = hidden_bg.paste_img(top_img=white_bg, value=(0, 0), base="cc")
  287. # 展示鞋面材质 粘贴内里顶视图
  288. detailed_images.append(hidden_bg)
  289. # raise 1
  290. return PictureProcessing(im=self.add_pic(detailed_images))
  291. # 展示产品信息和颜色图
  292. def deal_pic_4(self):
  293. detailed_images = []
  294. face = PictureProcessing(r"{}\face.png".format(self.root))
  295. goods_art_no_list = list(self.data.keys())
  296. font_1 = ImageFont.truetype(r"resources\ttf\mi\MiSans-Bold.ttf", 60) # 颜色名称
  297. hidden_bg = PictureProcessing("RGB", (self.basic_width, 950), self.gray_color)
  298. white_bg = PictureProcessing("RGB", (self.basic_width, hidden_bg.height), self.white_color)
  299. white_bg = white_bg.radius(value=80, circular_pos=(1, 1, 0, 0))
  300. red_bg2 = PictureProcessing("RGB", (white_bg.width * 0.9, 800), self.red_color)
  301. red_bg2 = red_bg2.radius(value=80, circular_pos=(1, 1, 1, 1))
  302. ml_text = "产品信息"
  303. ml_bg = PictureProcessing().get_text_image_advanced(
  304. font=font_1,
  305. text=ml_text,
  306. fill=self.black_color,
  307. return_mode="min_image",
  308. )
  309. _, pp_png_fu = self.image_one_pic(return_orign=True,
  310. goods_art_no=goods_art_no_list[0],
  311. name="俯视",
  312. )
  313. pp_png_fu = pp_png_fu.resize(value=red_bg2.width * 0.4)
  314. _, pp_png_ce = self.image_one_pic(return_orign=True,
  315. goods_art_no=goods_art_no_list[0],
  316. name="侧视",
  317. )
  318. pp_png_ce = pp_png_ce.resize(value=red_bg2.width * 0.4)
  319. red_bg2 = red_bg2.paste_img(top_img=pp_png_fu, value=(40, 50), base="wc")
  320. red_bg2 = red_bg2.paste_img(top_img=pp_png_ce, value=(40, 50), base="ec")
  321. white_bg = white_bg.paste_img(top_img=red_bg2, value=(0, 130), base="nc")
  322. white_bg = white_bg.paste_img(top_img=face, value=(40, 50), base="en")
  323. white_bg = white_bg.paste_img(top_img=ml_bg, value=(40, 50), base="nw")
  324. hidden_bg = hidden_bg.paste_img(top_img=white_bg, value=(0, 0), base="cc")
  325. detailed_images.append(hidden_bg)
  326. bottom = PictureProcessing(r"{}\1.jpg".format(self.root))
  327. detailed_images.append(bottom)
  328. return PictureProcessing(im=self.add_pic(detailed_images))
  329. # 添加注意事项
  330. def deal_pic_5(self):
  331. detailed_images = []
  332. detailed_images.append(PictureProcessing(r"{}\19.jpg".format(self.root)))
  333. detailed_images.append(PictureProcessing(r"{}\20.jpg".format(self.root)))
  334. return PictureProcessing(im=self.add_pic(detailed_images))
  335. def copy_view(self, pp_jpg: PictureProcessing, pp_png: PictureProcessing):
  336. pp_bg_jpg = PictureProcessing("RGB", (1600, 1600), (255, 255, 255))
  337. pp_bg_png = PictureProcessing("RGBA", (1600, 1600), (255, 255, 255, 0))
  338. pp_jpg_1_list = [pp_jpg, pp_jpg]
  339. pp_png_1_list = [pp_png, pp_png]
  340. x, y = 0, 0
  341. for index, pp_jpg in enumerate(pp_jpg_1_list):
  342. pp_bg_jpg = pp_bg_jpg.to_overlay_pic_advance(top_img=pp_jpg,
  343. value=(x, y))
  344. x += pp_jpg.width - 20
  345. x, y = 0, 0
  346. for index, pp_png in enumerate(pp_png_1_list):
  347. pp_bg_png = pp_bg_png.paste_img(top_img=pp_png,
  348. value=(x, y))
  349. x += pp_jpg.width - 20
  350. min_bbox = pp_bg_png.getbbox()
  351. min_bbox = PictureProcessing().expand_bbox(min_bbox, value=50)
  352. pp_bg_jpg = pp_bg_jpg.crop(bbox=min_bbox)
  353. pp_bg_png = pp_bg_png.crop(bbox=min_bbox)
  354. return pp_bg_jpg, pp_bg_png