base_deal.py 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152
  1. import json
  2. from .module_generate_goods_art_no_table import GenerateGoodsArtNoTable
  3. from func_timeout import FunctionTimedOut
  4. from .grenerate_main_image_test import GeneratePic
  5. from threading import Lock
  6. import settings
  7. from collections import defaultdict
  8. from .remove_bg_ali import RemoveBgALi, Picture
  9. from .deal_cutout import DealCutout
  10. # from data import DataModeAutoDealPics
  11. import time
  12. from .image_pic_deal import OnePicDeal
  13. from natsort import natsorted,ns
  14. import os
  15. import shutil
  16. import exifread
  17. import datetime
  18. from databases import DeviceConfig,SqlQuery,CRUD
  19. from model.photo_record import PhotoRecord
  20. import requests
  21. import copy
  22. """
  23. 照片自动货号匹配 将图片放置在指定文件夹下,并自动对应不同的货号进行整理
  24. """
  25. _Type = ['.png', '.PNG', '.jpg', '.JPG', '.gif', '.GIF', ".jpge", ".JPGE"]
  26. class BaseDealImage(object):
  27. def __init__(self, image_dir=None,token=None):
  28. self.token = token
  29. self.goods_images_count_dict = defaultdict(int)
  30. # 数据模型
  31. # self.data_mode_auto_deal_pics = DataModeAutoDealPics()
  32. self.image_dir = image_dir
  33. pass
  34. def run_main(self, all_goods_art_no_folder_data, callback_func=None, cutout_mode=None,
  35. resize_image_view=None, windows=None, logo_path=None, image_order_list=None):
  36. # 对所有缺失已抠图的进行抠图处理
  37. self.run_cutout_image(all_goods_art_no_folder_data=all_goods_art_no_folder_data,
  38. callback_func=callback_func,
  39. cutout_mode=cutout_mode,
  40. windows=windows,
  41. )
  42. error_num = 0
  43. successful_num = 0
  44. for goods_art_no_folder_data in all_goods_art_no_folder_data:
  45. if goods_art_no_folder_data["label"] != "待处理":
  46. continue
  47. if windows:
  48. if windows.state != 1:
  49. break
  50. folder_name = goods_art_no_folder_data["folder_name"]
  51. callback_func("开始处理文件夹========== {} ".format(folder_name))
  52. if settings.IS_TEST:
  53. flag = self.shoes_run_one_folder_to_deal(goods_art_no_folder_data=goods_art_no_folder_data,
  54. resize_image_view=resize_image_view,
  55. logo_path=logo_path,
  56. image_order_list=image_order_list,
  57. callback_func=callback_func,
  58. windows=windows,
  59. )
  60. if flag is None:
  61. callback_func("货号:{} 数据异常".format(folder_name))
  62. else:
  63. if flag:
  64. successful_num += 1
  65. callback_func("货号:{} 图片生成处理成功".format(folder_name))
  66. else:
  67. error_num += 1
  68. callback_func("货号:{} 图片生成处理失败".format(folder_name))
  69. else:
  70. try:
  71. flag = self.shoes_run_one_folder_to_deal(goods_art_no_folder_data=goods_art_no_folder_data,
  72. resize_image_view=resize_image_view,
  73. logo_path=logo_path,
  74. image_order_list=image_order_list,
  75. callback_func=callback_func,
  76. windows=windows,
  77. )
  78. if flag is None:
  79. callback_func("货号:{} 数据异常".format(folder_name))
  80. else:
  81. if flag:
  82. successful_num += 1
  83. callback_func("货号:{} 图片生成处理成功".format(folder_name))
  84. else:
  85. error_num += 1
  86. callback_func("货号:{} 图片生成处理失败".format(folder_name))
  87. except BaseException as e:
  88. error_num += 1
  89. callback_func("货号:{} 图片生成处理异常,原因:{}".format(folder_name, e))
  90. callback_func("处理成功:{}个,失败:{}".format(successful_num, error_num))
  91. def checkImageAmount(self, image_dir: str, amount: int, todo_goods_art_no_folder_name_list=None) -> dict:
  92. result = {'code': 0, 'msg': '', 'data': {}}
  93. for goods_art_no_folder in self.list_dir(image_dir):
  94. # 指定内容检查
  95. if todo_goods_art_no_folder_name_list is not None:
  96. if goods_art_no_folder not in todo_goods_art_no_folder_name_list:
  97. continue
  98. if not os.path.isdir("{}/{}".format(image_dir, goods_art_no_folder)):
  99. continue
  100. if "软件" in goods_art_no_folder:
  101. continue
  102. if "无法" in goods_art_no_folder:
  103. continue
  104. if "原始图" not in self.list_dir("{}/{}".format(image_dir, goods_art_no_folder)):
  105. result['data'][goods_art_no_folder] = '文件夹下,没有 原始图 文件夹\n'
  106. continue
  107. # 计算单个文件夹原图数量
  108. images = [x for x in self.list_dir("{}/{}/原始图".format(image_dir, goods_art_no_folder))]
  109. image_num = 0
  110. for pic_file_name in images:
  111. _, e = os.path.splitext(pic_file_name)
  112. if e in _Type:
  113. image_num += 1
  114. # if self.number_pictures != 0:
  115. if image_num > amount:
  116. result['data'][goods_art_no_folder] = '货号图片大于{}张~\n'.format(amount)
  117. if image_num < 2:
  118. result['data'][goods_art_no_folder] = '货号图片小于于2张~\n'
  119. if result['data']:
  120. result['code'] = 1
  121. return result
  122. def check_folders_image_amount(self, all_goods_art_no_folder_data, image_order_list):
  123. print("*****************check_folders_image_amount************************")
  124. amount = len(image_order_list)
  125. message = ""
  126. for goods_art_no_folder_data in all_goods_art_no_folder_data:
  127. if goods_art_no_folder_data["label"] != "待处理":
  128. continue
  129. folder_path = goods_art_no_folder_data["folder_path"]
  130. folder_name = goods_art_no_folder_data["folder_name"]
  131. images = [x for x in self.list_dir("{}/原始图".format(folder_path))]
  132. image_num = 0
  133. for pic_file_name in images:
  134. _, e = os.path.splitext(pic_file_name)
  135. if e in _Type:
  136. image_num += 1
  137. if image_num > amount:
  138. goods_art_no_folder_data["label"] = "错误"
  139. message += '货号{}:图片大于{}张~\n'.format(folder_name, amount)
  140. if image_num < 2:
  141. message += '货号{}:图片小于于2张~\n'.format(folder_name)
  142. return all_goods_art_no_folder_data, message
  143. def check_one_folder_image_amount(self, folder_data, amount: int):
  144. print("*****************check_one_folder_image_amount************************")
  145. # 计算单个文件夹原图数量
  146. images = [x for x in self.list_dir("{}/原始图".format(folder_data["folder_path"]))]
  147. image_num = 0
  148. for pic_file_name in images:
  149. _, e = os.path.splitext(pic_file_name)
  150. if e in _Type:
  151. image_num += 1
  152. if image_num > amount:
  153. return False, '货号{}:图片大于{}张~\n'.format(folder_data["folder_name"], amount)
  154. if image_num < 2:
  155. return False, '货号{}:图片小于于2张~\n'.format(folder_data["folder_name"])
  156. return True, ""
  157. # 指定的图片顺序
  158. def getImageOrder(self, image_order: str, resize_image_view: str):
  159. imageOrderList = image_order.replace(",", ",").replace(' ', '').replace('图', '').split(",")
  160. if len(set(imageOrderList)) != len(imageOrderList):
  161. return {'code': 1, 'msg': '图片位置与顺序重复,请检查您的输入'}
  162. for val in imageOrderList:
  163. if val not in ["俯视", "侧视", "后跟", "鞋底", "内里", "组合", "组合2", "组合3", "组合4", "组合5"]:
  164. return {'code': 1, 'msg': '可选项为:俯视,侧视,后跟,鞋底,内里,组合,组合2,组合3,组合4,组合5'}
  165. if resize_image_view not in imageOrderList:
  166. return {'code': 1, 'msg': '缩小的步骤必须是你填写的图片顺序中'}
  167. return {'code': 0, 'msg': 'sucess', 'imageOrderList': imageOrderList}
  168. def shoes_run_one_folder_to_deal(self,
  169. goods_art_no_folder_data,
  170. image_order_list: list,
  171. resize_image_view: str,
  172. logo_path="",
  173. windows=None,
  174. callback_func=None):
  175. """
  176. 操作步骤:
  177. 1、查询每个图片的角度
  178. 2、
  179. """
  180. is_successful = True
  181. folder_path = goods_art_no_folder_data["folder_path"]
  182. folder_name = goods_art_no_folder_data["folder_name"]
  183. all_original_images = self.get_images("{}/原始图".format(folder_path))
  184. self.check_path('{}/800x800'.format(folder_path))
  185. self.crate_all_folders(folder_path)
  186. if not all_original_images:
  187. return None
  188. # _ = ["俯视", "侧视", "后跟", "鞋底", "内里"]
  189. for index, image_dict in enumerate(all_original_images):
  190. if index < len(image_order_list):
  191. image_dict["image_view"] = image_order_list[index]
  192. else:
  193. image_dict["image_view"] = '其他{}'.format(len(image_order_list) - index + 1)
  194. # ====================处理所有图片的顺序====================
  195. # ["俯视", "侧视", "后跟", "鞋底", "内里"]
  196. _config = {"俯视": 1,
  197. "侧视": 2,
  198. "后跟": 3,
  199. "鞋底": 4,
  200. "内里": 5, }
  201. r = time.time()
  202. n = 0
  203. _index = 0
  204. # 检查是否有重复的角度
  205. _d_views = []
  206. f = True
  207. for image_dict in all_original_images:
  208. n += 1
  209. _index += 1
  210. image_dict["old_file_name"] = image_dict["file_name"]
  211. image_dict["random_name"] = "{}-{}".format(r, n)
  212. if image_dict["image_view"] in _config:
  213. if image_dict["image_view"] not in _d_views:
  214. _d_views.append(image_dict["image_view"])
  215. else:
  216. callback_func("货号:{} 处理失败".format(folder_name))
  217. # self.show_progress_detail("货号图{} 存在多个{} 角度~".format(goods_art_no_folder, image_dict["image_view"]))
  218. return None
  219. image_dict["index"] = _config[image_dict["image_view"]]
  220. else:
  221. image_dict["index"] = _index
  222. all_original_images.sort(key=lambda x: x["index"])
  223. # ==========直接进行处理=============
  224. i_n = 0
  225. image_index = 0 # 图片顺序
  226. is_image_deal_mode = 0
  227. # 删除目录再新建
  228. if os.path.exists('{}/阴影图处理'.format(folder_path)):
  229. shutil.rmtree('{}/阴影图处理'.format(folder_path))
  230. self.crate_all_folders(folder_path)
  231. print(
  232. "***************all_original_images*********************",
  233. all_original_images,
  234. )
  235. for image_dict in all_original_images:
  236. if windows:
  237. if windows.state != 1:
  238. return None
  239. i_n += 1
  240. image_index += 1
  241. original_image_path = "{}/原始图/{}{}".format(folder_path, image_dict["file_name"], image_dict["e"])
  242. file_name = image_dict["file_name"]
  243. print("正在处理,货号:{}".format(folder_path))
  244. # self.show_progress_detail("正在处理,货号:{}".format(file_name))
  245. # 该文件在800images下没有时,则进行生成新的抠图
  246. # 检查是否存在已抠图文件,如没有再去抠图
  247. original_move_bg_image_path = "{}/原始图_已抠图/{}{}".format(folder_path, image_dict["file_name"], ".png")
  248. print(
  249. f"*****************此处判断鞋子是否为左右脚====>{image_index}<======={is_image_deal_mode}=======>**********************"
  250. )
  251. # 此处判断鞋子是否为左右脚
  252. if image_index == 1:
  253. is_image_deal_mode = 0
  254. print("开始识别左右脚=========>")
  255. if OnePicDeal(self.token).check_shoe_is_right(
  256. image_path=original_move_bg_image_path
  257. ):
  258. is_image_deal_mode = 1 # 1表示要镜像,0表示不做镜像
  259. print(
  260. "*************************进行800image 生成********************************************"
  261. )
  262. """进行800image 生成"""
  263. generate_pic = GeneratePic()
  264. print(
  265. "*************************进行800image 结束====>>>>********************************************"
  266. )
  267. if settings.OUT_PIC_MODE == ".jpg":
  268. out_path = "{}/800x800/{}{}".format(folder_path, file_name, ".jpg")
  269. else:
  270. out_path = "{}/800x800/{}{}".format(folder_path, file_name, ".png")
  271. out_process_path_1 = "{}/阴影图处理/{}_{}_阴影{}".format(folder_path, file_name,
  272. image_dict["image_view"], ".png")
  273. out_process_path_2 = "{}/阴影图处理/{}_{}_抠图{}".format(folder_path, file_name,
  274. image_dict["image_view"], ".png")
  275. resize_mode = 1
  276. max_box = None
  277. print("------------1", image_dict["image_view"], resize_image_view)
  278. if image_dict["image_view"] == resize_image_view:
  279. print(image_dict["image_view"], resize_image_view)
  280. resize_mode = 2
  281. if settings.Mode == "皮具":
  282. max_box = (1000, 1200)
  283. if resize_mode == 2:
  284. print(
  285. "参数打印================》",
  286. is_image_deal_mode,
  287. resize_mode,
  288. settings.OUT_PIC_SIZE,
  289. True if i_n == 1 else False,
  290. max_box
  291. )
  292. print("**********123456********************")
  293. if not generate_pic.run(image_path=original_image_path,
  294. cut_image_path=original_move_bg_image_path,
  295. out_path=out_path,
  296. image_deal_mode=is_image_deal_mode,
  297. resize_mode=resize_mode,
  298. out_pic_size=settings.OUT_PIC_SIZE,
  299. is_logo=True if i_n == 1 else False,
  300. out_process_path_1=out_process_path_1,
  301. out_process_path_2=out_process_path_2,
  302. max_box=max_box,
  303. logo_path=logo_path,
  304. ):
  305. print("**********222222222222222222222222222********************")
  306. is_successful = False
  307. if is_successful:
  308. return True
  309. else:
  310. return False
  311. def to_upload_pic(self, file_path, is_resize=True):
  312. file_name = os.path.split(file_path)[1]
  313. e = os.path.splitext(file_name)[1][1:]
  314. im = Picture(file_path)
  315. if im.x > 500:
  316. im.resize(width=500)
  317. _ = {"jpg": "JPEG",
  318. "JPG": "JPEG",
  319. "JPEG": "JPEG",
  320. "jpeg": "JPEG",
  321. "png": "PNG",
  322. "PNG": "PNG", }
  323. e = _[e]
  324. image_io = im.save_to_io(e)
  325. goods_data = {"file_path": os.path.split(file_path)[1],
  326. "image_io": image_io,
  327. "e": e
  328. }
  329. url = self.data_mode_image_cut.get_online_data.upload_pic(goods_data=goods_data)
  330. return url
  331. def get_images(self, path):
  332. image_list = [] # 过滤非图片数据
  333. for _file in self.list_dir(path):
  334. file_name, e = os.path.splitext(_file)
  335. if e in _Type:
  336. image_list.append({"file_path": "{}/{}".format(path, _file),
  337. "file_name": file_name,
  338. "e": e})
  339. return image_list
  340. def crate_all_folders(self, root_path):
  341. path_list = ["800x800", "原始图_已抠图", "阴影图处理"]
  342. for i in path_list:
  343. path = "{}/{}".format(root_path, i)
  344. self.check_path(path)
  345. def run_cutout_image(self, all_goods_art_no_folder_data, callback_func=None, cutout_mode=1, windows=None):
  346. """
  347. 处理所有的抠图
  348. """
  349. callback_func('开始处理抠图~')
  350. error_goods_art_no_folder = []
  351. for goods_art_no_folder_data in all_goods_art_no_folder_data:
  352. if goods_art_no_folder_data["label"] != "待处理":
  353. continue
  354. folder_path = goods_art_no_folder_data["folder_path"]
  355. self.crate_all_folders(folder_path)
  356. # 检查是否存在已抠图文件,如没有再去抠图
  357. images = [x for x in self.list_dir("{}/原始图".format(folder_path))]
  358. cutImageList = []
  359. for pic_file_name in images:
  360. if windows:
  361. if windows.state != 1:
  362. break
  363. # 根据名称判断,没有抠图过的,进行统计
  364. file_name, suffix = os.path.splitext(pic_file_name)
  365. if suffix in _Type:
  366. original_image_path = "{}/原始图/{}".format(folder_path, pic_file_name)
  367. original_move_bg_image_path = "{}/原始图_已抠图/{}{}".format(folder_path, file_name, ".png")
  368. if not os.path.exists(original_move_bg_image_path):
  369. # 没有抠图文件,进行抠图生成
  370. callback_func("正在抠图 货号:{}".format(file_name))
  371. if cutout_mode == '2':
  372. cutImageList.append({
  373. "file_name": file_name, # 文件名
  374. "file_e": suffix, # 后缀,.jpg
  375. "file_path": original_image_path, # 完整路径
  376. "file": '{}{}'.format(file_name, suffix), # 图片文件名,带后缀
  377. "need_cutout": True, # 必须,需要抠图
  378. "out_path": original_move_bg_image_path
  379. })
  380. else:
  381. remove_pic_ins = RemoveBgALi()
  382. if settings.IS_TEST:
  383. im = remove_pic_ins.get_image_cut(file_path=original_image_path,
  384. out_file_path=original_move_bg_image_path)
  385. else:
  386. try:
  387. im = remove_pic_ins.get_image_cut(file_path=original_image_path,
  388. out_file_path=original_move_bg_image_path)
  389. except FunctionTimedOut as f:
  390. callback_func("货号图{} 抠图处理超时~".format(file_name))
  391. im = None
  392. except BaseException as e:
  393. callback_func("货号图{} 抠图处理失败,原因{}".format(file_name, e))
  394. im = None
  395. if not im:
  396. callback_func("货号图{} 抠图处理失败~".format(file_name))
  397. continue
  398. else:
  399. callback_func("货号图{} 抠图完成~".format(file_name))
  400. if cutout_mode == '2':
  401. dealCutout = DealCutout(windows=None)
  402. dealCutout.need_cutout_images = cutImageList
  403. dealCutout.run()
  404. while True:
  405. time.sleep(1)
  406. if windows:
  407. if windows.state != 1:
  408. break
  409. if dealCutout.state == 3:
  410. if len(dealCutout.resultData) != len(cutImageList):
  411. error_goods_art_no_folder.append(folder_path)
  412. break
  413. if error_goods_art_no_folder:
  414. print("以下货号抠图失败~\n {}".format(error_goods_art_no_folder))
  415. callback_func("以下货号抠图失败~\n {}".format(error_goods_art_no_folder))
  416. else:
  417. callback_func("完成抠图处理")
  418. def checkCutoutImage(self, image_dir: str, todo_goods_art_no_folder_name_list=None):
  419. """
  420. 进行图片检查,不合规的直接提示
  421. """
  422. error_goods_art_no_folder = []
  423. self.check_path("{}/软件-处理失败".format(image_dir))
  424. for goods_art_no_folder in self.list_dir(image_dir):
  425. # 指定内容检查
  426. if todo_goods_art_no_folder_name_list is not None:
  427. if goods_art_no_folder not in todo_goods_art_no_folder_name_list:
  428. continue
  429. if not os.path.isdir("{}/{}".format(image_dir, goods_art_no_folder)):
  430. continue
  431. if "软件" in goods_art_no_folder:
  432. continue
  433. if "无法" in goods_art_no_folder:
  434. continue
  435. if "原始图" not in self.list_dir("{}/{}".format(image_dir, goods_art_no_folder)):
  436. error_goods_art_no_folder.append(goods_art_no_folder)
  437. continue
  438. self.check_path("{}/{}/原始图_已抠图".format(image_dir, goods_art_no_folder))
  439. self.check_path("{}/{}/800x800".format(image_dir, goods_art_no_folder))
  440. self.check_path("{}/{}/阴影图处理".format(image_dir, goods_art_no_folder))
  441. if error_goods_art_no_folder:
  442. self.move_folders(path_list=["{}/{}".format(self.image_dir, x) for x in error_goods_art_no_folder],
  443. target_folder="{}/软件-处理失败".format(self.image_dir))
  444. return False
  445. def move_folders(self, path_list, target_folder):
  446. for source_folder in path_list:
  447. shutil.move(source_folder, target_folder)
  448. def rename_folder_for_hqt(self, all_goods_art_no_folder_data):
  449. """
  450. 步骤:
  451. 规整红蜻蜓的文件名
  452. 重新按文件名进行命名
  453. """
  454. goods_art_no_list = []
  455. for goods_art_no_folder_data in all_goods_art_no_folder_data:
  456. if "@" not in goods_art_no_folder_data["folder_name"]:
  457. goods_art_no_folder_data["label"] = "待处理"
  458. goods_art_no_list.append(goods_art_no_folder_data["folder_name"])
  459. else:
  460. goods_art_no_folder_data["label"] = "不处理"
  461. if goods_art_no_list:
  462. # goods_art_no_dict 文件夹与货号的字典
  463. goods_art_no_dict = self.get_data_from_hqt_with_goods_art_no(
  464. goods_art_no_list=goods_art_no_list)
  465. for goods_art_no_folder_data in all_goods_art_no_folder_data:
  466. if goods_art_no_folder_data["label"] != "待处理":
  467. continue
  468. goods_art_no_folder = goods_art_no_folder_data["folder_name"]
  469. if goods_art_no_folder in goods_art_no_dict:
  470. print(goods_art_no_folder)
  471. old_folder_path = goods_art_no_folder_data["folder_path"]
  472. new_folder_name = "{}@NUM{}".format(goods_art_no_folder,
  473. goods_art_no_dict[goods_art_no_folder]["编号"])
  474. new_folder_path = "{}/{}".format(goods_art_no_folder_data["root_path"], new_folder_name)
  475. try:
  476. os.rename(old_folder_path, new_folder_path)
  477. goods_art_no_folder_data["folder_path"] = new_folder_path
  478. goods_art_no_folder_data["folder_name"] = new_folder_path
  479. goods_art_no_folder_data["label"] = "待处理"
  480. except BaseException as e:
  481. goods_art_no_folder_data["label"] = "不处理"
  482. print("521 文件夹重名命失败:{}".format(e))
  483. # 重新规整修改图片名称
  484. for goods_art_no_folder_data in all_goods_art_no_folder_data:
  485. if goods_art_no_folder_data["label"] != "待处理":
  486. continue
  487. goods_art_no_folder = goods_art_no_folder_data["folder_name"]
  488. _img_all = self.list_dir("{}/原始图".format(goods_art_no_folder_data["folder_path"]))
  489. index = 0
  490. for _file in _img_all:
  491. file_name, suffix = os.path.splitext(_file)
  492. if suffix in _Type:
  493. index += 1
  494. folder_path = goods_art_no_folder_data["folder_path"]
  495. new_file_name = "{}({}){}".format(goods_art_no_folder, index, suffix)
  496. new_path = "{}/原始图/{}".format(folder_path, new_file_name)
  497. old_path = "{}/原始图/{}".format(folder_path, _file)
  498. crop_new_path = "{}/原始图_已抠图/{}".format(folder_path, "{}({}).png".format(goods_art_no_folder, index))
  499. crop_old_path = "{}/原始图_已抠图/{}".format(folder_path, "{}.png".format(file_name))
  500. if old_path != new_path:
  501. # 存在货号命名错误的,进行修正
  502. try:
  503. if os.path.exists(old_path):
  504. os.rename(old_path, new_path)
  505. if os.path.exists(crop_old_path):
  506. os.rename(crop_old_path, crop_new_path)
  507. except BaseException as e:
  508. goods_art_no_folder_data["label"] = "不处理"
  509. print("550 文件夹重名命失败:{}".format(e))
  510. def cutImagePiju(self, image_dir: str, image_order='', is_check_number=True, is_filter=True, resize_image_view='后跟',
  511. callback_func=None, event=None, todo_goods_art_no_folder_name_list=None):
  512. """
  513. 1、遍历文件夹,基于生成的结果图看哪些需要进行抠图等处理
  514. 2、压缩并上传平台获取抠图
  515. 3、抠图处理成白底图
  516. 4、做成800*800/200*200
  517. :return:
  518. """
  519. logo_path = ""
  520. res = self.getImageOrder(image_order=image_order, resize_image_view=resize_image_view)
  521. if res['code'] != 0:
  522. callback_func(res['msg'])
  523. return {'code': 1, 'msg': res['msg']}
  524. imageOrderList = res['imageOrderList']
  525. """扫描文档,检查有哪些需要进行抠图等处理"""
  526. self.lock = Lock()
  527. to_do_images_total = 0
  528. error_goods_art_no_folder = []
  529. for goods_art_no_folder in self.list_dir(image_dir):
  530. # 指定内容检查
  531. if todo_goods_art_no_folder_name_list is not None:
  532. if goods_art_no_folder not in todo_goods_art_no_folder_name_list:
  533. continue
  534. if not os.path.isdir("{}/{}".format(image_dir, goods_art_no_folder)):
  535. continue
  536. self.check_path("{}/{}/原始图".format(image_dir, goods_art_no_folder))
  537. self.check_path("{}/{}/原始图_已抠图".format(image_dir, goods_art_no_folder))
  538. self.check_path("{}/{}/800x800".format(image_dir, goods_art_no_folder))
  539. self.check_path("{}/{}/阴影图处理".format(image_dir, goods_art_no_folder))
  540. # 遍历原始图片文件夹
  541. all_original_images = [x for x in
  542. self.list_dir(
  543. "{}/{}/原始图".format(image_dir, goods_art_no_folder))]
  544. # 检查已抠图文件夹
  545. all_moved_images = [os.path.splitext(x)[0] for x in
  546. self.list_dir(
  547. "{}/{}/原始图_已抠图".format(image_dir, goods_art_no_folder))]
  548. all_800images = [os.path.splitext(x)[0] for x in
  549. self.list_dir(
  550. "{}/{}/800x800".format(image_dir, goods_art_no_folder))]
  551. if is_check_number and len(imageOrderList) != len(all_original_images):
  552. callback_func("{} 文件夹下图片数量与订单数量不一致,请检查!".format(goods_art_no_folder))
  553. return {'code': 1, 'msg': '{} 文件夹下图片数量与订单数量不一致,请检查!'.format(goods_art_no_folder)}
  554. all_800images = []
  555. image_num = 0
  556. for pic_file_name in all_original_images:
  557. if pic_file_name not in all_800images:
  558. # 根据名称判断,没有抠图过的,进行统计
  559. _, e = os.path.splitext(pic_file_name)
  560. print(e)
  561. if e in _Type:
  562. image_num += 1
  563. print("----------》", goods_art_no_folder, pic_file_name)
  564. to_do_images_total += 1
  565. # if image_num > 5:
  566. # error_goods_art_no_folder.append(goods_art_no_folder)
  567. # if error_goods_art_no_folder:
  568. # self.show_progress_detail("以下货号图片张数超过5张~\n {}".format(error_goods_art_no_folder))
  569. # self.set_state(state_value=2)
  570. # return
  571. if to_do_images_total > 0:
  572. # self.progress_sign.emit({"type": "处理图片 抠图、加工等", "progress_bar_value": 0})
  573. for goods_art_no_folder in self.list_dir(image_dir):
  574. # 指定内容检查
  575. if todo_goods_art_no_folder_name_list is not None:
  576. if goods_art_no_folder not in todo_goods_art_no_folder_name_list:
  577. continue
  578. if not os.path.isdir('{}/{}'.format(image_dir, goods_art_no_folder)):
  579. continue
  580. self.run_one_folder_to_deal(goods_art_no_folder=goods_art_no_folder,
  581. image_dir=image_dir,
  582. image_order=image_order,
  583. resize_image_view=resize_image_view,
  584. callback_func=callback_func,
  585. logo_path=logo_path,
  586. )
  587. else:
  588. # self.show_progress_detail("没有需要处理的图片~")
  589. callback_func('没有需要处理的图片~')
  590. # self.set_state(state_value=2)
  591. return {'code': 0, 'msg': 'ok'}
  592. def run_one_folder_to_deal(self, goods_art_no_folder, image_dir, image_order, resize_image_view,
  593. callback_func=None, logo_path=""):
  594. _img_all = self.list_dir("{}/{}/原始图".format(image_dir, goods_art_no_folder))
  595. all_original_images = [] # 过滤非图片数据
  596. index = 0
  597. for _file in _img_all:
  598. file_name, e = os.path.splitext(_file)
  599. if e in _Type:
  600. index += 1
  601. new_file_name = "{}({}){}".format(goods_art_no_folder, index, e)
  602. new_path = "{}/{}/原始图/{}".format(image_dir, goods_art_no_folder, new_file_name)
  603. old_path = "{}/{}/原始图/{}".format(image_dir, goods_art_no_folder, _file)
  604. if old_path != new_path:
  605. # 存在货号命名错误的,进行修正
  606. try:
  607. os.rename(old_path, new_path)
  608. except:
  609. pass
  610. all_original_images.append(new_file_name)
  611. if os.path.exists("{}/{}/原始图/镜像.txt".format(image_dir, goods_art_no_folder)):
  612. file_mirror_mark = True
  613. else:
  614. file_mirror_mark = None
  615. # if goods_art_no_folder == "AC51016112":
  616. # print(file_mirror_mark)
  617. # raise 111
  618. all_moved_images = [os.path.splitext(x)[0] for x in
  619. self.list_dir("{}/{}/原始图_已抠图".format(image_dir, goods_art_no_folder))]
  620. all_800images = [os.path.splitext(x)[0] for x in
  621. self.list_dir(
  622. "{}/{}/800x800".format(image_dir, goods_art_no_folder))]
  623. all_800images = []
  624. # 检查哪些图片没有做过抠图处理
  625. i_n = 0
  626. _name_list = ["视角{}".format(x) for x in range(1, len(all_original_images) + 1)]
  627. # if goods_art_no_folder == "AC51028001":
  628. # _name_list = ["正视", "45度", "侧视", "后视", "底视", "其他1", "其他2", "其他3"]
  629. image_index = 0 # 图片顺序
  630. is_image_deal_mode = 0
  631. max_box = None
  632. for file in all_original_images:
  633. i_n += 1
  634. image_index += 1
  635. original_image_path = "{}/{}/原始图/{}".format(image_dir, goods_art_no_folder, file)
  636. file_name = os.path.splitext(file)[0]
  637. """
  638. 当第三张就是为后跟
  639. """
  640. if file_name not in all_800images: # 所有都重新生成
  641. # if goods_art_no_folder != "AC51016112":
  642. # continue
  643. goods_art_no_folder_path = "{}/{}".format(image_dir, goods_art_no_folder)
  644. print("正在处理,货号:{}".format(goods_art_no_folder_path))
  645. # self.show_progress_detail("正在处理,货号:{}".format(file_name))
  646. callback_func("正在处理,货号:{}".format(file_name))
  647. # 该文件在800images下没有时,则进行生成新的抠图
  648. # 检查是否存在已抠图文件,如没有再去抠图
  649. original_move_bg_image_path = "{}/原始图_已抠图/{}{}".format(goods_art_no_folder_path, file_name,
  650. ".png")
  651. image_deal_mode = 0 # 默认图片不做镜像处理
  652. if not os.path.exists(original_move_bg_image_path):
  653. # 没有抠图文件,进行抠图生成
  654. # self.show_progress_detail("正在抠图 货号:{}".format(file_name))
  655. callback_func("正在抠图 货号:{}".format(file_name))
  656. remove_pic_ins = RemoveBgALi()
  657. im = remove_pic_ins.get_image_cut(file_path=original_image_path,
  658. out_file_path=original_move_bg_image_path)
  659. if not im:
  660. # self.show_progress_detail("货号图{} 抠图处理失败~".format(file_name))
  661. callback_func("货号图{} 抠图处理失败~".format(file_name))
  662. continue
  663. if image_index == 1:
  664. is_image_deal_mode = 0
  665. if settings.Mode == "鞋类":
  666. goods_class = "鞋"
  667. # 如果图片已存在,则需要通过加载图片判断是否为左右脚
  668. if OnePicDeal().check_shoe_is_right(image_path=original_move_bg_image_path):
  669. image_deal_mode = 1 # 1表示要镜像,0表示不做镜像
  670. is_image_deal_mode = 1
  671. if settings.Mode == "皮具":
  672. # 图片对应的商品类型
  673. # goods_class = self.get_goods_class(goods_art_no_folder, original_image_path)
  674. max_box = (1000, 1200)
  675. # _ = {"AC51028001": "女包",
  676. # "AC51028002": "男包",
  677. # "AC51028003": "皮带",
  678. # "AC51028004": "女包"}
  679. # if goods_class in _:
  680. # goods_class = _[goods_class]
  681. # else:
  682. # goods_class = "女包"
  683. #
  684. # _ = {"女包": (1000, 1200),
  685. # "男包": (1000, 1200),
  686. # "皮带": (1000, 1000), }
  687. # max_box = _[goods_class]
  688. # 获取图片信息非必要程序,用于处理图片模式
  689. date_time_original = self.get_date_time_original(original_image_path) # 获取照片拍照时间
  690. if date_time_original:
  691. # 基于照片的时间,与数据库匹配goods_art_no
  692. self.lock.acquire()
  693. _data = self.dataModeMatchPhoto.get_goods_art_no(date_time_original)
  694. self.lock.release()
  695. if _data:
  696. # 能匹配上数据库
  697. goods_art_no, _image_index, _image_deal_mode = _data
  698. if _image_index < 10:
  699. image_index = _image_index
  700. if _image_deal_mode == 1:
  701. image_deal_mode = 1
  702. # print(goods_art_no, image_index, image_deal_mode)
  703. if file_mirror_mark:
  704. image_deal_mode = 1
  705. """进行800image 生成"""
  706. generate_pic = GeneratePic()
  707. if settings.OUT_PIC_MODE == ".jpg":
  708. out_path = "{}/800x800/{}{}".format(goods_art_no_folder_path, file_name, ".jpg")
  709. else:
  710. out_path = "{}/800x800/{}{}".format(goods_art_no_folder_path, file_name, ".png")
  711. out_process_path_1 = "{}/阴影图处理/{}_{}_阴影{}".format(goods_art_no_folder_path, file_name,
  712. _name_list[i_n - 1], ".png")
  713. out_process_path_2 = "{}/阴影图处理/{}_{}_抠图{}".format(goods_art_no_folder_path, file_name,
  714. _name_list[i_n - 1], ".png")
  715. print("image_index", image_index)
  716. image_index = 99
  717. if generate_pic.run(image_path=original_image_path,
  718. cut_image_path=original_move_bg_image_path,
  719. out_path=out_path,
  720. image_deal_mode=is_image_deal_mode,
  721. image_index=image_index,
  722. out_pic_size=settings.OUT_PIC_SIZE,
  723. is_logo=True if i_n == 1 else False,
  724. out_process_path_1=out_process_path_1,
  725. out_process_path_2=out_process_path_2,
  726. max_box=max_box,
  727. logo_path=logo_path,
  728. ):
  729. # self.show_progress_detail("货号图{} _{} 已完成800*800图片制作~".format(image_index, file_name))
  730. callback_func("货号图{} _{} 已完成800*800图片制作~".format(image_index, file_name))
  731. else:
  732. # self.show_progress_detail("货号图{} _{} 图片生成处理失败~".format(image_index, file_name))
  733. callback_func("货号图{} _{} 图片生成处理失败~".format(image_index, file_name))
  734. # 完成处理的图片进度
  735. self.lock.acquire()
  736. # self.set_progress()
  737. self.lock.release()
  738. def get_goods_art_no(self, date_time_original):
  739. time_array = time.strptime(date_time_original, "%Y:%m:%d %H:%M:%S")
  740. time_array = time.mktime(time_array)
  741. datetime_obj = datetime.fromtimestamp(time_array)
  742. session = SqlQuery()
  743. configModel = CRUD(DeviceConfig)
  744. result = configModel.read(
  745. session, conditions={"photo_create_time": datetime_obj}, order_by="id", ascending=True
  746. )
  747. if result:
  748. return result.goods_art_no, result.image_index, result.image_deal_mode
  749. else:
  750. return None
  751. def get_goods_art_no_info(self, numbers_list=None, goods_art_list=None, headers=None):
  752. # 获取商品基础信息,入参为商品的编号
  753. url = "{domain}/api/backend/goods_client/goods_query".format(
  754. domain=settings.APP_HOST
  755. )
  756. data = {
  757. 'goods_art_list': goods_art_list
  758. }
  759. data = json.dumps(data)
  760. _s = requests.session().post(url=url, data=data, headers=headers)
  761. response_data = _s.json()
  762. goods_number_data = {}
  763. # ["", "", "", "", "", "", "", "", "", "", "", ]
  764. if "data" not in response_data:
  765. return {}
  766. for data in response_data["data"]:
  767. goods_number_data[data["goods_art_no"]] = {}
  768. goods_number_data[data["goods_art_no"]]["商品货号"] = data["goods_art_no"].upper()
  769. goods_number_data[data["goods_art_no"]]["款号"] = data["goods_number"].upper()
  770. goods_number_data[data["goods_art_no"]]["商品面料"] = data["fabric"]
  771. goods_number_data[data["goods_art_no"]]["商品内里"] = data["lining"]
  772. goods_number_data[data["goods_art_no"]]["商品鞋底"] = data["sole"]
  773. goods_number_data[data["goods_art_no"]]["鞋垫"] = data["insole"]
  774. goods_number_data[data["goods_art_no"]]["颜色名称"] = data["color"]
  775. return goods_number_data
  776. def get_data_from_hqt_with_goods_art_no(self, goods_art_no_list):
  777. _goods_art_no_list = copy.deepcopy(goods_art_no_list)
  778. _list = []
  779. # 单次请求数少于20个
  780. goods_art_no_dict = {}
  781. while _goods_art_no_list:
  782. goods_art_no = _goods_art_no_list.pop()
  783. _list.append(goods_art_no)
  784. if len(_list) == 20 or len(_goods_art_no_list) == 0:
  785. online_goods_art_data = self.get_goods_art_no_info(
  786. goods_art_list=_list
  787. )
  788. if online_goods_art_data:
  789. for _goods_art_no in online_goods_art_data:
  790. goods_art_no_dict[_goods_art_no] = online_goods_art_data[
  791. _goods_art_no
  792. ]
  793. _list = []
  794. return goods_art_no_dict
  795. def get_goods_art_no_info(self, numbers_list=None, goods_art_list=None, headers=None):
  796. # 获取商品基础信息,入参为商品的编号
  797. url = "{domain}/api/backend/goods_client/goods_query".format(
  798. domain=settings.APP_HOST
  799. )
  800. data = {
  801. 'goods_art_list': goods_art_list
  802. }
  803. data = json.dumps(data)
  804. _s = requests.session().post(url=url, data=data, headers=headers)
  805. # _s = self.s.get(url=url, params=params, headers=settings.Headers)
  806. response_data = _s.json()
  807. goods_number_data = {}
  808. # ["", "", "", "", "", "", "", "", "", "", "", ]
  809. if "data" not in response_data:
  810. return {}
  811. for data in response_data["data"]:
  812. goods_number_data[data["goods_art_no"]] = {}
  813. goods_number_data[data["goods_art_no"]]["商品货号"] = data["goods_art_no"].upper()
  814. goods_number_data[data["goods_art_no"]]["款号"] = data["goods_number"].upper()
  815. goods_number_data[data["goods_art_no"]]["商品面料"] = data["fabric"]
  816. goods_number_data[data["goods_art_no"]]["商品内里"] = data["lining"]
  817. goods_number_data[data["goods_art_no"]]["商品鞋底"] = data["sole"]
  818. goods_number_data[data["goods_art_no"]]["鞋垫"] = data["insole"]
  819. goods_number_data[data["goods_art_no"]]["颜色名称"] = data["color"]
  820. return goods_number_data
  821. def get_data_from_hqt(self, goods_number_list):
  822. _goods_number_list = copy.deepcopy(goods_number_list)
  823. _list = []
  824. # 单次请求数少于20个
  825. goods_number_dict = {}
  826. while _goods_number_list:
  827. goods_art_no = _goods_number_list.pop()
  828. if "NUM" in goods_art_no:
  829. goods_art_no = goods_art_no.replace("NUM", "")
  830. _list.append(goods_art_no)
  831. if len(_list) == 20 or len(_goods_number_list) == 0:
  832. online_goods_art_data = self.get_goods_art_no_info(
  833. numbers_list=_list
  834. )
  835. if online_goods_art_data:
  836. for number in online_goods_art_data:
  837. goods_number_dict["NUM" + number] = online_goods_art_data[
  838. number
  839. ]
  840. _list = []
  841. return goods_number_dict
  842. def dealMoveImage(self, image_dir: str, callback_func=None) -> dict:
  843. if not self.check_path(image_dir=image_dir + "/历史"):
  844. return {'code': 1, 'msg': '文件夹创建失败', 'data': {}}
  845. # 遍历目标文件夹,获取有拍摄信息的图片,并按拍摄时间排序
  846. files = self.list_dir(image_dir)
  847. original_photo_list = [] # 原始图片列表
  848. for file in files:
  849. # -----图片清洗
  850. file_path = image_dir + "/" + file
  851. if os.path.isdir(file_path): # 忽略文件夹
  852. continue
  853. file_name, suffix = os.path.splitext(file)
  854. if suffix not in _Type: # 非图片进行移除
  855. shutil.move(file_path, image_dir + "/历史/" + file)
  856. continue
  857. date_time_original = self.get_date_time_original(file_path) # 获取照片拍照时间
  858. if date_time_original:
  859. # 基于照片的时间,与数据库匹配goods_art_no
  860. _data = self.get_goods_art_no(date_time_original)
  861. if _data:
  862. # 能匹配上数据库
  863. goods_art_no, image_index, image_deal_mode = _data
  864. print("832 与数据库匹配goods_art_no", file_name, date_time_original, goods_art_no)
  865. original_photo_list.append({"file_path": file_path,
  866. "file": file,
  867. "date_time_original": date_time_original,
  868. "goods_art_no": goods_art_no,
  869. "image_index": image_index,
  870. "real_goods_art_no": "",
  871. "real_goods_number": "",
  872. })
  873. else:
  874. # 匹配不上报错
  875. # self.show_progress_detail("图片:{} 无法对应货号,不做处理".format(file))
  876. if callback_func:
  877. callback_func("图片:{} 无对应货号".format(file))
  878. # shutil.move(photo_dict["file_path"], self.image_dir + "/历史/" + photo_dict["file"])
  879. continue
  880. else:
  881. shutil.move(file_path, image_dir + "/历史/" + file)
  882. if not original_photo_list:
  883. return {"code": 1, "msg": "没有任何匹配的图片", 'data': {}}
  884. if settings.PROJECT == "红蜻蜓":
  885. # 批量请求货号图信息
  886. goods_art_no_list = [x["goods_art_no"] for x in original_photo_list]
  887. goods_art_no_list = list(set(goods_art_no_list))
  888. goods_art_no_list = [x for x in goods_art_no_list if "NUM" not in x]
  889. if goods_art_no_list:
  890. goods_art_no_dict = self.get_data_from_hqt_with_goods_art_no(
  891. goods_art_no_list=goods_art_no_list)
  892. for i in original_photo_list:
  893. if i["goods_art_no"] in goods_art_no_dict:
  894. i["real_goods_art_no"] = i["goods_art_no"]
  895. i["real_goods_number"] = "NUM{}".format(goods_art_no_dict[i["goods_art_no"]]["编号"])
  896. # 批量请求编号对应信息
  897. goods_number_list = [x["goods_art_no"] for x in original_photo_list]
  898. goods_number_list = list(set(goods_number_list))
  899. goods_number_list = [x for x in goods_number_list if "NUM" in x]
  900. if goods_number_list:
  901. goods_number_dict = self.get_data_from_hqt(goods_number_list=goods_number_list)
  902. for i in original_photo_list:
  903. if i["goods_art_no"] in goods_number_dict:
  904. i["real_goods_number"] = i["goods_art_no"]
  905. i["real_goods_art_no"] = goods_number_dict[i["goods_art_no"]]["商品货号"]
  906. # 排序需要基于拍照的文件序号进行处理
  907. original_photo_list.sort(
  908. key=lambda x: "{}-{}-{}".format(x["goods_art_no"], x["image_index"], x["file"]))
  909. # print(original_photo_list)
  910. # 对有拍摄信息的图片进行数据库比对,如有比对上,则移动至货号文件夹,否则移入历史文件夹
  911. total_num = len(original_photo_list)
  912. # 当天日期作为文件夹
  913. seconds = time.time()
  914. output_path = "output/{f_name}".format(f_name=time.strftime("%Y-%m-%d", time.localtime(seconds)))
  915. # 遍历每个匹配好的数据进行处理
  916. n = 0
  917. for photo_dict in original_photo_list:
  918. n += 1
  919. # 进度条
  920. goods_art_no = photo_dict["goods_art_no"]
  921. original_image_path = photo_dict["file_path"]
  922. # 输出货号文件夹
  923. if photo_dict["real_goods_art_no"]:
  924. goods_art_no = "{}@{}".format(photo_dict["real_goods_art_no"], photo_dict["real_goods_number"])
  925. goods_art_no_path = "{output_path}/{goods_art_no}".format(output_path=output_path,
  926. goods_art_no=goods_art_no)
  927. # 创建货号下的一系列文件夹
  928. self.create_folder(goods_art_no_path)
  929. # 重命名并进行移动
  930. print("开始移动:{} {} 命名为:{}".format(goods_art_no, original_image_path, goods_art_no_path))
  931. self.move_images(goods_art_no, goods_art_no_path, original_image_path) # 货号、货号文件路径、原始图路径
  932. time.sleep(0.2)
  933. # self.progress_sign.emit({"type": "移动原始图片", "progress_bar_value": int(n / total_num * 100)})
  934. # self.show_progress_detail("货号{} 相关文件夹创建完成,已移动原图~".format(goods_art_no))
  935. if callback_func:
  936. callback_func("货号{} 相关文件夹创建完成,已移动原图~".format(goods_art_no))
  937. print("已完成移动处理")
  938. if n != 0:
  939. # if settings.MattingPics:
  940. # # 检查所有未处理的货号文件夹,查看是否有完成图片加工处理
  941. # self.deal_images()
  942. # 自动生成一个货号表
  943. print("output_path", output_path)
  944. GenerateGoodsArtNoTable.deal(output_path)
  945. # 完成处理
  946. # self.set_state(state_value=2)
  947. return {'code': 0, 'msg': '处理完成', 'target_path': output_path, 'data': {}}
  948. def check_path(self, image_dir: str):
  949. if not os.path.exists(image_dir):
  950. os.mkdir(image_dir)
  951. return True
  952. def get_date_time_original(self, file_path):
  953. with open(file_path, 'rb') as file_data:
  954. tags = exifread.process_file(file_data)
  955. if "EXIF DateTimeOriginal" in tags:
  956. return str(tags["EXIF DateTimeOriginal"])
  957. else:
  958. return False
  959. def create_folder(self, path):
  960. def check_folder(__path):
  961. if not os.path.exists(__path):
  962. os.makedirs(__path)
  963. return False
  964. return True
  965. # 文件夹不存在,创建货号子集文件夹
  966. if not check_folder(path):
  967. for name in ["原始图", "原始图_已抠图", "800x800", "200images"]:
  968. other_path = path + "/" + name
  969. check_folder(other_path)
  970. def move_images(self, goods_art_no, goods_art_no_path, old_image_path):
  971. """
  972. 步骤:
  973. 1、移动到原始图
  974. Args:
  975. goods_art_no:
  976. goods_art_no_path:
  977. old_image_path:
  978. Returns:
  979. """
  980. # 移动到原始图
  981. file = os.path.split(old_image_path)[1]
  982. # 扩展名
  983. e = os.path.splitext(file)[1]
  984. # 获取图片序列
  985. self.goods_images_count_dict[goods_art_no] += 1
  986. # A9999(1).jpg
  987. new_file_name = "{}({})".format(goods_art_no, self.goods_images_count_dict[goods_art_no])
  988. original_image_path = "{}/原始图/{}{}".format(goods_art_no_path, new_file_name, e)
  989. # 移动图片
  990. shutil.move(old_image_path, original_image_path)
  991. def pixianRemoveImageBg(self, file_path: str, out_file_path: str, callbackek_func=None):
  992. url = self.dataModeMatchPhoto.get_online_data.uploadImage(local_path=file_path)
  993. remonveUrl = settings.DOMAIN + '/api/ai_image/main/remove_background'
  994. param = {'base_image': url}
  995. post_headers = {"Authorization": self.token,
  996. "Content-Length": "",
  997. "Content-Type": "application/json",
  998. "Accept": "application/json"}
  999. result = requests.post(remonveUrl, data=json.dumps(param), headers=post_headers).json()
  1000. print(result)
  1001. if "code" in result and result['code'] == 0:
  1002. response = requests.get(result['data']['image'][0])
  1003. with open(out_file_path, 'wb') as file:
  1004. file.write(response.content)
  1005. return result['data']['image'][0]
  1006. else:
  1007. callbackek_func("精细化抠图处理失败 {}".format(result['message']))
  1008. return ''
  1009. def list_dir(self, path):
  1010. listdir = os.listdir(path)
  1011. return natsorted(listdir, alg=ns.PATH)