[ocrfeeder] Refactor the way to add an image and include an image pre-processor



commit 5a931e81b18433da0a2761b397119861bf4d006f
Author: Joaquim Rocha <jrocha igalia com>
Date:   Tue Jul 20 17:42:09 2010 +0200

    Refactor the way to add an image and include an image pre-processor
    
    widgetModeler.ImageReviewer_Controler: Refactor the code to be simpler and
    add an image pre-processing method with the image deskewer on it;
    studio.StudioBuilder: Adapt to the new ImageReviewer_Controler way
    of adding images.

 studio/studioBuilder.py |   18 ++++-------
 studio/widgetModeler.py |   75 ++++++++++++++++++++++++++++++++++++++--------
 2 files changed, 69 insertions(+), 24 deletions(-)
---
diff --git a/studio/studioBuilder.py b/studio/studioBuilder.py
index b376822..14aea98 100644
--- a/studio/studioBuilder.py
+++ b/studio/studioBuilder.py
@@ -26,7 +26,7 @@ import os.path
 import urllib
 from studio import widgetPresenter
 from studio.widgetModeler import SourceImagesSelector, SourceImagesSelectorIconView, ImageReviewer_Controler
-from studio.dataHolder import create_images_dict_from_liststore, DataBox, TextData
+from studio.dataHolder import DataBox, TextData
 from studio.customWidgets import SelectableBoxesArea
 from feeder.ocrEngines import Engine, OcrEnginesManager
 from configuration import ConfigurationManager
@@ -60,14 +60,12 @@ class Studio:
         self.title = OCRFEEDER_STUDIO_NAME
         self.main_window = widgetPresenter.MainWindow()
         self.main_window.setTitle(self.title)
-        cli_command_retriever = ArgsRetriever(sys.argv)
-        imgs = cli_command_retriever.getParams('--images')
         self.configuration_manager = ConfigurationManager()
         self.ocr_engines_manager = OcrEnginesManager(self.configuration_manager)
         self.ocr_engines_manager.makeEnginesFromFolder(self.configuration_manager.user_engines_folder)
         self.ocr_engines = self.ocr_engines_manager.ocr_engines
         self.configuration_manager.loadConfiguration()
-        self.source_images_selector = SourceImagesSelector(imgs)
+        self.source_images_selector = SourceImagesSelector()
         self.source_images_selector.connect('selection_changed', self.selectionChanged)
         self.source_images_icon_view = SourceImagesSelectorIconView(self.source_images_selector)
         self.source_images_icon_view.setDeleteCurrentPageFunction(self.deleteCurrentPage)
@@ -78,9 +76,7 @@ class Studio:
         self.source_images_icon_view.show()
         self.main_window.main_area_left.add_with_viewport(self.source_images_icon_view)
         self.images_selectable_area = {}
-        self.images_dict = create_images_dict_from_liststore(self.source_images_selector.list_store)
         self.source_images_controler = ImageReviewer_Controler(self.main_window,
-                                                               self.images_dict,
                                                                self.source_images_icon_view,
                                                                self.ocr_engines,
                                                                self.configuration_manager)
@@ -106,6 +102,10 @@ class Studio:
         self.main_window.setHeader(menubar_callback_dict, toolbar_callback_dict)
         self.main_window.setDestroyEvent(self.quit)
 
+        cli_command_retriever = ArgsRetriever(sys.argv)
+        imgs = cli_command_retriever.getParams('--images')
+        if imgs:
+            self.__addImagesToReviewer(imgs)
         dirs = cli_command_retriever.getParams('--dir')
         if dirs:
             self.__addImagesToReviewer(lib.getImagesFromFolder(dirs[0]))
@@ -231,11 +231,7 @@ class Studio:
     def __addImagesToReviewer(self, images):
         if not images:
             return
-        for image in images:
-            pixbuf, image, iter = self.source_images_selector.addImage(image)
-            self.source_images_controler.addImage(pixbuf, image)
-        tree_path = self.source_images_selector.list_store.get_path(iter)
-        self.source_images_icon_view.select_path(tree_path)
+        self.source_images_controler.addImages(images)
 
     def __recognizeCurrentPageAction(self, widget):
         self.source_images_controler.recognizeCurrentPage()
diff --git a/studio/widgetModeler.py b/studio/widgetModeler.py
index 9b5bb33..5522bf6 100644
--- a/studio/widgetModeler.py
+++ b/studio/widgetModeler.py
@@ -27,7 +27,7 @@ from pango import FontDescription, SCALE
 from studio.configuration import ProjectSaver, ProjectLoader, ConfigurationManager
 from util import graphics, ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTER, ALIGN_FILL, \
     PAPER_SIZES
-from util.lib import debug
+from util.lib import debug, getNonExistingFileName
 from util import constants
 from util.asyncworker import AsyncItem
 from widgetPresenter import BoxEditor, PagesToExportDialog, FileDialog, \
