Commit c240fb6c authored by dmMaze's avatar dmMaze
Browse files

impl ImgSaveThread to write edited image

parent 82885af8
Loading
Loading
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
+21 −5
Original line number Diff line number Diff line
@@ -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

@@ -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)
@@ -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:
@@ -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:
@@ -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)
+11 −7
Original line number Diff line number Diff line
@@ -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()
@@ -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: