detail_xiaosushuoxie3.py 19 KB

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