detail_xiaosushuoxie4.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. """
  2. 步骤:
  3. 1、整理需要处理的款号图-输出款号图文件夹
  4. 2、整理所有相关的图片作为素材图
  5. 3、按要求进行拼接
  6. """
  7. import os
  8. import time
  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. from PIL import Image, ImageDraw
  13. import math
  14. class DetailPicGetXiaoSuShuoXie4(DetailBase):
  15. need_view = ["俯视", "侧视", "后跟", "鞋底", "内里"]
  16. root = r"{}\resources\detail_temp\xiaosushuoxie\4".format(os.getcwd())
  17. def __init__(self, goods_no, goods_no_value: dict, out_put_dir, windows=None, test=False, excel_data=None,assigned_page_list=None):
  18. super().__init__(goods_no, goods_no_value, out_put_dir, windows=windows, excel_data=excel_data,assigned_page_list=assigned_page_list)
  19. self.root = r"{}\resources\detail_temp\xiaosushuoxie\4".format(os.getcwd())
  20. print("run xiaosushuoxie-4 ")
  21. self.base_bg_color = (255, 255, 255)
  22. self.deal_pic_func_list = [
  23. self.deal_pic_1,
  24. self.deal_pic_2,
  25. self.deal_pic_3,
  26. self.deal_pic_4,
  27. self.deal_pic_5,
  28. self.deal_pic_6,
  29. self.deal_pic_7,
  30. ]
  31. if test:
  32. # for k, v in self.goods_no_value.items():
  33. # print(k, v)
  34. self.run_test()
  35. else:
  36. self.run_all()
  37. def run_test(self):
  38. detailed_images = []
  39. detailed_images.append(self.deal_pic_1())
  40. # detailed_images.append(self.deal_pic_2())
  41. # detailed_images.append(self.deal_pic_3())
  42. # detailed_images.append(self.deal_pic_4())
  43. # detailed_images.append(self.deal_pic_5())
  44. # detailed_images.append(self.deal_pic_6())
  45. # detailed_images.append(self.deal_pic_7())
  46. img = self.add_pic(detailed_images)
  47. # img.save(r"{}/{}.jpg".format(self.out_put_dir, self.goods_no, format="JPEG"))
  48. img.show()
  49. # 主图
  50. def deal_pic_1(self):
  51. """ 制作主图 """
  52. detailed_images = []
  53. pp_bg = PictureProcessing(r"{}\t (1).png".format(self.root))
  54. detailed_images.append(pp_bg)
  55. # -------粘贴文字-------
  56. font_1 = ImageFont.truetype(r"resources\ttf\puhui\Bold.ttf", 56)
  57. font_2 = ImageFont.truetype(r"resources\ttf\puhui\Bold.ttf", 26)
  58. text_list = []
  59. text_list.append({"text": self.get_text_value("标题"),
  60. "font": font_1,
  61. "fill": (17, 16, 16),
  62. })
  63. text_list.append({"text": self.get_text_value("副标题"),
  64. "font": font_2,
  65. "fill": (17, 16, 16),
  66. })
  67. text_image = self.add_text_list(text_list, spacing=25, base="nc")
  68. if text_image:
  69. text_image = text_image.paste_img_invert(
  70. top_img=PictureProcessing("RGB", (1200, text_image.height + 100), self.base_bg_color),
  71. base="cc",
  72. value=(0, 0))
  73. detailed_images.append(text_image)
  74. # ====粘贴组合图以及其他图
  75. goods_art_no_list = list(self.data.keys())
  76. # 文字排列
  77. _zuhe_pic_list = []
  78. color_name_list = ["组合", "组合2", "组合3", "组合4", "组合5"]
  79. for color_name in color_name_list:
  80. pp_1 = self.get_overlay_pic_from_dict(
  81. goods_art_no=goods_art_no_list[0],
  82. color_name=color_name,
  83. bg_color=self.base_bg_color,
  84. )
  85. if not pp_1:
  86. continue
  87. pp_1 = pp_1.resize(value=int(pp_bg.width / 1.45))
  88. pp_1 = pp_1.paste_img_invert(
  89. top_img=PictureProcessing("RGB", (pp_bg.width, pp_1.height + 30), self.base_bg_color),
  90. base="cc")
  91. _zuhe_pic_list.append(pp_1)
  92. _zuhe_pic_list.append(PictureProcessing("RGB", (pp_bg.width, 150), self.base_bg_color))
  93. if not _zuhe_pic_list:
  94. pp_1 = self.get_overlay_pic_from_dict(
  95. goods_art_no=goods_art_no_list[0],
  96. color_name="俯视",
  97. bg_color=self.base_bg_color,
  98. )
  99. pp_1 = pp_1.resize(value=int(pp_bg.width / 1.45))
  100. pp_1 = pp_1.paste_img_invert(
  101. top_img=PictureProcessing("RGB", (pp_bg.width, pp_1.height + 30), self.base_bg_color),
  102. base="cc")
  103. _zuhe_pic_list.append(pp_1)
  104. detailed_images.extend(_zuhe_pic_list)
  105. detailed_images.append(PictureProcessing(r"{}\t (3).png".format(self.root)))
  106. return PictureProcessing(im=self.add_pic(detailed_images))
  107. # 商品信息
  108. def deal_pic_2(self):
  109. """
  110. 细节解析
  111. """
  112. # 文字排列
  113. detailed_images = []
  114. pp_bg = PictureProcessing(r"{}\t (4).png".format(self.root))
  115. detailed_images.append(pp_bg)
  116. detailed_images.append(PictureProcessing("RGB", (pp_bg.width, 120), self.base_bg_color))
  117. goods_art_no_list = list(self.data.keys())
  118. pp_bg_2 = PictureProcessing(r"{}\t (26) .png".format(self.root))
  119. pp_1 = self.get_overlay_pic_from_dict(
  120. goods_art_no=goods_art_no_list[0],
  121. color_name="侧视",
  122. bg_color=self.base_bg_color,
  123. )
  124. pp_1 = pp_1.resize(value=700)
  125. pp_bg_2 = pp_bg_2.paste_img(top_img=pp_1,
  126. base="sc",
  127. value=(0, 90)
  128. )
  129. # 粘贴文字
  130. font = ImageFont.truetype(r"resources\ttf\puhui\Medium.ttf", 26)
  131. text_key_list = ["鞋面特点", "跟高", "鞋底特点"]
  132. for text_key in text_key_list:
  133. text = self.get_text_value(text_key)
  134. if not text:
  135. continue
  136. if text_key == "鞋面特点":
  137. value = (131, 380)
  138. if text_key == "跟高":
  139. value = (935, 187)
  140. text = "跟高:{}".format(text)
  141. if text_key == "鞋底特点":
  142. value = (831, 40)
  143. text_image = pp_bg_2.get_text_image_advanced(
  144. value=(0, 0),
  145. font=font,
  146. text=text,
  147. spacing=5,
  148. fill=(15, 15, 15),
  149. return_mode="min_image",
  150. )
  151. if text_image:
  152. pp_bg_2 = pp_bg_2.paste_img(top_img=text_image,
  153. base="sw",
  154. value=value
  155. )
  156. # 剪裁多余的
  157. if pp_bg_2.height > pp_1.height + 90:
  158. pp_bg_2 = pp_bg_2.crop(bbox=(0, pp_bg_2.height - 90 - pp_1.height, pp_bg_2.width, pp_bg_2.height))
  159. detailed_images.append(pp_bg_2)
  160. font_bg = PictureProcessing(r"{}\t (6).png".format(self.root))
  161. # 商品信息文字
  162. font = ImageFont.truetype(r"resources\ttf\puhui\Medium.ttf", 35)
  163. text_list = [
  164. ("{}".format(self.get_text_value("品牌")), (294 + 20, 49)),
  165. ("{}".format(self.get_text_value("临时款号")), (854 + 20, 49)),
  166. ("{}".format(self.get_text_value("鞋面材质")), (294 + 20, 138)),
  167. ("{}".format(self.get_text_value("内里材质")), (854 + 20, 138)),
  168. ("{}".format(self.get_text_value("鞋垫材质")), (294 + 20, 230)),
  169. ("{}".format(self.get_text_value("鞋底材质")), (854 + 20, 230)),
  170. ]
  171. for text_item in text_list:
  172. if text_item[0]:
  173. font_bg = font_bg.get_text_image_advanced(
  174. value=text_item[1],
  175. font=font,
  176. text=text_item[0],
  177. align="center",
  178. anchor=None,
  179. spacing=5,
  180. fill=(30, 30, 30),
  181. return_mode="image",
  182. margins=(0, 0, 0, 0)
  183. )
  184. # 其他图片
  185. detailed_images.append(font_bg)
  186. return PictureProcessing(im=self.add_pic(detailed_images))
  187. def deal_pic_3(self):
  188. """ 各个颜色细节展示 """
  189. detailed_images = []
  190. # 添加分割线
  191. detailed_images.append(PictureProcessing("RGB", (1200, 100), (255, 255, 255)))
  192. # 放各个颜色图
  193. pp_list_1 = []
  194. font = ImageFont.truetype(r"resources\ttf\puhui\Medium.ttf", 25)
  195. goods_art_no_list = list(self.data.keys())
  196. for index, goods_art_no in enumerate(goods_art_no_list):
  197. pp_jpg = self.get_overlay_pic_from_dict(
  198. goods_art_no=goods_art_no,
  199. color_name="侧视",
  200. bg_color=self.base_bg_color,
  201. )
  202. if pp_jpg is None:
  203. continue
  204. pp_jpg = pp_jpg.resize(value=480)
  205. color_name = self.goods_no_value["货号资料"][index]["颜色名称"]
  206. text_bg = PictureProcessing("RGB", (480, 50), (255, 255, 255))
  207. text_bg = text_bg.get_text_image_advanced(
  208. value=(480 / 2, 10),
  209. font=font,
  210. text="{}".format(color_name),
  211. align="center",
  212. anchor="mm",
  213. spacing=5,
  214. fill=(55, 55, 55),
  215. return_mode="image",
  216. margins=(0, 0, 0, 0)
  217. )
  218. # text_bg.show()
  219. _bg = PictureProcessing("RGB", (440, pp_jpg.height + text_bg.height), (255, 255, 255))
  220. _bg = _bg.paste_img(top_img=pp_jpg)
  221. _bg = _bg.paste_img(top_img=text_bg, value=(0, pp_jpg.height))
  222. pp_list_1.append(_bg)
  223. rows = 2
  224. shoes_bg = PictureProcessing().horizontal_distribution(
  225. pp_list=pp_list_1,
  226. bg_width=1200,
  227. margins=(0, 0, 40, 40),
  228. line_spacing=60,
  229. number_per_row=rows,
  230. )
  231. detailed_images.append(shoes_bg)
  232. # 添加分割线
  233. detailed_images.append(PictureProcessing("RGB", (1200, 200), (255, 255, 255)))
  234. return PictureProcessing(im=self.add_pic(detailed_images))
  235. # 细节展示
  236. def deal_pic_4(self):
  237. # =============细节展示================
  238. detail_images = []
  239. top_bg = PictureProcessing(r"{}\t (8).png".format(self.root))
  240. detail_images.append(top_bg)
  241. font_1 = ImageFont.truetype(r"resources\ttf\puhui\Heavy.ttf", 120) # 序号标签
  242. font_2 = ImageFont.truetype(r"resources\ttf\puhui\Medium.ttf", 36) # 描述主标题
  243. font_3 = ImageFont.truetype(r"resources\ttf\puhui\Medium.ttf", 26) # 描述副标题
  244. # ==========3个图片描述信息=========
  245. goods_art_no_list = list(self.data.keys())
  246. color_name_list = ["俯视", "鞋底", "侧视"]
  247. for index, color_name in enumerate(color_name_list):
  248. # 添加分割线
  249. detail_images.append(PictureProcessing("RGB", (top_bg.width, 20), (255, 255, 255)))
  250. # 添加商品图片
  251. pp_jpg = self.get_overlay_pic_from_dict(
  252. goods_art_no=goods_art_no_list[0],
  253. color_name=color_name,
  254. bg_color=self.base_bg_color
  255. )
  256. if color_name == "俯视":
  257. pp_jpg = pp_jpg.resize(value=1565)
  258. pp_jpg = pp_jpg.paste_img_invert(
  259. top_img=PictureProcessing("RGB", (1200, 1050), (255, 255, 255)),
  260. base="ws",
  261. value=(104, 0))
  262. text_pos_value = (50, 70)
  263. text_pos_base = "nw" # 粘贴文字的位置
  264. text_base = "wn" # 文字方向
  265. if color_name == "鞋底":
  266. pp_jpg = pp_jpg.resize(value=1766)
  267. pp_jpg = pp_jpg.transpose(mode="left_right")
  268. pp_jpg = pp_jpg.paste_img_invert(
  269. top_img=PictureProcessing("RGB", (1200, pp_jpg.height + 150), (255, 255, 255)), base="ec",
  270. value=(275, 0))
  271. text_pos_value = (50, 150)
  272. text_pos_base = "es" # 粘贴文字的位置
  273. text_base = "en"
  274. if color_name == "侧视":
  275. pp_jpg = pp_jpg.resize(value=1681)
  276. pp_jpg = pp_jpg.transpose(mode="left_right")
  277. pp_jpg = pp_jpg.paste_img_invert(
  278. top_img=PictureProcessing("RGB", (1200, 843), (255, 255, 255)), base="ws",
  279. value=(216, 0))
  280. text_pos_value = (50, 150)
  281. text_pos_base = "ws" # 粘贴文字的位置
  282. text_base = "wn"
  283. text_list = []
  284. # 序号
  285. text_list.append({"text": "{}".format(index + 1).zfill(2),
  286. "font": font_1,
  287. "fill": (215, 215, 215),
  288. })
  289. # 主标题
  290. text_list.append({"text": self.get_text_value("提示{}主标题".format(index + 1)),
  291. "font": font_2,
  292. "fill": (55, 55, 55),
  293. })
  294. text_list.append({"text": self.get_text_value("提示{}副标题".format(index + 1)),
  295. "font": font_3,
  296. "fill": (55, 55, 55),
  297. })
  298. text_image = self.add_text_list(text_list, spacing=30, base=text_base)
  299. pp_jpg = pp_jpg.paste_img(
  300. top_img=text_image,
  301. base=text_pos_base,
  302. value=text_pos_value, )
  303. detail_images.append(pp_jpg)
  304. # 添加分割线
  305. detail_images.append(PictureProcessing("RGB", (top_bg.width, 60), (255, 255, 255), ))
  306. # 添加分割线
  307. detail_images.append(PictureProcessing("RGB", (top_bg.width, 100), (255, 255, 255), ))
  308. image = PictureProcessing(im=self.add_pic(detail_images))
  309. return image
  310. # 添加尺码表
  311. def deal_pic_5(self):
  312. image_path = r"{}\t (10).png".format(self.root)
  313. return PictureProcessing(image_path)
  314. # 静物展示
  315. def deal_pic_6(self):
  316. bg_color = (255, 255, 255)
  317. detailed_images = []
  318. goods_art_no_list = list(self.data.keys())
  319. top_bg = PictureProcessing(r"{}\t (11).png".format(self.root))
  320. detailed_images.append(top_bg)
  321. pp_list_1 = []
  322. color_name_show_list = []
  323. color_name_show_list.append(["组合", "内里", "侧视", "鞋底", "俯视"])
  324. color_name_show_list.append(["组合2", "内里", "侧视", "鞋底", "俯视"])
  325. color_name_show_list.append(["组合3", "内里", "侧视", "鞋底", "俯视"])
  326. color_name_show_list.append(["内里", "侧视", "鞋底", "俯视"])
  327. color_name_text_show_dict = {
  328. "组合": "合并展示 / MERGE",
  329. "组合2": "合并展示 / MERGE",
  330. "组合3": "合并展示 / MERGE",
  331. "内里": "内里展示 / INSIDER",
  332. "鞋底": "鞋底展示 / SOLE",
  333. "侧视": "后跟展示 / HEELPIECE",
  334. "俯视": "45°展示 / 45°",
  335. }
  336. font = ImageFont.truetype(r"resources\ttf\puhui\Medium.ttf", 30)
  337. n = 0
  338. pp_1_height = 100
  339. for index, goods_art_no in enumerate(goods_art_no_list):
  340. try:
  341. color_name = color_name_show_list[index]
  342. except:
  343. color_name = color_name_show_list[-1]
  344. for name in color_name:
  345. pp_1 = self.get_overlay_pic_from_dict(
  346. goods_art_no=goods_art_no,
  347. color_name=name,
  348. bg_color=self.base_bg_color
  349. )
  350. if pp_1:
  351. n += 1
  352. if name != "后跟":
  353. pp_1 = pp_1.resize(value=int(top_bg.width / 1.4))
  354. else:
  355. pp_1 = pp_1.resize(value=int(top_bg.width / 3))
  356. if n == 1:
  357. pp_1_height = pp_1.height
  358. _height = pp_1.height if pp_1.height > pp_1_height else pp_1_height
  359. _height = pp_1.height + 50
  360. # pp_1 = pp_1.paste_img_invert(base="sc",
  361. # top_img=PictureProcessing("RGB",
  362. # (int(top_bg.width / 1.4), _height + 10,),
  363. # self.base_bg_color))
  364. pp_1 = pp_1.paste_img_invert(base="sc",
  365. value=(0, 50),
  366. top_img=PictureProcessing("RGB",
  367. (top_bg.width, _height + 100,),
  368. (255, 255, 255)))
  369. pp_list_1.append(pp_1)
  370. font_bg = PictureProcessing("RGB", (top_bg.width, 100), (255, 255, 255))
  371. font_bg = font_bg.get_text_image_advanced(
  372. value=(600, 20),
  373. font=font,
  374. text=color_name_text_show_dict[name],
  375. align="center",
  376. anchor="mm",
  377. spacing=5,
  378. fill=(30, 30, 30),
  379. return_mode="image",
  380. margins=(0, 0, 0, 0)
  381. )
  382. pp_list_1.append(font_bg)
  383. if pp_list_1:
  384. pp_list_1.append(PictureProcessing("RGB", (top_bg.width, 100), bg_color))
  385. detailed_images.extend(pp_list_1)
  386. return PictureProcessing(im=self.add_pic(detailed_images))
  387. # 添加备注图
  388. def deal_pic_7(self):
  389. image_path = r"{}\t (25).png".format(self.root)
  390. return PictureProcessing(image_path)
  391. def generateTextBg(self, parent, position, font, font_size, text, color):
  392. return parent.add_text(
  393. mode="pixel",
  394. value=position,
  395. font=ImageFont.truetype(font, font_size),
  396. text=text,
  397. align="center",
  398. anchor="ma",
  399. spacing=10,
  400. fill=color,
  401. )
  402. def get_font_render_size(self, text, font, canvas_size=(2048, 2048)):
  403. canvas = Image.new('RGB', canvas_size)
  404. draw = ImageDraw.Draw(canvas)
  405. draw.text((0, 0), text, font=font, fill=(55, 55, 55))
  406. bbox = canvas.getbbox()
  407. # 宽高
  408. size = (bbox[2] - bbox[0], bbox[3] - bbox[1])
  409. return size