detail_xiaosushuoxie3.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  1. """
  2. 步骤:
  3. 1、整理需要处理的款号图-输出款号图文件夹
  4. 2、整理所有相关的图片作为素材图
  5. 3、按要求进行拼接
  6. """
  7. import os
  8. import settings
  9. from PIL import ImageFont
  10. # from module.view_control.generate_goods_no_detail_pic.detail_generate_base import DetailBase
  11. # from module.view_control.generate_goods_no_detail_pic.pic_deal import PictureProcessing
  12. try:
  13. is_test_plugins = settings.is_test_plugins
  14. except:
  15. is_test_plugins = False
  16. if is_test_plugins:
  17. from custom_plugins.plugins_mode.detail_generate_base import DetailBase
  18. from custom_plugins.plugins_mode.pic_deal import PictureProcessing
  19. else:
  20. from plugins_mode.detail_generate_base import DetailBase
  21. from plugins_mode.pic_deal import PictureProcessing
  22. from PIL import Image, ImageDraw
  23. plugins_name = "详情模板"
  24. company_name_list = ["小苏"]
  25. template_name = "xiaosushuoxie-3"
  26. class DetailPicGet(DetailBase):
  27. need_view = ["俯视", "侧视", "后跟", "鞋底", "内里"]
  28. root = r"{}\resources\detail_temp\xiaosushuoxie\3".format(os.getcwd())
  29. def __init__(self, goods_no, goods_no_value: dict, out_put_dir, windows=None, test=False,excel_data=None,assigned_page_list=None):
  30. super().__init__(goods_no, goods_no_value, out_put_dir, windows=windows,excel_data=excel_data,assigned_page_list=assigned_page_list)
  31. self.root = r"{}\resources\detail_temp\xiaosushuoxie\3".format(os.getcwd())
  32. self.template_name = template_name
  33. self.base_bg_color = (236, 226, 211)
  34. self.deal_pic_func_list = [
  35. self.deal_pic_1,
  36. self.deal_pic_2,
  37. self.deal_pic_3,
  38. self.deal_pic_4,
  39. self.deal_pic_5,
  40. ]
  41. if test:
  42. self.run_test()
  43. else:
  44. self.run_all()
  45. def run_test(self):
  46. detailed_images = []
  47. detailed_images.append(self.deal_pic_1())
  48. detailed_images.append(self.deal_pic_2())
  49. detailed_images.append(self.deal_pic_3())
  50. detailed_images.append(self.deal_pic_4())
  51. detailed_images.append(self.deal_pic_5())
  52. img = self.add_pic(detailed_images)
  53. img.save(r"{}/{}.jpg".format(self.out_put_dir,self.goods_no, format="JPEG"))
  54. def deal_pic_1(self):
  55. """ 制作主图 """
  56. detailed_images = []
  57. pp_bg = PictureProcessing(r"{}\template_1.png".format(self.root))
  58. detailed_images.append(pp_bg)
  59. # -------粘贴文字-------
  60. mainTitle = self.get_text_value("标题")
  61. subTitle = self.get_text_value("副标题")
  62. if mainTitle:
  63. font = ImageFont.truetype(r"resources\ttf\puhui\Bold.ttf", 70)
  64. text_1_bg = PictureProcessing("RGB", (1200, 500), self.base_bg_color)
  65. text_1_bg = text_1_bg.get_text_image_advanced(
  66. value=(600, 30),
  67. font=font,
  68. text=mainTitle,
  69. align="center",
  70. anchor="mm",
  71. spacing=5,
  72. fill=(17, 16, 16),
  73. return_mode="min_image_high",
  74. margins=(10, 10, 0, 0)
  75. )
  76. # text_1_bg.show()
  77. detailed_images.append(text_1_bg)
  78. if subTitle:
  79. font = ImageFont.truetype(r"resources\ttf\puhui\Bold.ttf", 40)
  80. text_2_bg = PictureProcessing("RGB", (1200, 500), self.base_bg_color)
  81. text_2_bg = text_2_bg.get_text_image_advanced(
  82. value=(600, 30),
  83. font=font,
  84. text=subTitle,
  85. align="center",
  86. anchor="mm",
  87. spacing=5,
  88. fill=(17, 16, 16),
  89. return_mode="min_image_high",
  90. margins=(10, 10, 0, 0)
  91. )
  92. detailed_images.append(text_2_bg)
  93. # ====粘贴组合图以及其他图
  94. goods_art_no_list = list(self.data.keys())
  95. # 文字排列
  96. _zuhe_pic_list = []
  97. color_name_list = ["组合", "组合2", "组合3"]
  98. for color_name in color_name_list:
  99. pp_1 = self.get_overlay_pic_from_dict(
  100. goods_art_no=goods_art_no_list[0],
  101. color_name=color_name,
  102. bg_color=self.base_bg_color,
  103. )
  104. if not pp_1:
  105. continue
  106. pp_1 = pp_1.resize(value=int(pp_bg.width / 1.45))
  107. pp_1 = pp_1.paste_img_invert(
  108. top_img=PictureProcessing("RGB", (pp_bg.width, pp_1.height + 30), self.base_bg_color),
  109. base="cc")
  110. _zuhe_pic_list.append(pp_1)
  111. if not _zuhe_pic_list:
  112. pp_1 = self.get_overlay_pic_from_dict(
  113. goods_art_no=goods_art_no_list[0],
  114. color_name="俯视",
  115. bg_color=self.base_bg_color,
  116. )
  117. pp_1 = pp_1.resize(value=int(pp_bg.width / 1.45))
  118. pp_1 = pp_1.paste_img_invert(top_img=PictureProcessing("RGB", (pp_bg.width, pp_1.height + 30), self.base_bg_color),
  119. base="cc")
  120. _zuhe_pic_list.append(pp_1)
  121. detailed_images.extend(_zuhe_pic_list)
  122. detailed_images.append(PictureProcessing(r"{}\template_1_1.png".format(self.root)))
  123. return PictureProcessing(im=self.add_pic(detailed_images))
  124. def deal_pic_2(self):
  125. """
  126. 细节解析
  127. """
  128. # 文字排列
  129. detailed_images = []
  130. pp_bg = PictureProcessing(
  131. r"{}\template_2.png".format(
  132. self.root
  133. )
  134. )
  135. detailed_images.append(pp_bg)
  136. goods_art_no_list = list(self.data.keys())
  137. pp_1 = self.get_overlay_pic_from_dict(
  138. goods_art_no=goods_art_no_list[0],
  139. color_name="侧视",
  140. bg_color=self.base_bg_color,
  141. )
  142. pp_1= pp_1.resize(value=pp_bg.width / 1.4)
  143. pp_1= pp_1.paste_img_invert(top_img=PictureProcessing("RGB", (pp_bg.width, pp_1.height + 40), self.base_bg_color),
  144. base="cc"
  145. )
  146. detailed_images.append(pp_1)
  147. pp_bg_bottom = PictureProcessing(r"{}\template_2_1.png".format(self.root))
  148. detailed_images.append(pp_bg_bottom)
  149. return PictureProcessing(im=self.add_pic(detailed_images))
  150. def deal_pic_3(self):
  151. """ 各个颜色细节展示 """
  152. detailed_images = []
  153. pp_bg = PictureProcessing(
  154. r"{}\template_3.png".format(
  155. self.root
  156. )
  157. )
  158. detailed_images.append(pp_bg)
  159. # ----------主图放置
  160. y = 120
  161. pp_list_1 = []
  162. font = ImageFont.truetype(r"resources\ttf\puhui\Medium.ttf", 25)
  163. goods_art_no_list = list(self.data.keys())
  164. all_color_name = []
  165. for index, goods_art_no in enumerate(goods_art_no_list):
  166. pp_jpg = self.get_overlay_pic_from_dict(
  167. goods_art_no=goods_art_no,
  168. color_name="侧视",
  169. bg_color=self.base_bg_color,
  170. )
  171. if pp_jpg is None:
  172. continue
  173. pp_jpg = pp_jpg.resize(value=440)
  174. color_name = self.goods_no_value["货号资料"][index]["颜色名称"]
  175. all_color_name.append(color_name)
  176. text_bg = PictureProcessing("RGB", (440, 200), (255, 255, 255))
  177. text_bg = text_bg.get_text_image_advanced(
  178. value=(220, 10),
  179. font=font,
  180. text="【{}】".format(color_name),
  181. align="center",
  182. anchor="mm",
  183. spacing=5,
  184. fill=(55, 55, 55),
  185. return_mode="min_image_high",
  186. margins=(10, 5, 0, 0)
  187. )
  188. # text_bg.show()
  189. _bg = PictureProcessing("RGB", (440, pp_jpg.height+text_bg.height), (255, 255, 255))
  190. _bg = _bg.paste_img(top_img=pp_jpg)
  191. _bg = _bg.paste_img(top_img=text_bg,value=(0,pp_jpg.height))
  192. pp_list_1.append(_bg)
  193. rows = 2
  194. shoes_bg = PictureProcessing().horizontal_distribution(
  195. pp_list=pp_list_1,
  196. bg_width=1200,
  197. margins=(0, 0, 40, 40),
  198. line_spacing=60,
  199. number_per_row=rows,
  200. )
  201. detailed_images.append(shoes_bg)
  202. font_bg = PictureProcessing(r"{}\template_3_1_new.png".format(self.root))
  203. font = ImageFont.truetype(r"resources\ttf\puhui\Medium.ttf", 30)
  204. base_x = pp_bg.width - 229
  205. base_y = 205
  206. text_list = [
  207. ("-{}".format("-".join(all_color_name)), (base_x, base_y)),
  208. ("-{}".format(self.get_text_value("鞋面材质")), (base_x, base_y+70*1)),
  209. ("-{}".format(self.get_text_value("内里材质")), (base_x, base_y+70*2)),
  210. ("-{}".format(self.get_text_value("鞋底材质")), (base_x, base_y+70*3)),
  211. ("-{}".format(self.get_text_value("鞋垫材质")), (base_x, base_y+70*4 )),
  212. ("-{}".format(self.get_text_value("跟高")), (base_x, base_y+70*5)),
  213. ("-{}".format(self.get_text_value("尺码")), (base_x, base_y+70*6)),
  214. ]
  215. for text_item in text_list:
  216. position = text_item[1]
  217. text_str = text_item[0]
  218. xPos = position[0]
  219. for char in reversed(text_str):
  220. font_bg.add_text(
  221. mode="pixel",
  222. value=(xPos, position[1]),
  223. font=font,
  224. text=char,
  225. align="right",
  226. anchor="mm",
  227. spacing=10,
  228. fill=(30, 30, 30),
  229. )
  230. if not "\u4e00" <= char <= "\u9fff":
  231. xPos -= 20
  232. else:
  233. xPos -= 35
  234. # 其他图片
  235. detailed_images.append(font_bg)
  236. return PictureProcessing(im=self.add_pic(detailed_images))
  237. def deal_pic_4(self):
  238. # =============设计理念================
  239. detail_images = []
  240. top_bg = PictureProcessing(r"{}\template_4.png".format(self.root))
  241. detail_images.append(top_bg)
  242. font_1 = ImageFont.truetype(r"resources\ttf\puhui\Bold.ttf", 40)
  243. # 粘贴文字
  244. text = self.get_text_value("设计理念")
  245. if not text:
  246. text = "引领全新裸足脚感,开启自信步履亲肤\n优质鞋面材质赋予全新舒适脚感\n多元场景穿搭,满足你的不同STYLE"
  247. _, text_height = self.get_font_render_size(text, font_1)
  248. text_bg = PictureProcessing(
  249. "RGB",
  250. (
  251. top_bg.width,
  252. text_height + 350,
  253. ),
  254. (236, 227, 212),
  255. )
  256. goods_art_no_list = list(self.data.keys())
  257. # y = 430
  258. x = top_bg.width / 2
  259. text_bg = text_bg.add_text(
  260. mode="pixel",
  261. value=(x, int(text_bg.height / 2) - 60),
  262. font=font_1,
  263. text=text,
  264. align="center",
  265. anchor="mm",
  266. spacing=15,
  267. fill=(97, 97, 98),
  268. )
  269. detail_images.append(text_bg)
  270. # ==========3个提示信息=========
  271. title_font = ImageFont.truetype(r"resources\ttf\puhui\Heavy.ttf", 60)
  272. sub_title_font = ImageFont.truetype(r"resources\ttf\puhui\Medium.ttf", 30)
  273. desc_font = ImageFont.truetype(r"resources\ttf\puhui\Heavy.ttf", 35)
  274. color_name_list = ["俯视", "内里", "侧视"]
  275. # 添加分割线
  276. detail_images.append(PictureProcessing("RGB", (top_bg.width, 100), (255, 255, 255)))
  277. for index, color_name in enumerate(color_name_list):
  278. # 添加分割线
  279. detail_images.append(PictureProcessing("RGB", (top_bg.width, 20), (255, 255, 255)))
  280. t_title = self.get_text_value("提示{}主标题".format(index + 1))
  281. if t_title:
  282. t_title_pp = PictureProcessing("RGB", (top_bg.width, 500), (255, 255, 255))
  283. t_title_pp=t_title_pp.get_text_image_advanced(
  284. value=(int(top_bg.width / 2), 0),
  285. font=title_font,
  286. text=t_title,
  287. align="center",
  288. anchor="ma",
  289. spacing=10,
  290. fill=(55, 55, 55),
  291. return_mode="min_image_high",
  292. margins=(10, 10, 0, 0)
  293. )
  294. detail_images.append(t_title_pp)
  295. t_sub_title = self.get_text_value("提示{}副标题".format(index + 1))
  296. if t_sub_title:
  297. t_sub_title_pp = PictureProcessing("RGB", (top_bg.width, 500), (255, 255, 255))
  298. t_sub_title_pp = t_sub_title_pp.get_text_image_advanced(
  299. value=(int(top_bg.width / 2),0),
  300. font=sub_title_font,
  301. text=t_sub_title,
  302. align="center",
  303. anchor="ma",
  304. spacing=10,
  305. fill=(55, 55, 55),
  306. return_mode="min_image_high",
  307. margins=(10, 10, 0, 0)
  308. )
  309. detail_images.append(t_sub_title_pp)
  310. # 添加图
  311. pp_jpg = self.get_overlay_pic_from_dict(
  312. goods_art_no=goods_art_no_list[0],
  313. color_name=color_name,
  314. bg_color=self.base_bg_color
  315. )
  316. t_desc = self.get_text_value("提示{}描述".format(index + 1))
  317. if color_name == "俯视":
  318. pp_jpg = pp_jpg.resize(value=1300)
  319. pp_jpg = pp_jpg.paste_img_invert(
  320. top_img=PictureProcessing("RGB", (749, 1009 if pp_jpg.height>1009 else pp_jpg.height), (236, 227, 212)), base="ws",
  321. value=(-300, -50))
  322. text_pos_value = (50, 50)
  323. align = "left"
  324. anchor = ""
  325. if color_name == "内里":
  326. pp_jpg = pp_jpg.resize(value=2000)
  327. pp_jpg = pp_jpg.paste_img_invert(
  328. top_img=PictureProcessing("RGB", (749, pp_jpg.height + 150), (236, 227, 212)), base="wc",
  329. value=(-230, 0))
  330. text_pos_value = (50, 50)
  331. align = "left"
  332. anchor = ""
  333. if color_name == "侧视":
  334. pp_jpg = pp_jpg.resize(value=1600)
  335. pp_jpg = pp_jpg.paste_img_invert(
  336. top_img=PictureProcessing("RGB", (749, 1009 if pp_jpg.height>1009 else pp_jpg.height), (236, 227, 212)), base="se",
  337. value=(0, -30))
  338. text_pos_value = (pp_jpg.width - 30, pp_jpg.height - 360)
  339. align = "right"
  340. anchor = "rs"
  341. if t_desc:
  342. pp_jpg = pp_jpg.add_text(
  343. mode="pixel",
  344. value=text_pos_value,
  345. font=desc_font,
  346. text=t_desc,
  347. align=align,
  348. anchor=anchor,
  349. spacing=10,
  350. fill=(102, 102, 102),
  351. )
  352. pp_jpg = pp_jpg.paste_img_invert(
  353. top_img=PictureProcessing("RGB", (top_bg.width, pp_jpg.height,), (255, 255, 255), ), base="cc",
  354. value=(0, 0))
  355. detail_images.append(pp_jpg)
  356. # 添加分割线
  357. detail_images.append(PictureProcessing("RGB", (top_bg.width, 60), (255, 255, 255), ))
  358. # 添加分割线
  359. detail_images.append(PictureProcessing("RGB", (top_bg.width, 100), (255, 255, 255), ))
  360. image = PictureProcessing(im=self.add_pic(detail_images))
  361. return image
  362. def deal_pic_5(self):
  363. bg_color = (255, 255, 255)
  364. detailed_images = []
  365. goods_art_no_list = list(self.data.keys())
  366. top_bg = PictureProcessing(
  367. r"{}\template_5.png".format(
  368. self.root
  369. )
  370. )
  371. detailed_images.append(top_bg)
  372. pp_list_1 = []
  373. color_name_1 = ["俯视", "侧视", "内里", "后跟", "鞋底"]
  374. color_name_2 = ["俯视", "鞋底"]
  375. color_name_1 = ["俯视", "侧视", "鞋底"]
  376. color_name_2 = ["俯视", "内里", "后跟"]
  377. n = 0
  378. pp_1_height = 100
  379. for index, goods_art_no in enumerate(goods_art_no_list):
  380. if index in [0, 2, 4, 6, 8]:
  381. color_name = color_name_1
  382. else:
  383. color_name = color_name_2
  384. for name in color_name:
  385. pp_1 = self.get_overlay_pic_from_dict(
  386. goods_art_no=goods_art_no,
  387. color_name=name,
  388. bg_color=self.base_bg_color
  389. )
  390. if pp_1:
  391. n += 1
  392. if name != "后跟":
  393. pp_1 = pp_1.resize(value=int(top_bg.width / 1.4))
  394. else:
  395. pp_1 = pp_1.resize(value=int(top_bg.width / 3))
  396. if n == 1:
  397. pp_1_height = pp_1.height
  398. _height = pp_1.height if pp_1.height > pp_1_height else pp_1_height
  399. pp_1 = pp_1.paste_img_invert(base="cc",
  400. top_img=PictureProcessing("RGB",
  401. (int(top_bg.width / 1.4), _height + 10,),
  402. self.base_bg_color))
  403. pp_1 = pp_1.paste_img_invert(base="cc",
  404. top_img=PictureProcessing("RGB",
  405. (top_bg.width, _height + 100,),
  406. (255, 255, 255)))
  407. pp_list_1.append(pp_1)
  408. if pp_list_1:
  409. pp_list_1.append(PictureProcessing("RGB", (top_bg.width, 100), bg_color))
  410. detailed_images.extend(pp_list_1)
  411. # return PictureProcessing(im=self.add_pic(detailed_images))
  412. return self.pp_pic_subsection(PictureProcessing(im=self.add_pic(detailed_images)))
  413. def get_font_render_size(self, text, font, canvas_size=(2048, 2048)):
  414. canvas = Image.new('RGB', canvas_size)
  415. draw = ImageDraw.Draw(canvas)
  416. draw.text((0, 0), text, font=font, fill=(55, 55, 55))
  417. bbox = canvas.getbbox()
  418. # 宽高
  419. size = (bbox[2] - bbox[0], bbox[3] - bbox[1])
  420. return size