class ImageReviewer: def __init__(self, path_to_image, ocr_engines): self.path_to_image = path_to_image self.text_box_fill_color = (94, 156, 235, 150) self.text_box_stroke_color = (94, 156, 235, 250) self.image_box_fill_color = (0, 183, 0, 150) self.image_box_stroke_color = (94, 156, 235, 250) self.selectable_boxes_area = SelectableBoxesArea(self.path_to_image) self.selectable_boxes_area.connect('selected_box', self.selectedBox) self.selectable_boxes_area.connect('removed_box', self.removedBox) self.selectable_boxes_area.connect('updated_box', self.updatedBox) self.selectable_boxes_area.connect('dragged_box', self.updatedBoxBounds) self.image_pixbuf = gtk.gdk.pixbuf_new_from_file(self.path_to_image) self.reviewer_area = gtk.HPaned() self.reviewer_area.set_position(500) self.reviewer_area.show() self.boxeditor_notebook = gtk.Notebook() self.boxeditor_notebook.set_show_tabs(False) self.boxeditor_notebook.set_show_border(False) self.boxeditor_notebook.show() selectable_boxes_scrolled_window = gtk.ScrolledWindow() selectable_boxes_scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) selectable_boxes_scrolled_window.add(self.selectable_boxes_area) self.selectable_boxes_area.show() selectable_boxes_scrolled_window.show() self.reviewer_area.pack1(selectable_boxes_scrolled_window, True, False) self.reviewer_area.pack2(self.boxeditor_notebook, True, False) self.ocr_engines = ocr_engines self.editor_list = [] self.page = PageData(self.path_to_image) selectable_boxes_scrolled_window.connect_after("size-allocate", self.zoomFitCb) def setTextFillColor(self, color): self.text_box_fill_color = color self.selectable_boxes_area.setAreaFillRgba(self.text_box_fill_color) def setTextStrokeColor(self, color): self.text_box_stroke_color = color self.selectable_boxes_area.setAreaStrokeRgba( self.text_box_stroke_color) def setImageFillColor(self, color): self.image_box_fill_color = color def setImageStrokeColor(self, color): self.image_box_stroke_color = color def addBoxEditor(self, box): editor = Editor(box, self.image_pixbuf, self.ocr_engines, self) self.editor_list.append(editor) self.boxeditor_notebook.append_page(editor.box_editor) return editor def selectedBox(self, widget, box): page_num = self.__getPageNumFromBox(box) if page_num != -1: self.boxeditor_notebook.set_current_page(page_num) else: num_boxes = self.boxeditor_notebook.get_n_pages() self.addBoxEditor(box) self.boxeditor_notebook.set_current_page(num_boxes) def updatedBox(self, widget, box): for editor in self.editor_list: if editor.box == box: editor.update(box) def updatedBoxBounds(self, widget, box): for editor in self.editor_list: if editor.box == box: editor.updateBounds(box) def removedBox(self, widget, box): for i in xrange(len(self.editor_list)): editor = self.editor_list[i] if editor.box == box: page_num = self.boxeditor_notebook.page_num(editor.box_editor) self.boxeditor_notebook.remove_page(page_num) del self.editor_list[i] return True return False def __getPageNumFromBox(self, box): for editor in self.editor_list: if editor.box == box: return self.boxeditor_notebook.page_num(editor.box_editor) return -1 def applyTextColors(self): self.selectable_boxes_area.fill_color_rgba = self.text_box_fill_color self.selectable_boxes_area.stroke_color_rgba = self.text_box_stroke_color def applyImageColors(self): self.selectable_boxes_area.fill_color_rgba = self.image_box_fill_color self.selectable_boxes_area.stroke_color_rgba = self.image_box_stroke_color def addNewEditorsToAllBoxes(self): self.editor_list = [] boxes = self.selectable_boxes_area.getAllAreas() for box in boxes: self.addBoxEditor(box) def performOcrForAllEditors(self, engine=None): for editor in self.editor_list: editor.performOcr(engine) editor.performClassification(engine) if editor.box_editor.getType() == IMAGE_TYPE: editor.box_editor.setText('') def __getAllDataBoxes(self): boxes = [] for editor in self.editor_list: editor.setDataBox() data_box = editor.data_box boxes.append((data_box.y, data_box)) boxes.sort() boxes_sorted = [] for y, box in boxes: boxes_sorted.append(box) boxes = boxes_sorted return boxes def getPageData(self): self.page.data_boxes = self.__getAllDataBoxes() return self.page def updatePageData(self, page_data): self.page = page_data for data_box in self.page.data_boxes: self.addDataBox(data_box) def addDataBox(self, data_box): dimensions = (int(data_box.x), int(data_box.y), int(data_box.width), int(data_box.height)) box = self.selectable_boxes_area.addArea(dimensions) editor = self.addBoxEditor(box) editor.box = box editor.updateDataBox(data_box) def updateBackgroundImage(self, image_path): self.path_to_image = image_path self.image_pixbuf = gtk.gdk.pixbuf_new_from_file(self.path_to_image) self.selectable_boxes_area.setBackgroundImage(self.path_to_image) def updateBoxesColors(self): for editor in self.editor_list: editor.updateBoxColor() def zoomFitCb(self, widget, data): self.zoomFit() widget.disconnect_by_func(self.zoomFitCb) def zoomFit(self): parent = self.selectable_boxes_area.get_parent() parent_height, parent_width = parent.allocation.height, parent.allocation.width image_height, image_width = self.selectable_boxes_area.getImageSize() changed = False if image_height > parent_height: image_height = parent_height / image_height changed = True if image_width > parent_width: image_width = parent_width / image_width changed = True if changed: self.selectable_boxes_area.zoom(min(image_height, image_width), False)
class ImageReviewer: def __init__(self, path_to_image, ocr_engines): self.path_to_image = path_to_image self.text_box_fill_color = (94, 156, 235, 150) self.text_box_stroke_color = (94, 156, 235, 250) self.image_box_fill_color = (0, 183, 0, 150) self.image_box_stroke_color = (94, 156, 235, 250) self.selectable_boxes_area = SelectableBoxesArea(self.path_to_image) self.selectable_boxes_area.connect('selected_box', self.selectedBox) self.selectable_boxes_area.connect('removed_box', self.removedBox) self.selectable_boxes_area.connect('updated_box', self.updatedBox) self.selectable_boxes_area.connect('dragged_box', self.updatedBoxBounds) self.image_pixbuf = gtk.gdk.pixbuf_new_from_file(self.path_to_image) self.reviewer_area = gtk.HPaned() self.reviewer_area.set_position(500) self.reviewer_area.show() self.boxeditor_notebook = gtk.Notebook() self.boxeditor_notebook.set_show_tabs(False) self.boxeditor_notebook.set_show_border(False) self.boxeditor_notebook.show() selectable_boxes_scrolled_window = gtk.ScrolledWindow() selectable_boxes_scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) selectable_boxes_scrolled_window.add(self.selectable_boxes_area) self.selectable_boxes_area.show() selectable_boxes_scrolled_window.show() self.reviewer_area.pack1(selectable_boxes_scrolled_window, True, False) self.reviewer_area.pack2(self.boxeditor_notebook, True, False) self.ocr_engines = ocr_engines self.editor_list = [] self.page = PageData(self.path_to_image) selectable_boxes_scrolled_window.connect_after("size-allocate", self.zoomFitCb) def setTextFillColor(self, color): self.text_box_fill_color = color self.selectable_boxes_area.setAreaFillRgba(self.text_box_fill_color) def setTextStrokeColor(self, color): self.text_box_stroke_color = color self.selectable_boxes_area.setAreaStrokeRgba(self.text_box_stroke_color) def setImageFillColor(self, color): self.image_box_fill_color = color def setImageStrokeColor(self, color): self.image_box_stroke_color = color def addBoxEditor(self, box): editor = Editor(box, self.image_pixbuf, self.ocr_engines, self) self.editor_list.append(editor) self.boxeditor_notebook.append_page(editor.box_editor) return editor def selectedBox(self, widget, box): page_num = self.__getPageNumFromBox(box) if page_num != -1: self.boxeditor_notebook.set_current_page(page_num) else: num_boxes = self.boxeditor_notebook.get_n_pages() self.addBoxEditor(box) self.boxeditor_notebook.set_current_page(num_boxes) def updatedBox(self, widget, box): for editor in self.editor_list: if editor.box == box: editor.update(box) def updatedBoxBounds(self, widget, box): for editor in self.editor_list: if editor.box == box: editor.updateBounds(box) def removedBox(self, widget, box): for i in xrange(len(self.editor_list)): editor = self.editor_list[i] if editor.box == box: page_num = self.boxeditor_notebook.page_num(editor.box_editor) self.boxeditor_notebook.remove_page(page_num) del self.editor_list[i] return True return False def __getPageNumFromBox(self, box): for editor in self.editor_list: if editor.box == box: return self.boxeditor_notebook.page_num(editor.box_editor) return -1 def applyTextColors(self): self.selectable_boxes_area.fill_color_rgba = self.text_box_fill_color self.selectable_boxes_area.stroke_color_rgba = self.text_box_stroke_color def applyImageColors(self): self.selectable_boxes_area.fill_color_rgba = self.image_box_fill_color self.selectable_boxes_area.stroke_color_rgba = self.image_box_stroke_color def addNewEditorsToAllBoxes(self): self.editor_list = [] boxes = self.selectable_boxes_area.getAllAreas() for box in boxes: self.addBoxEditor(box) def performOcrForAllEditors(self, engine = None): for editor in self.editor_list: editor.performOcr(engine) editor.performClassification(engine) if editor.box_editor.getType() == IMAGE_TYPE: editor.box_editor.setText('') def __getAllDataBoxes(self): boxes = [] for editor in self.editor_list: editor.setDataBox() data_box = editor.data_box boxes.append((data_box.y, data_box)) boxes.sort() boxes_sorted = [] for y, box in boxes: boxes_sorted.append(box) boxes = boxes_sorted return boxes def getPageData(self): self.page.data_boxes = self.__getAllDataBoxes() return self.page def updatePageData(self, page_data): self.page = page_data for data_box in self.page.data_boxes: self.addDataBox(data_box) def addDataBox(self, data_box): dimensions = (int(data_box.x), int(data_box.y), int(data_box.width), int(data_box.height)) box = self.selectable_boxes_area.addArea(dimensions) editor = self.addBoxEditor(box) editor.box = box editor.updateDataBox(data_box) def updateBackgroundImage(self, image_path): self.path_to_image = image_path self.image_pixbuf = gtk.gdk.pixbuf_new_from_file(self.path_to_image) self.selectable_boxes_area.setBackgroundImage(self.path_to_image) def updateBoxesColors(self): for editor in self.editor_list: editor.updateBoxColor() def zoomFitCb(self, widget, data): self.zoomFit() widget.disconnect_by_func(self.zoomFitCb) def zoomFit(self): parent = self.selectable_boxes_area.get_parent() parent_height, parent_width = parent.allocation.height, parent.allocation.width image_height, image_width = self.selectable_boxes_area.getImageSize() changed = False if image_height > parent_height: image_height = parent_height / image_height changed = True if image_width > parent_width: image_width = parent_width / image_width changed = True if changed: self.selectable_boxes_area.zoom(min(image_height, image_width), False)