| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847 |
- # from UI.matching_photos.matching_photos import Ui_Form as matching_photos_Ui_Form
- import os
- from UI.matching_photos.matching_and_cutout_photos import (
- Ui_Form as matching_photos_Ui_Form,
- )
- from import_qt_mode import *
- import settings
- from collections import defaultdict
- from module.service.base_deal_image import BaseDealImage
- from module.view_control.generate_goods_art_no_table.module_generate_goods_art_no_table import GenerateGoodsArtNoTable
- from module.view_control.matching_photos.data import DataModeMatchPhoto
- from module.view_control.manual_image_matching.m_image_matching_cotrol import MainMatchingWindow
- from PySide6.QtGui import QPixmap
- from PIL import Image
- import io
- import threading
- import shutil
- import time
- from module.base_mode.pic_deal import PicDeal
- # import exifread
- from module.base_mode.base import *
- from module.view_control.MineQWidget import MineQWidget, DialogShow
- from threading import Event
- from functools import partial
- from UI.matching_photos.temp_item import Ui_Form as UI_temp_item
- """
- 照片自动货号匹配 将图片放置在指定文件夹下,并自动对应不同的货号进行整理
- """
- class MatchingPhotos(MineQWidget):
- progress_sign = Signal(dict)
- info_sign = Signal(str)
- text_show = Signal(str)
- def __init__(self):
- super().__init__()
- self.image_dir = settings.PhotoImageDir
- self.ui = matching_photos_Ui_Form()
- self.ui.setupUi(self)
- # 0禁用 1进行中 2已结束
- self.state = 2
- self.event = Event()
- self.goods_images_count_dict = defaultdict(int)
- self.data_match_photo = DataModeMatchPhoto()
- self.excel_path = ""
- # 上次使用的详情模板
- self.last_temp = settings.MATCHING_LAST_TEMP
- # 指定单独处理的颜色文件夹
- self.special_goods_art_no_folder = []
- self.init()
- self.show()
- def init(self):
- # 文本
- self.ui.textBrowser.clear()
- text = """请将capture One 加工后的图片放在指定目录下(目录为当前文件夹下的{}/data文件夹),务必确保导出的图片有拍摄时间信息。""".format(os.getcwd())
- self.ui.textBrowser.append(text)
- self.ui.tabWidget.setCurrentIndex(0)
- # 页面视图1
- self.ui.stackedWidget.setCurrentIndex(0)
- self.text_show.connect(self.append_text_to_browser)
- self.show_img_dir()
- self.ui.select_path.mousePressEvent = self.change_img_dir
- self.ui.progressBar.setValue(0)
- self.ui.progressBar.setMaximum(100)
- self.ui.progressBar.setValue(0)
- self.ui.progressBar.hide()
- self.ui.line_image_pos.setText(settings.cutimage_dict['imageorder'])
- self.ui.need_resize.setText(settings.cutimage_dict['resize_image_view'])
- self.ui.check_image_total.setChecked(bool(settings.cutimage_dict['is_check_number']))
- self.ui.check_is_pass.setChecked(bool(settings.cutimage_dict['is_filter']))
- print(settings.cutimage_dict)
- if settings.DEFAULT_CUTOUT_MODE == '普通抠图':
- self.ui.cutout_nomal.setChecked(True)
- elif settings.DEFAULT_CUTOUT_MODE == ' 精细化抠图':
- self.ui.cutout_exquisite.setChecked(True)
- if not bool(settings.IsExquisiteMode):
- self.ui.cutout_exquisite.setEnabled(False)
- # 展示是否指定内容抠图
- self.ui.is_do_other.toggled.connect(self.change_do_special_treatment)
- self.change_do_special_treatment()
- self.progress_sign.connect(self.show_progress)
- self.ui.run.clicked.connect(self.run_image_cut) # 抠图与主图加工
- self.ui.run_2.clicked.connect(self.run_matching) # 匹配图片
- self.ui.back.clicked.connect(self.back)
- # 页面视图2
- self.ui.back.hide()
- self.set_logo_selected()
- # 手动匹配图片
- self.ui.manual_matching_pic.mousePressEvent = self.manual_matching_pic_mousePressEvent
- # 切换是否特殊处理的开关
- def change_do_special_treatment(self, *args):
- if self.ui.is_do_other.isChecked():
- self.ui.show_deal_condition.show()
- else:
- self.ui.show_deal_condition.hide()
- # 设置选择logo模板
- def set_logo_selected(self):
- logo_root_path = ""
- if settings.PROJECT == "红蜻蜓":
- logo_root_path = r"{}\resources\LOGO\HQT".format(os.getcwd())
- elif settings.PROJECT == "惠利玛":
- if "小苏" in settings.Company:
- logo_root_path = r"{}\resources\LOGO\xiaosushuoxie".format(os.getcwd())
- if "惠利玛" in settings.Company:
- logo_root_path = r"{}\resources\LOGO\HLM".format(os.getcwd())
- self.logo_path_dict = {"请选择": "", "无logo": ""}
- if logo_root_path:
- if os.path.exists(logo_root_path):
- image_list = get_images(logo_root_path)
- print("111111111 image_list", image_list)
- for image_data in image_list:
- self.logo_path_dict[image_data["file_name"]] = image_data["file_path"]
- self.ui.logo_select_ui.addItems([x for x in self.logo_path_dict])
- self.ui.logo_select_ui.setCurrentText("请选择")
- if settings.MATCHING_LAST_LOGO_TEMP:
- if settings.MATCHING_LAST_LOGO_TEMP in [x for x in self.logo_path_dict]:
- self.ui.logo_select_ui.setCurrentText(settings.MATCHING_LAST_LOGO_TEMP)
- def manual_matching_pic_mousePressEvent(self, event):
- if not self.image_dir:
- a = QMessageBox.question(
- self,
- "确认",
- "请先选择目标文件夹",
- QMessageBox.Yes,
- )
- return
- self.manual = MainMatchingWindow(root_path=self.image_dir)
- @Slot()
- def on_stop_clicked(self):
- self.event.set()
- pass
- def change_img_dir(self, *args):
- folder = QFileDialog.getExistingDirectory(self, "选取文件夹", "./")
- print(folder)
- settings.set_config(data_dict={"photo_image_dir": folder})
- # 清空已特殊选择等处理
- self.ui.is_do_other.setChecked(False)
- self.show_img_dir(image_dir=folder)
- def show_img_dir(self, image_dir=None):
- if image_dir:
- self.image_dir = image_dir
- else:
- self.image_dir = settings.PhotoImageDir
- if self.image_dir:
- self.ui.path_name.show()
- self.ui.path_name.setText(self.image_dir)
- else:
- self.ui.path_name.hide()
- def show_progress(self, data):
- progress_bar_value = data["progress_bar_value"]
- self.ui.progressBar.setValue(progress_bar_value)
- def check(self):
- _path = self.image_dir + "/历史"
- if not os.path.exists(_path):
- os.mkdir(_path)
- return True
- def set_state(self, state_value: int):
- # 0禁用 1进行中 2已结束
- if state_value not in [0, 1, 2]:
- return
- self.state = state_value
- if self.state == 0:
- self.ui.stackedWidget.setCurrentIndex(0)
- if self.state == 1:
- self.ui.stackedWidget.setCurrentIndex(1)
- self.ui.back.hide()
- self.ui.stop.show()
- self.ui.textBrowser_4.clear()
- self.ui.textBrowser_4.show()
- self.event.clear()
- if self.state == 2:
- self.ui.stackedWidget.setCurrentIndex(1)
- self.ui.back.show()
- self.ui.stop.hide()
- def back(self):
- self.ui.stackedWidget.setCurrentIndex(0)
- self.ui.back.hide()
- self.ui.run.show()
- self.ui.stop.hide()
- self.ui.textBrowser_4.clear()
- self.ui.textBrowser_4.hide()
- def check_first_call_back(self, data):
- # 首次数据校验的信息返回
- # self.show_message(text="22222222222222222222222")
- # QMessageBox.critical(self, "警告", "1111111", QMessageBox.Ok)
- code = data["code"]
- if data["message"]:
- button_1, button_2, button_3 = None, None, None
- button_1 = "移除"
- button_2 = "继续"
- text = data["message"]
- my_dialog = DialogShow(self, text=text, button_1=button_1, button_2=button_2)
- ret = my_dialog.exec()
- print(my_dialog.flag_name)
- if "移除" in my_dialog.flag_name:
- pass
- if "继续" in my_dialog.flag_name:
- pass
- def check_test(self, test):
- print(test)
- time.sleep(3)
- return_data = {"code": 99,
- "message": "messagemessagemessagemessagemessagemessagemessage",
- "data": {"error_folder_list": [],
- "goods_no_dict": {},
- "succeed_folder_list": [],
- }}
- return return_data
- def run_matching11111(self, *args):
- func = partial(self.check_test, test=1111111)
- self.do_thread_run(func=func, call_back=self.check_first_call_back, time_out=30)
- def run_matching(self, *args):
- if settings.PROJECT == "红蜻蜓":
- if not settings.IsLogin:
- a = QMessageBox.question(
- self,
- "确认",
- "请先进行登录红蜻蜓账号",
- QMessageBox.Yes | QMessageBox.No,
- )
- return
- self.set_state(state_value=1)
- self.goods_images_count_dict = {}
- self.goods_images_count_dict = defaultdict(int)
- self.do_thread_run(func=self.run_by_thread, call_back=self.matchingCallBack, time_out=60)
- # self.t = threading.Thread(target=self.run_by_thread, args=())
- # self.t.start()
- def matchingCallBack(self, data: dict):
- self.set_state(2)
- if data['code'] == 0:
- self.show_progress_detail('处理完成')
- button_1, button_2, button_3 = None, None, None
- button_1 = "去抠图"
- text = '移动完成'
- my_dialog = DialogShow(self, text=text, button_1=button_1, button_2=button_2)
- ret = my_dialog.exec()
- if "去抠图" in my_dialog.flag_name:
- self.back()
- self.ui.tabWidget.setCurrentIndex(1)
- path = os.getcwd() + "/" + data['target_path']
- self.ui.path_name.setText(path)
- else:
- self.show_progress_detail(data['msg'])
- text = data['msg']
- my_dialog = DialogShow(self, text=text)
- ret = my_dialog.exec()
- def run_image_cut(self, *args):
- if not settings.IsLogin:
- QMessageBox.question(
- self, "确认", "请先登录", QMessageBox.Yes | QMessageBox.No
- )
- return
- logo_name = self.ui.logo_select_ui.currentText()
- if logo_name == "请选择":
- QMessageBox.question(
- self, "确认", "请先选择logo模板", QMessageBox.Yes | QMessageBox.No
- )
- return
- if self.ui.cutout_exquisite.isChecked() and not bool(settings.IsExquisiteMode):
- QMessageBox.question(
- self, "确认", "暂无 精细化抠图权限", QMessageBox.Yes | QMessageBox.No
- )
- return
- self.set_state(state_value=1)
- self.t = threading.Thread(target=self.threadImageCut, args=())
- self.t.start()
- def threadImageCut(
- self,
- ):
- image_dir = self.ui.path_name.text()
- baseDealImage = BaseDealImage(image_dir=image_dir)
- image_order = self.ui.line_image_pos.text()
- is_check_number = self.ui.check_image_total.isChecked()
- is_filter = self.ui.check_is_pass.isChecked()
- resize_image_view = self.ui.need_resize.text()
- logo_name = self.ui.logo_select_ui.currentText()
- settings.MATCHING_LAST_LOGO_TEMP = logo_name
- logo_path = self.logo_path_dict[logo_name]
- cutout_mode = '1'
- if self.ui.cutout_exquisite.isChecked():
- cutout_mode = '2'
- configData = {
- 'imageorder': image_order,
- 'resize_image_view': resize_image_view,
- 'is_check_number': str(is_check_number),
- 'is_filter': str(is_filter),
- 'cutout_mode': str(cutout_mode),
- 'matching_mode_last': settings.MATCHING_MODE_LAST,
- "matching_last_temp": self.last_temp,
- "matching_last_logo_temp": logo_name,
- }
- settings.cutimage_dict['imageorder'] = image_order
- settings.cutimage_dict['resize_image_view'] = resize_image_view
- settings.cutimage_dict['is_check_number'] = str(is_check_number)
- settings.cutimage_dict['is_filter'] = str(is_filter)
- settings.cutimage_dict['cutout_mode'] = str(cutout_mode)
- settings.set_config(data_dict=configData, section='cutimage')
- # =================整理要处理的货号文件夹数据=================
- is_ok = True
- all_goods_art_no_folder_data = get_all_goods_art_no_folder(path=image_dir)
- todo_goods_art_no_folder_name_list = []
- if not self.ui.is_do_other.isChecked():
- todo_goods_art_no_folder_name_list = [x["folder_name"] for x in all_goods_art_no_folder_data]
- else:
- is_filter = False
- specified_goods_art_no_folder = self.ui.special_goods_art_no_folder_line.text()
- specified_goods_art_no_folder = specified_goods_art_no_folder.strip()
- specified_goods_art_no_folder = specified_goods_art_no_folder.replace(",", ",")
- if not specified_goods_art_no_folder:
- self.show_progress_detail('请手动输入文件夹名称(多选),或关闭指定文件夹模式')
- is_ok = False
- else:
- specified_goods_art_no_folder_list = specified_goods_art_no_folder.split(",")
- all_folder_name_list = [x["folder_name"] for x in all_goods_art_no_folder_data]
- for goods_art_no_folder_name in specified_goods_art_no_folder_list:
- if goods_art_no_folder_name:
- if goods_art_no_folder_name not in all_folder_name_list:
- self.show_progress_detail('文件夹:{},在您选的目录下不存在'.format(goods_art_no_folder_name))
- is_ok = False
- else:
- todo_goods_art_no_folder_name_list.append(goods_art_no_folder_name)
- if not is_ok:
- self.set_state(state_value=2)
- return
- # 清空指定文件夹的已抠图文件
- print("todo_goods_art_no_folder_name_list",todo_goods_art_no_folder_name_list)
- if self.ui.is_do_other.isChecked():
- if self.ui.is_clean_cutout_image.isChecked():
- for goods_art_no_folder_name in todo_goods_art_no_folder_name_list:
- goods_art_no_folder_path = "{}/{}/原始图_已抠图".format(image_dir, goods_art_no_folder_name)
- print("goods_art_no_folder_path",goods_art_no_folder_path)
- if os.path.exists(goods_art_no_folder_path):
- remove_all_file(goods_art_no_folder_path)
- if settings.IS_TEST:
- result = baseDealImage.cutoutImage(
- image_dir=image_dir,
- todo_goods_art_no_folder_name_list=todo_goods_art_no_folder_name_list,
- image_order=image_order,
- is_check_number=is_check_number,
- is_filter=is_filter,
- resize_image_view=resize_image_view,
- callback_func=self.show_progress_detail,
- event=self.event,
- cutout_mode=cutout_mode,
- logo_path=logo_path,
- )
- if "code" in result and result['code'] != 0:
- self.show_progress_detail(result['msg'])
- else:
- self.show_progress_detail('处理完成')
- else:
- try:
- result = baseDealImage.cutoutImage(
- image_dir=image_dir,
- image_order=image_order,
- todo_goods_art_no_folder_name_list=todo_goods_art_no_folder_name_list,
- is_check_number=is_check_number,
- is_filter=is_filter,
- resize_image_view=resize_image_view,
- callback_func=self.show_progress_detail,
- event=self.event,
- cutout_mode=cutout_mode,
- logo_path=logo_path,
- )
- if "code" in result and result['code'] != 0:
- self.show_progress_detail(result['msg'])
- else:
- self.show_progress_detail('处理完成')
- except BaseException as e:
- print(e)
- self.show_progress_detail('程序异常')
- self.set_state(state_value=2)
- def show_progress_detail(self, text):
- self.text_show.emit(text)
- def append_text_to_browser(self, text):
- self.ui.textBrowser_4.append(text)
- def run_by_thread(self):
- image_dir = "{}/data".format(os.getcwd())
- baseDealImage = BaseDealImage(image_dir=image_dir)
- # result = baseDealImage.dealMoveImage(
- # image_dir=settings.PhotoOutputDir, callback_func=self.show_progress_detail
- # )
- result = baseDealImage.dealMoveImage(
- image_dir=image_dir, callback_func=self.show_progress_detail
- )
- return result
- def run_by_thread_backup(self):
- if not self.check():
- return
- # 遍历目标文件夹,获取有拍摄信息的图片,并按拍摄时间排序
- files = os.listdir(self.image_dir)
- _Type = [".png", ".PNG", ".jpg", ".JPG", ".gif", ".GIF", ".jpge", ".JPGE"]
- original_photo_list = [] # 原始图片列表
- for file in files:
- # -----图片清洗
- file_path = self.image_dir + "/" + file
- if os.path.isdir(file_path): # 忽略文件夹
- continue
- file_name, e = os.path.splitext(file)
- if e not in _Type: # 非图片进行移除
- shutil.move(file_path, self.image_dir + "/历史/" + file)
- continue
- date_time_original = self.get_date_time_original(
- file_path
- ) # 获取照片拍照时间
- if date_time_original:
- # 基于照片的时间,与数据库匹配goods_art_no
- _data = self.data_match_photo.get_goods_art_no(date_time_original)
- if _data:
- # 能匹配上数据库
- goods_art_no, image_index, image_deal_mode = _data
- print(
- "与数据库匹配goods_art_no",
- file_name,
- date_time_original,
- goods_art_no,
- )
- original_photo_list.append(
- {
- "file_path": file_path,
- "file": file,
- "date_time_original": date_time_original,
- "goods_art_no": goods_art_no,
- "image_index": image_index,
- "real_goods_art_no": "",
- "real_goods_number": "",
- }
- )
- else:
- # 匹配不上报错
- self.show_progress_detail(
- "图片:{} 无法对应货号,不做处理".format(file)
- )
- # shutil.move(photo_dict["file_path"], self.image_dir + "/历史/" + photo_dict["file"])
- continue
- else:
- shutil.move(file_path, self.image_dir + "/历史/" + file)
- if not original_photo_list:
- self.show_progress_detail("没有任何匹配的图片~")
- self.set_state(state_value=2)
- return
- if settings.PROJECT == "红蜻蜓":
- # 批量请求货号图信息
- goods_art_no_list = [x["goods_art_no"] for x in original_photo_list]
- goods_art_no_list = list(set(goods_art_no_list))
- goods_art_no_list = [x for x in goods_art_no_list if "NUM" not in x]
- if goods_art_no_list:
- goods_art_no_dict = (
- self.data_match_photo.get_data_from_hqt_with_goods_art_no(
- goods_art_no_list=goods_art_no_list
- )
- )
- for i in original_photo_list:
- if i["goods_art_no"] in goods_art_no_dict:
- i["real_goods_art_no"] = i["goods_art_no"]
- i["real_goods_number"] = "NUM{}".format(
- goods_art_no_dict[i["goods_art_no"]]["编号"]
- )
- # 批量请求编号对应信息
- goods_number_list = [x["goods_art_no"] for x in original_photo_list]
- goods_number_list = list(set(goods_number_list))
- goods_number_list = [x for x in goods_number_list if "NUM" in x]
- if goods_number_list:
- goods_number_dict = self.data_match_photo.get_data_from_hqt(
- goods_number_list=goods_number_list
- )
- for i in original_photo_list:
- if i["goods_art_no"] in goods_number_dict:
- i["real_goods_number"] = i["goods_art_no"]
- i["real_goods_art_no"] = goods_number_dict[i["goods_art_no"]][
- "商品货号"
- ]
- # 排序需要基于拍照的文件序号进行处理
- original_photo_list.sort(
- key=lambda x: "{}-{}-{}".format(
- x["goods_art_no"], x["image_index"], x["file"]
- )
- )
- print(original_photo_list)
- # 对有拍摄信息的图片进行数据库比对,如有比对上,则移动至货号文件夹,否则移入历史文件夹
- total_num = len(original_photo_list)
- # 当天日期作为文件夹
- seconds = time.time()
- output_path = "output/{f_name}".format(
- f_name=time.strftime("%Y-%m-%d", time.localtime(seconds))
- )
- # 遍历每个匹配好的数据进行处理
- n = 0
- for photo_dict in original_photo_list:
- n += 1
- # 进度条
- goods_art_no = photo_dict["goods_art_no"]
- original_image_path = photo_dict["file_path"]
- # 输出货号文件夹
- if photo_dict["real_goods_art_no"]:
- goods_art_no = "{}@{}".format(
- photo_dict["real_goods_art_no"], photo_dict["real_goods_number"]
- )
- goods_art_no_path = "{output_path}/{goods_art_no}".format(
- output_path=output_path, goods_art_no=goods_art_no
- )
- # 创建货号下的一系列文件夹
- self.create_folder(goods_art_no_path)
- # 重命名并进行移动
- self.move_images(
- goods_art_no, goods_art_no_path, original_image_path
- ) # 货号、货号文件路径、原始图路径
- self.progress_sign.emit(
- {"type": "移动原始图片", "progress_bar_value": int(n / total_num * 100)}
- )
- self.show_progress_detail(
- "货号{} 相关文件夹创建完成,已移动原图~".format(goods_art_no)
- )
- if n != 0:
- # if settings.MattingPics:
- # # 检查所有未处理的货号文件夹,查看是否有完成图片加工处理
- # self.deal_images()
- # 自动生成一个货号表
- print("output_path", output_path)
- GenerateGoodsArtNoTable.deal(output_path)
- # 完成处理
- self.set_state(state_value=2)
- def move_images(self, goods_art_no, goods_art_no_path, old_image_path):
- """
- 步骤:
- 1、移动到原始图
- Args:
- goods_art_no:
- goods_art_no_path:
- old_image_path:
- Returns:
- """
- # 移动到原始图
- file = os.path.split(old_image_path)[1]
- # 扩展名
- e = os.path.splitext(file)[1]
- # 获取图片序列
- self.goods_images_count_dict[goods_art_no] += 1
- # A9999(1).jpg
- new_file_name = "{}({})".format(
- goods_art_no, self.goods_images_count_dict[goods_art_no]
- )
- original_image_path = "{}/原始图/{}{}".format(
- goods_art_no_path, new_file_name, e
- )
- # 移动图片
- shutil.move(old_image_path, original_image_path)
- def deal_images(self):
- """
- 2、压缩并上传平台获取抠图
- 3、抠图处理成白底图
- 4、做成800*800/200*200
- :return:
- """
- output_path = "output"
- """
- 扫描文档,检查有哪些需要进行抠图等处理
- """
- to_do_images_total = 0
- for _date_folder in os.listdir(output_path):
- if not os.path.isdir("{}/{}".format(output_path, _date_folder)):
- continue
- for goods_art_no_folder in os.listdir(
- "{}/{}".format(output_path, _date_folder)
- ):
- # print(goods_art_no_folder)
- all_original_images = os.listdir(
- "{}/{}/{}/原始图".format(
- output_path, _date_folder, goods_art_no_folder
- )
- )
- all_moved_images = [
- os.path.splitext(x)[0]
- for x in os.listdir(
- "{}/{}/{}/原始图_已抠图".format(
- output_path, _date_folder, goods_art_no_folder
- )
- )
- ]
- for file in all_original_images:
- if os.path.splitext(file)[0] not in all_moved_images:
- print("----------》", goods_art_no_folder, file)
- to_do_images_total += 1
- if to_do_images_total > 0:
- self.progress_sign.emit(
- {"type": "处理图片 抠图、加工等", "progress_bar_value": 0}
- )
- else:
- return True
- """开始处理抠图等处理"""
- n = 0
- for _date_folder in os.listdir(output_path):
- # 过滤非文件夹的文件
- if not os.path.isdir("{}/{}".format(output_path, _date_folder)):
- continue
- # 扫描每个货号
- for goods_art_no_folder in os.listdir(
- "{}/{}".format(output_path, _date_folder)
- ):
- all_original_images = os.listdir(
- "{}/{}/{}/原始图".format(
- output_path, _date_folder, goods_art_no_folder
- )
- )
- all_moved_images = [
- os.path.splitext(x)[0]
- for x in os.listdir(
- "{}/{}/{}/原始图_已抠图".format(
- output_path, _date_folder, goods_art_no_folder
- )
- )
- ]
- for file in all_original_images:
- original_image_path = "{}/{}/{}/原始图/{}".format(
- output_path, _date_folder, goods_art_no_folder, file
- )
- file_name = os.path.splitext(file)[0]
- if file_name not in all_moved_images:
- print("上传平台获取抠图结果----------》", file)
- goods_art_no_folder_path = "{}/{}/{}".format(
- output_path, _date_folder, goods_art_no_folder
- )
- pic_deal = PicDeal()
- # 上传平台获取抠图结果
- original_move_bg_image_path = "{}/原始图_已抠图/{}{}".format(
- goods_art_no_folder_path, file_name, ".png"
- )
- if pic_deal.remove_bg(
- in_path=original_image_path,
- out_path=original_move_bg_image_path,
- ):
- self.show_progress_detail(
- "货号图{} 已完成抠图处理~".format(file_name)
- )
- # 抠图处理成白底图 800*800
- out_800_path = "{}/800x800/{}{}".format(
- goods_art_no_folder_path, file_name, ".jpg"
- )
- pic_deal.create_800image(
- image_path=original_move_bg_image_path,
- out_path=out_800_path,
- )
- # 抠图处理成白底图 200*200
- out_200_path = "{}/200images/{}{}".format(
- goods_art_no_folder_path, file_name, ".jpg"
- )
- pic_deal.resize_and_save(
- image_path=out_800_path,
- out_path=out_200_path,
- width=200,
- )
- self.show_progress_detail(
- "货号图{} 已完成800*800图片和200*200图片制作~".format(
- file_name
- )
- )
- else:
- self.show_progress_detail(
- "货号图{} 抠图处理失败~".format(file_name)
- )
- # 完成处理的图片进度
- n += 1
- self.progress_sign.emit(
- {
- "type": "处理图片 抠图、加工等",
- "progress_bar_value": int(n / to_do_images_total * 100),
- }
- )
- def create_folder(self, path):
- def check_folder(__path):
- if not os.path.exists(__path):
- os.makedirs(__path)
- return False
- return True
- # 文件夹不存在,创建货号子集文件夹
- if not check_folder(path):
- for name in ["原始图", "原始图_已抠图", "800x800", "200images"]:
- other_path = path + "/" + name
- check_folder(other_path)
- def get_date_time_original(self, file_path):
- with open(file_path, "rb") as file_data:
- tags = exifread.process_file(file_data)
- if "EXIF DateTimeOriginal" in tags:
- return str(tags["EXIF DateTimeOriginal"])
- else:
- return False
- class TempItem(QWidget):
- select_sign = Signal(str)
- def __init__(self, parent, _id, image_path):
- super().__init__(parent)
- self.ui = UI_temp_item()
- self.ui.setupUi(self)
- self.image_path = image_path
- self.id = _id
- self.is_select = False
- self.init()
- def init(self):
- self.ui.label.mousePressEvent = self.pic_show
- self.ui.radioButton.clicked.connect(self.select)
- self.set_label_image()
- def cancel_select(self, *args):
- self.is_select = False
- self.ui.radioButton.setChecked(False)
- def select(self, *args):
- self.is_select = True
- self.ui.radioButton.setChecked(True)
- self.select_sign.emit(self.id)
- def pic_show(self, *args, **kwargs):
- if os.path.exists(self.image_path):
- im = Image.open(self.image_path)
- threading.Thread(target=im.show, args=()).start()
- def set_label_image(self):
- if not os.path.exists(self.image_path):
- return
- try:
- bytes_io = io.BytesIO()
- w, h = self.ui.image_show.width(), self.ui.image_show.height()
- _img_raw = Image.open(self.image_path)
- _img_raw = self.to_resize(_img_raw, width=w * 2)
- _img_raw = _img_raw.crop(box=(0, 0, w * 2, h * 2))
- # _img_raw.thumbnail((w * 2, int(_img_raw.height * w * 2 / _img_raw.width)))
- # img_raw = _img_raw.resize(size=(w, h))
- _img_raw.save(bytes_io, "JPEG")
- icon = QPixmap()
- # icon.loadFromData(img)
- icon.loadFromData(bytes_io.getvalue())
- icon = icon.scaled(
- self.ui.image_show.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation
- )
- self.ui.image_show.setPixmap(icon)
- # self.mousePressEvent = lambda x: self.show_one_data(row)
- except:
- pass
- def to_resize(self, _im, width=None, high=None):
- _im_x, _im_y = _im.size
- if width and high:
- if _im_x >= _im_y:
- high = None
- else:
- width = None
- if width:
- re_x = int(width)
- re_y = int(_im_y * re_x / _im_x)
- else:
- re_y = int(high)
- re_x = int(_im_x * re_y / _im_y)
- _im = _im.resize((re_x, re_y))
- return _im
|