@@ -368,7 +368,7 @@ class ImageReviewer:
 
 class ImageReviewer_Controler:
 
-    def __init__(self, main_window, images_dict, source_images_selector_widget,
+    def __init__(self, main_window, source_images_selector_widget,
                  ocr_engines, configuration_manager,
                  selection_changed_signal = 'selection-changed'):
         self.main_window = main_window
@@ -378,26 +378,73 @@ class ImageReviewer_Controler:
         self.ocr_engines = ocr_engines
         self.configuration_manager = configuration_manager
         self.tripple_statusbar = self.main_window.tripple_statusbar
-        for key, image in images_dict.items():
-            self.addImage(key, image)
         self.source_images_selector_widget.connect(selection_changed_signal, self.selectImageReviewer)
 
-    def addImage(self, pixbuf, image):
+    def __createdImageReviewer(self, pixbuf, image):
         image_reviewer = ImageReviewer(self.main_window, image, self.ocr_engines)
         image_reviewer.selectable_boxes_area.connect('changed_zoom', self.__setZoomStatus)
         image_reviewer.setTextFillColor(self.configuration_manager.text_fill)
         image_reviewer.setBoxesStrokeColor(self.configuration_manager.boxes_stroke)
         image_reviewer.setImageFillColor(self.configuration_manager.image_fill)
         self.image_reviewer_dict[pixbuf] = image_reviewer
-        self.addImageReviewer(image_reviewer.reviewer_area)
+        self.notebook.append_page(image_reviewer.reviewer_area, None)
         return image_reviewer
 
-    def addImageFromPath(self, image_path):
-        pixbuf, image, iter = self.source_images_selector_widget.source_images_selector.addImage(image_path)
-        return self.addImage(pixbuf, image)
+    def addImages(self, image_path_list):
+        dialog = QueuedEventsProgressDialog(self.main_window.window)
+        item_list = []
+        item_list_length = len(image_path_list)
+        if not self.configuration_manager.deskew_images_after_addition:
+            for index in range(0, len(image_path_list)):
+                self.__addImage(image_path_list[index], index == 0)
+            return
+        for index in range(0, item_list_length):
+            image_path = image_path_list[index]
+            item = AsyncItem(self.__imagePreProcessing,
+                             (image_path,),
+                             self.__imagePreProcessingFinishedCb,
+                             (dialog,
+                              index == item_list_length - 1,
+                              index == 0))
+            if item_list_length == 1:
+                item_info = (_('Preparing image'), _('Please waitâ?¦'))
+            else:
+                item_info = (_('Preparing image %(current_index)s/%(total)s') % \
+                             {'current_index': index + 1,
+                              'total': item_list_length},
+                             _('Please waitâ?¦'))
+            item_list.append((item_info,item))
+        dialog.setItemsList(item_list)
+        dialog.run()
 
-    def addImageReviewer(self, image_reviewer_widget):
-        self.notebook.append_page(image_reviewer_widget, None)
+    def __imagePreProcessing(self, image_path):
+        return self.__deskewImage(image_path)
+
+    def __imagePreProcessingFinishedCb(self, dialog, finished,
+                                       select_image, image_path, error):
+        self.__addImage(image_path, select_image)
+        if finished:
+            dialog.cancel()
+
+    def __addImage(self, image_path, select_image = True):
+        selector_widget = self.source_images_selector_widget
+        pixbuf, image, iter = \
+            selector_widget.source_images_selector.addImage(image_path)
+        reviewer = self.__createdImageReviewer(pixbuf, image)
+        if select_image:
+            path = selector_widget.source_images_selector.list_store.get_path(iter)
+            selector_widget.select_path(path)
+        return reviewer
+
+    def __deskewImage(self, image_path):
+        tmp_dir = self.configuration_manager.temporary_dir
+        deskewed_name = os.path.join(tmp_dir, image_path)
+        if os.path.exists(deskewed_name):
+            deskewed_name = getNonExistingFileName(deskewed_name)
+        image_deskewer = ImageDeskewer()
+        if image_deskewer.deskew(image_path, deskewed_name):
+            return deskewed_name
+        return image_path
 
     def selectImageReviewer(self, widget):
         pixbuf = self.source_images_selector_widget.getSelectedPixbuf()
@@ -521,8 +568,10 @@ class ImageReviewer_Controler:
             pages = project_loader.loadConfiguration()
             if pages and clear_current:
                 self.clear()
-            for page in pages:
-                image_reviewer = self.addImageFromPath(page.image_path)
+            for index in range(0, len(pages)):
+                page = pages[index]
+                image_reviewer = self.__addImage(page.image_path,
+                                                 select_image = index == 0)
                 image_reviewer.updatePageData(page)
         open_dialog.destroy()
         return project_file



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]