Loading ui/io_thread.py 0 → 100644 +34 −0 Original line number Diff line number Diff line import numpy as np from utils.io_utils import imread, imwrite from PyQt5.QtCore import Qt, pyqtSignal, QPoint, QSize, QThread from PyQt5.QtGui import QImage class ImgSaveThread(QThread): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.im_save_list = [] self.job = None def saveImg(self, save_path: str, img: QImage): self.im_save_list.append((save_path, img)) if self.job is None: self.job = self._save_img self.start() def _save_img(self): while True: if len(self.im_save_list) == 0: break save_path, img = self.im_save_list.pop(0) if isinstance(img, QImage): img.save(save_path) elif isinstance(img, np.ndarray): imwrite(save_path, img) def run(self): if self.job is not None: self.job() self.job = None No newline at end of file ui/mainwindow.py +21 −5 Original line number Diff line number Diff line Loading @@ -3,8 +3,8 @@ import os import json from PyQt5.QtWidgets import QMainWindow, QHBoxLayout, QVBoxLayout, QApplication, QStackedWidget, QWidget, QFileDialog, QLabel, QSizePolicy, QComboBox, QListView, QToolBar, QMenu, QSpacerItem, QPushButton, QAction, QCheckBox, QToolButton, QSplitter, QListWidget, QShortcut, QListWidgetItem from PyQt5.QtCore import Qt, pyqtSignal, QPoint, QSize from PyQt5.QtGui import QGuiApplication, QIcon, QMouseEvent, QCloseEvent, QKeySequence, QImage, QPainter from PyQt5.QtCore import Qt, pyqtSignal, QPoint, QSize, QThread from PyQt5.QtGui import QGuiApplication, QIcon, QCloseEvent, QKeySequence, QImage, QPainter from typing import List, Union, Tuple Loading @@ -16,10 +16,13 @@ from .imgtranspanel import TextPanel from .drawingpanel import DrawingPanel from .scenetext_manager import SceneTextManager from .mainwindowbars import TitleBar, LeftBar, RightBar, BottomBar from .io_thread import ImgSaveThread from .constants import STYLESHEET_PATH, CONFIG_PATH, DPI, LDPI, LANG_SUPPORT_VERTICAL from . import constants class PageListView(QListWidget): def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) Loading Loading @@ -68,6 +71,8 @@ class MainWindow(FrameLessWindow): self.setupShortcuts() self.showMaximized() self.imsave_thread = ImgSaveThread() if open_dir != '' and osp.exists(open_dir): self.openDir(open_dir) elif self.config.open_recent_on_startup: Loading Loading @@ -363,11 +368,17 @@ class MainWindow(FrameLessWindow): self.saveCurrentPage() def saveCurrentPage(self, update_scene_text=True, save_proj=True): self.logger.info('saving ' + self.imgtrans_proj.current_img) if update_scene_text: self.st_manager.updateTextBlkList() if save_proj: self.imgtrans_proj.save(save_mask=True, save_inpainted=True) self.imgtrans_proj.save() mask_path = self.imgtrans_proj.get_mask_path() mask_array = self.imgtrans_proj.mask_array inpainted_path = self.imgtrans_proj.get_inpainted_path() inpainted_array = self.imgtrans_proj.inpainted_array else: mask_path = inpainted_path = None img = QImage(self.canvas.imgLayer.pixmap().size(), QImage.Format.Format_ARGB32) if self.config.imgtrans_textblock: Loading @@ -385,8 +396,13 @@ class MainWindow(FrameLessWindow): painter.end() if not osp.exists(self.imgtrans_proj.result_dir()): os.makedirs(self.imgtrans_proj.result_dir()) img.save(self.imgtrans_proj.get_result_path(self.imgtrans_proj.current_img)) imsave_path = self.imgtrans_proj.get_result_path(self.imgtrans_proj.current_img) self.imsave_thread.saveImg(imsave_path, img) if mask_path is not None: self.imsave_thread.saveImg(mask_path, mask_array) if inpainted_path is not None: self.imsave_thread.saveImg(inpainted_path, inpainted_array) if hide_tsc: self.st_manager.txtblkShapeControl.show() self.canvas.setProjSaveState(False) Loading ui/misc.py +11 −7 Original line number Diff line number Diff line Loading @@ -218,15 +218,15 @@ class ProjImgTrans: self.set_current_img_byidx(0) self.save() def save(self, save_mask=False, save_inpainted=False): def save(self): if not osp.exists(self.directory): raise ProjectDirNotExistException with open(self.proj_path, "w", encoding="utf-8") as f: f.write(json.dumps(self.to_dict(), ensure_ascii=False, indent=4, separators=(',', ':'), cls=TextBlkEncoder)) if save_mask and self.mask_valid: self.save_mask(self.current_img, self.mask_array) if save_inpainted and self.inpainted_valid: self.save_inpainted(self.current_img, self.inpainted_array) # if save_mask and self.mask_valid: # self.save_mask(self.current_img, self.mask_array) # if save_inpainted and self.inpainted_valid: # self.save_inpainted(self.current_img, self.inpainted_array) def to_dict(self) -> Dict: pages = self.pages.copy() Loading Loading @@ -263,10 +263,14 @@ class ProjImgTrans: return None return self.get_inpainted_path(self.current_img) def get_mask_path(self, imgname: str) -> str: def get_mask_path(self, imgname: str = None) -> str: if imgname is None: imgname = self.current_img return osp.join(self.mask_dir(), osp.splitext(imgname)[0]+'.png') def get_inpainted_path(self, imgname: str) -> str: def get_inpainted_path(self, imgname: str = None) -> str: if imgname is None: imgname = self.current_img return osp.join(self.inpainted_dir(), osp.splitext(imgname)[0]+'.png') def get_result_path(self, imgname: str) -> str: Loading Loading
ui/io_thread.py 0 → 100644 +34 −0 Original line number Diff line number Diff line import numpy as np from utils.io_utils import imread, imwrite from PyQt5.QtCore import Qt, pyqtSignal, QPoint, QSize, QThread from PyQt5.QtGui import QImage class ImgSaveThread(QThread): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.im_save_list = [] self.job = None def saveImg(self, save_path: str, img: QImage): self.im_save_list.append((save_path, img)) if self.job is None: self.job = self._save_img self.start() def _save_img(self): while True: if len(self.im_save_list) == 0: break save_path, img = self.im_save_list.pop(0) if isinstance(img, QImage): img.save(save_path) elif isinstance(img, np.ndarray): imwrite(save_path, img) def run(self): if self.job is not None: self.job() self.job = None No newline at end of file
ui/mainwindow.py +21 −5 Original line number Diff line number Diff line Loading @@ -3,8 +3,8 @@ import os import json from PyQt5.QtWidgets import QMainWindow, QHBoxLayout, QVBoxLayout, QApplication, QStackedWidget, QWidget, QFileDialog, QLabel, QSizePolicy, QComboBox, QListView, QToolBar, QMenu, QSpacerItem, QPushButton, QAction, QCheckBox, QToolButton, QSplitter, QListWidget, QShortcut, QListWidgetItem from PyQt5.QtCore import Qt, pyqtSignal, QPoint, QSize from PyQt5.QtGui import QGuiApplication, QIcon, QMouseEvent, QCloseEvent, QKeySequence, QImage, QPainter from PyQt5.QtCore import Qt, pyqtSignal, QPoint, QSize, QThread from PyQt5.QtGui import QGuiApplication, QIcon, QCloseEvent, QKeySequence, QImage, QPainter from typing import List, Union, Tuple Loading @@ -16,10 +16,13 @@ from .imgtranspanel import TextPanel from .drawingpanel import DrawingPanel from .scenetext_manager import SceneTextManager from .mainwindowbars import TitleBar, LeftBar, RightBar, BottomBar from .io_thread import ImgSaveThread from .constants import STYLESHEET_PATH, CONFIG_PATH, DPI, LDPI, LANG_SUPPORT_VERTICAL from . import constants class PageListView(QListWidget): def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) Loading Loading @@ -68,6 +71,8 @@ class MainWindow(FrameLessWindow): self.setupShortcuts() self.showMaximized() self.imsave_thread = ImgSaveThread() if open_dir != '' and osp.exists(open_dir): self.openDir(open_dir) elif self.config.open_recent_on_startup: Loading Loading @@ -363,11 +368,17 @@ class MainWindow(FrameLessWindow): self.saveCurrentPage() def saveCurrentPage(self, update_scene_text=True, save_proj=True): self.logger.info('saving ' + self.imgtrans_proj.current_img) if update_scene_text: self.st_manager.updateTextBlkList() if save_proj: self.imgtrans_proj.save(save_mask=True, save_inpainted=True) self.imgtrans_proj.save() mask_path = self.imgtrans_proj.get_mask_path() mask_array = self.imgtrans_proj.mask_array inpainted_path = self.imgtrans_proj.get_inpainted_path() inpainted_array = self.imgtrans_proj.inpainted_array else: mask_path = inpainted_path = None img = QImage(self.canvas.imgLayer.pixmap().size(), QImage.Format.Format_ARGB32) if self.config.imgtrans_textblock: Loading @@ -385,8 +396,13 @@ class MainWindow(FrameLessWindow): painter.end() if not osp.exists(self.imgtrans_proj.result_dir()): os.makedirs(self.imgtrans_proj.result_dir()) img.save(self.imgtrans_proj.get_result_path(self.imgtrans_proj.current_img)) imsave_path = self.imgtrans_proj.get_result_path(self.imgtrans_proj.current_img) self.imsave_thread.saveImg(imsave_path, img) if mask_path is not None: self.imsave_thread.saveImg(mask_path, mask_array) if inpainted_path is not None: self.imsave_thread.saveImg(inpainted_path, inpainted_array) if hide_tsc: self.st_manager.txtblkShapeControl.show() self.canvas.setProjSaveState(False) Loading
ui/misc.py +11 −7 Original line number Diff line number Diff line Loading @@ -218,15 +218,15 @@ class ProjImgTrans: self.set_current_img_byidx(0) self.save() def save(self, save_mask=False, save_inpainted=False): def save(self): if not osp.exists(self.directory): raise ProjectDirNotExistException with open(self.proj_path, "w", encoding="utf-8") as f: f.write(json.dumps(self.to_dict(), ensure_ascii=False, indent=4, separators=(',', ':'), cls=TextBlkEncoder)) if save_mask and self.mask_valid: self.save_mask(self.current_img, self.mask_array) if save_inpainted and self.inpainted_valid: self.save_inpainted(self.current_img, self.inpainted_array) # if save_mask and self.mask_valid: # self.save_mask(self.current_img, self.mask_array) # if save_inpainted and self.inpainted_valid: # self.save_inpainted(self.current_img, self.inpainted_array) def to_dict(self) -> Dict: pages = self.pages.copy() Loading Loading @@ -263,10 +263,14 @@ class ProjImgTrans: return None return self.get_inpainted_path(self.current_img) def get_mask_path(self, imgname: str) -> str: def get_mask_path(self, imgname: str = None) -> str: if imgname is None: imgname = self.current_img return osp.join(self.mask_dir(), osp.splitext(imgname)[0]+'.png') def get_inpainted_path(self, imgname: str) -> str: def get_inpainted_path(self, imgname: str = None) -> str: if imgname is None: imgname = self.current_img return osp.join(self.inpainted_dir(), osp.splitext(imgname)[0]+'.png') def get_result_path(self, imgname: str) -> str: Loading