@@ -23,6 +23,7 @@ def __init__(self):
2323
2424 self .img_path = None
2525 self .original_img = None
26+ self .processed_img = None
2627
2728 self .setWindowTitle ("Grayscale Image Processing" )
2829 self .resize (1000 , 500 )
@@ -59,9 +60,9 @@ def __init__(self):
5960 self .img_widget .setFocus ()
6061
6162 def connect_ui (self ):
62- self .dock .connect_ui (self .update_img )
63+ self .dock .connect_ui (self .start_process_image )
6364 self .dock .peek_groupbox .peek_button .pressed .connect (self .peek_original_img )
64- self .dock .peek_groupbox .peek_button .released .connect (self .update_img )
65+ self .dock .peek_groupbox .peek_button .released .connect (self .show_processed_image )
6566 self .dock .save_groupbox .save_button .clicked .connect (self .save_button_clicked )
6667 self .dock .save_groupbox .save_as_button .clicked .connect (
6768 self .save_as_button_clicked
@@ -71,14 +72,15 @@ def setup_start_process_worker(self, image):
7172 self .process_worker = ProcessWorker (self .process_img , image )
7273 self .process_worker .moveToThread (self .process_thread )
7374 self .process_thread .started .connect (self .process_worker .run )
74- self .process_worker .finished .connect (self .finished_process )
75+ self .process_worker .finished .connect (self .finished_process_image )
7576
76- def finished_process (self , processed_image ):
77+ def finished_process_image (self , processed_image ):
7778 self .process_thread .exit ()
78- self .img_widget . setImage ( processed_image )
79+ self .processed_img = processed_image
7980 self .setCursor (QtCore .Qt .ArrowCursor )
81+ self .show_processed_image ()
8082
81- def update_img (self ):
83+ def start_process_image (self ):
8284 if self .img_path :
8385 self .setup_start_process_worker (self .original_img )
8486 self .process_thread .start ()
@@ -87,17 +89,19 @@ def update_img(self):
8789 def process_img (self , img ):
8890 process_widget = self .dock .process_groupbox .stacked_layout .currentWidget ()
8991 oriented_image = self .dock .orient_groupbox .orient_img (img )
90- processed_img = process_widget .process_img (oriented_image )
91- return processed_img
92+ return process_widget .process_img (oriented_image )
9293
9394 def peek_original_img (self ):
9495 oriented_image = self .dock .orient_groupbox .orient_img (self .original_img )
9596 self .img_widget .setImage (oriented_image )
9697
98+ def show_processed_image (self ):
99+ self .img_widget .setImage (self .processed_img )
100+
97101 def read_img (self , path ):
98102 self .img_path = path
99103 self .original_img = cv .imread (str (self .img_path ), cv .IMREAD_GRAYSCALE )
100- self .update_img ()
104+ self .start_process_image ()
101105 self .dock .process_groupbox .adjust_range (self .original_img .shape )
102106
103107 def dragEnterEvent (self , e ):
@@ -134,11 +138,9 @@ def gui_save(self, settings):
134138 settings .setValue ("Window/state" , self .saveState ())
135139
136140 def gui_restore (self , settings ):
137- geometry = settings .value ("Window/geometry" )
138- if geometry :
141+ if geometry := settings .value ("Window/geometry" ):
139142 self .restoreGeometry (geometry )
140- state = settings .value ("Window/state" )
141- if state :
143+ if state := settings .value ("Window/state" ):
142144 self .restoreState (state )
143145 self .dock .gui_restore (settings )
144146
@@ -157,8 +159,9 @@ def save_as_button_clicked(self):
157159 self , "Save As" , str (self .img_path )
158160 )
159161 if save_url :
160- cv .imwrite (save_url , self .process_img (self .original_img ))
161- self .ask_load_saved (Path (save_url ))
162+ save_path = Path (save_url )
163+ if self .processed_img is not None :
164+ self .save_image (save_path , self .processed_img )
162165
163166 def save_button_clicked (self ):
164167 if self .img_path :
@@ -168,18 +171,26 @@ def save_button_clicked(self):
168171 f"{ self .img_path .name } already exists.\n " f"Do you want to replace it?" ,
169172 QtWidgets .QMessageBox .Yes | QtWidgets .QMessageBox .No ,
170173 )
171- if reply == QtWidgets .QMessageBox .Yes :
172- cv .imwrite (str (self .img_path ), self .process_img (self .original_img ))
173- self .ask_load_saved (Path (self .img_path ))
174+ if reply == QtWidgets .QMessageBox .Yes and self .processed_img is not None :
175+ self .save_image (self .img_path , self .processed_img )
176+
177+ def save_image (self , save_path , img ):
178+ try :
179+ cv .imwrite (str (save_path ), img )
180+ except Exception as e :
181+ self .error_dialog (e .err )
182+ else :
183+ self .ask_load_saved (save_path )
174184
175185 def ask_load_saved (self , save_path ):
176186 if self .img_path :
177187 reply = QtWidgets .QMessageBox .warning (
178188 self ,
179189 "Load Saved" ,
180- f "Do you want to load the saved file?" ,
190+ "Do you want to load the saved file?" ,
181191 QtWidgets .QMessageBox .Yes | QtWidgets .QMessageBox .No ,
182192 )
193+
183194 if reply == QtWidgets .QMessageBox .Yes :
184195 self .read_img (save_path )
185196
0 commit comments