[Pycodeocr-main] SF.net SVN: pycodeocr:[58] trunk
Status: Beta
Brought to you by:
drtrigon
From: <drt...@us...> - 2011-09-17 18:41:19
|
Revision: 58 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=58&view=rev Author: drtrigon Date: 2011-09-17 18:41:11 +0000 (Sat, 17 Sep 2011) Log Message: ----------- PEP 8 Modified Paths: -------------- trunk/PyCodeOCR.py trunk/utils/RunExternal.py trunk/utils/RunLibdmtx.py trunk/utils/RunMagickWand.py trunk/utils/blacklist_manager.py trunk/utils/checksum.py trunk/utils/logging.py trunk/utils/ocr.py Modified: trunk/PyCodeOCR.py =================================================================== --- trunk/PyCodeOCR.py 2011-07-27 13:51:33 UTC (rev 57) +++ trunk/PyCodeOCR.py 2011-09-17 18:41:11 UTC (rev 58) @@ -77,10 +77,10 @@ #from pythonmagickwand.image import Image # search optional pakages -if "LD_LIBRARY_PATH" not in os.environ: # patch/work-a-round for libdmtx bindings - os.environ["LD_LIBRARY_PATH"] = "/usr/local/lib" # - os.system('python %s' % sys.argv[0]) # - sys.exit() # +if "LD_LIBRARY_PATH" not in os.environ: # patch/work-a-round for libdmtx bindings + os.environ["LD_LIBRARY_PATH"] = "/usr/local/lib" # + os.system('python %s' % sys.argv[0]) # + sys.exit() # ## list of available pakages print "To check and install requirements run: 'python %s --install-deps'" % sys.argv[0] pakages = [] @@ -89,21 +89,21 @@ "dmtxread": utils.requirements.which("dmtxread"), "pdf417decode.exe": utils.requirements.which("pdf417decode.exe"), } if os.path.exists(paths["gocr"]): - pakages.append( "gocr" ) - print "gocr found." + pakages.append( "gocr" ) + print "gocr found." # libdmtx bindings #try: -# from pydmtx import DataMatrix -# pakages.append( "libdmtx" ) -# print "libdmtx and pydmtx found." -#except: pass +# from pydmtx import DataMatrix +# pakages.append( "libdmtx" ) +# print "libdmtx and pydmtx found." +#except: pass if os.path.exists(paths["dmtxread"]): - pakages.append( "libdmtx" ) - print "libdmtx and pydmtx found." + pakages.append( "libdmtx" ) + print "libdmtx and pydmtx found." # pdf417decode if os.path.exists(paths["pdf417decode.exe"]): - pakages.append( "pdf417decode" ) - print "pdf417decode.exe found." + pakages.append( "pdf417decode" ) + print "pdf417decode.exe found." # global variables and constants @@ -115,712 +115,704 @@ ## users home path /home/user home_path = os.path.expanduser('~') ## default scanning coordinates -std_scan_koords = { "0 deg": (( 82, 60, 20, 155 ), 0), # or with higher res. ( 820, 600, 200, 1559 ), +std_scan_koords = { "0 deg": (( 82, 60, 20, 155 ), 0), # or with higher res. ( 820, 600, 200, 1559 ), "90 deg": (( 1, 82, 150, 20 ), 90), "180 deg": (( 3, 1, 20, 150 ), 180), "270 deg": (( 60, 3, 150, 20 ), 270), - "A4": (( 0, 0, 296, 215 ), 0), } # scan whole range (A4: http://www.cl.cam.ac.uk/~mgk25/iso-paper.html) - #"A4": (( 0, 0, 290, 210 ), 0), } # (more secure; with small border) + "A4": (( 0, 0, 296, 215 ), 0), } # scan whole range (A4: http://www.cl.cam.ac.uk/~mgk25/iso-paper.html) + #"A4": (( 0, 0, 290, 210 ), 0), } # (more secure; with small border) ## MainWindow # The GUI was created/designed using GLADE # class MainWindowGTK: - """ - PyCodeOCR main GUI window and application class. - """ + """ + PyCodeOCR main GUI window and application class. + """ - # initialization - # (variables) - max_retry = 3 # max. scan attempts - valid_code_len = [ 53, 42, 32 ] # valid code lenghts - scan_koords = std_scan_koords["0 deg"][0] # default scan pos. - mode = std_scan_koords["0 deg"][1] # default scan orient. - res_color = { True: gtk.gdk.color_parse("#00FF00"), - False: gtk.gdk.color_parse("#FF0000"), - None: gtk.gdk.color_parse("#FFFFFF"), } - temp = os.path.join(home_path, "PyCodeOCR_tmp") - debug = ( os.path.join(home_path, "PyCodeOCR_debug"), - os.path.join(home_path, "PyCodeOCR_debug.txt"), ) - regex_gocr = re.compile('<barcode(.*?)/>') + # initialization + # (variables) + max_retry = 3 # max. scan attempts + valid_code_len = [ 53, 43, 42, 32 ] # valid code lenghts + scan_koords = std_scan_koords["0 deg"][0] # default scan pos. + mode = std_scan_koords["0 deg"][1] # default scan orient. + res_color = { True: gtk.gdk.color_parse("#00FF00"), + False: gtk.gdk.color_parse("#FF0000"), + None: gtk.gdk.color_parse("#FFFFFF"), } + temp = os.path.join(home_path, "PyCodeOCR_tmp") + debug = ( os.path.join(home_path, "PyCodeOCR_debug"), + os.path.join(home_path, "PyCodeOCR_debug.txt"), ) + regex_gocr = re.compile('<barcode(.*?)/>') - #cmd_scan = "scanimage --format=tif --resolution 600 --mode Gray -t %d -l %d -y %d -x %d > %s" # SANE scan command - cmd_convert = "convert %s -depth 8 -rotate %d %s" # ImageMagick command - cmd_tesser = "tesseract %s.tif %s" # TesserAct command - cmd_gocr = paths["gocr"] + " -i %s.pnm" # GOCR command (local) - cmd_pdf417dec = "wine " + paths["pdf417decode.exe"] + " %s.png" # pdf417decode/wine command (local) + #cmd_scan = "scanimage --format=tif --resolution 600 --mode Gray -t %d -l %d -y %d -x %d > %s" # SANE scan command + cmd_convert = "convert %s -depth 8 -rotate %d %s" # ImageMagick command + cmd_tesser = "tesseract %s.tif %s" # TesserAct command + cmd_gocr = paths["gocr"] + " -i %s.pnm" # GOCR command (local) + cmd_pdf417dec = "wine " + paths["pdf417decode.exe"] + " %s.png" # pdf417decode/wine command (local) - __stop = False + __stop = False - # (constants) - MDE = { 'invoices': 0, 'barcode': 1, 'DataMatrix': 2, 'PDF417': 3 } + # (constants) + MDE = { 'invoices': 0, 'barcode': 1, 'DataMatrix': 2, 'PDF417': 3 } - ## Initialize - def __init__(self): - - -# # retrieve widgets -# # main_window - main window -# ## gladefile raw_path.glade - self.gladefile = raw_path + ".glade" - # open GTKBuilder - self.builder = gtk.Builder() - self.builder.add_from_file(self.gladefile) - # connect signal handlers - self.builder.connect_signals(self) - - # get objects from glade/GTKBuilder - ## main window - self.main_window = self.builder.get_object('main_window') - self.main_window.set_icon_from_file(raw_path+".png") - ## notebok - self.notebook = self.builder.get_object('notebook') - ## image window - self.img_popup = self.builder.get_object('img_popup') - ## scan button - self.scan_button = self.builder.get_object('scan_button') - ## restart button - self.retry_button = self.builder.get_object('retry_button') - ## exit button - self.exit_button = self.builder.get_object('exit_button') - ## placement frame - self.placement_frame = self.builder.get_object('placement_frame') - ## image - self.main_image = self.builder.get_object('main_image') - ## image - self.popup_image = self.builder.get_object('popup_image') - ## output line - self.output = self.builder.get_object('output') - self.log_text = self.builder.get_object('log_text') - self.textbuffer = self.log_text.get_buffer() - self.device_info_text = self.builder.get_object('device_info_text') - ## progressbar - self.progressbar = self.builder.get_object('progressbar') - ## Orientation label - self.placement_label = self.builder.get_object('placement_label') - ## Orientation combobox - self.orientation = self.builder.get_object('orientation') - ## mode combobox - self.mode_combobox = self.builder.get_object('mode_combobox') - ## list with possible values for modes - self.mode_list = self.builder.get_object('mode_list') - ## x-position - self.position_x = self.builder.get_object('position_x') - ## y-position - self.position_y = self.builder.get_object('position_y') - ## x-size - self.size_x = self.builder.get_object('size_x') - ## y-size - self.size_y = self.builder.get_object('size_y') - ## file input - self.file_input_button = self.builder.get_object('file_input_button') - ## sane input - self.sane_input_button = self.builder.get_object('sane_input_button') - ## choose file - self.filechooserbutton = self.builder.get_object('filechooserbutton') - ## device list - self.device_treeview = self.builder.get_object('device_treeview') - ## blacklisted device list - self.blacklist_treeview = self.builder.get_object('blacklist_treeview') - ## OK button - self.device_chooser_button = self.builder.get_object('device_chooser_button') - ## event box for image - self.main_image_eventbox = self.builder.get_object('main_image_eventbox') - ## event box for image window - self.popup_image_eventbox = self.builder.get_object('popup_image_eventbox') + ## Initialize + def __init__(self): +# # retrieve widgets +# # main_window - main window +# ## gladefile raw_path.glade + self.gladefile = raw_path + ".glade" + # open GTKBuilder + self.builder = gtk.Builder() + self.builder.add_from_file(self.gladefile) + # connect signal handlers + self.builder.connect_signals(self) + + # get objects from glade/GTKBuilder + ## main window + self.main_window = self.builder.get_object('main_window') + self.main_window.set_icon_from_file(raw_path+".png") + ## notebok + self.notebook = self.builder.get_object('notebook') + ## image window + self.img_popup = self.builder.get_object('img_popup') + ## scan button + self.scan_button = self.builder.get_object('scan_button') + ## restart button + self.retry_button = self.builder.get_object('retry_button') + ## exit button + self.exit_button = self.builder.get_object('exit_button') + ## placement frame + self.placement_frame = self.builder.get_object('placement_frame') + ## image + self.main_image = self.builder.get_object('main_image') + ## image + self.popup_image = self.builder.get_object('popup_image') + ## output line + self.output = self.builder.get_object('output') + self.log_text = self.builder.get_object('log_text') + self.textbuffer = self.log_text.get_buffer() + self.device_info_text = self.builder.get_object('device_info_text') + ## progressbar + self.progressbar = self.builder.get_object('progressbar') + ## Orientation label + self.placement_label = self.builder.get_object('placement_label') + ## Orientation combobox + self.orientation = self.builder.get_object('orientation') + ## mode combobox + self.mode_combobox = self.builder.get_object('mode_combobox') + ## list with possible values for modes + self.mode_list = self.builder.get_object('mode_list') + ## x-position + self.position_x = self.builder.get_object('position_x') + ## y-position + self.position_y = self.builder.get_object('position_y') + ## x-size + self.size_x = self.builder.get_object('size_x') + ## y-size + self.size_y = self.builder.get_object('size_y') + ## file input + self.file_input_button = self.builder.get_object('file_input_button') + ## sane input + self.sane_input_button = self.builder.get_object('sane_input_button') + ## choose file + self.filechooserbutton = self.builder.get_object('filechooserbutton') + ## device list + self.device_treeview = self.builder.get_object('device_treeview') + ## blacklisted device list + self.blacklist_treeview = self.builder.get_object('blacklist_treeview') + ## OK button + self.device_chooser_button = self.builder.get_object('device_chooser_button') + ## event box for image + self.main_image_eventbox = self.builder.get_object('main_image_eventbox') + ## event box for image window + self.popup_image_eventbox = self.builder.get_object('popup_image_eventbox') - # initiate orientation and position - self.orientation.set_active(0) - self.position_x.set_value(self.scan_koords[0]) - self.position_y.set_value(self.scan_koords[1]) - self.size_x.set_value(self.scan_koords[2]) - self.size_y.set_value(self.scan_koords[3]) - - - self.mode_combobox.set_active(0) - if "gocr" not in pakages: - self.mode_combobox.remove_text(1) - self.mode_combobox.insert_text(1, "< not installed >") - if "libdmtx" not in pakages: - self.mode_combobox.remove_text(2) - self.mode_combobox.insert_text(2, "< not installed >") - if "pdf417decode" not in pakages: - self.mode_combobox.remove_text(3) - self.mode_combobox.insert_text(3, "< not installed >") - - - # connect eventbox to close image window - (self.new_width, self.new_height ) = (0,0) - - # set tooltips - self.retry_button.set_tooltip_text("Restart PyCodeOCR to search for a SANE device.") - self.retry_button.set_visible(True) - self.main_image.set_tooltip_text("Click for bigger image") - self.popup_image.set_tooltip_text("Leave window to close") - - - # redirect print - self.logging = utils.logging(self.textbuffer) - sys.stdout = self.logging - sys.stderr = self.logging - - - # initialize treeviews in Blacklist Manager - BlacklistMgr.post_init(self.device_treeview, self.blacklist_treeview, local_path) - - print "---------",strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()),"----------" - - - - - # display window - self.main_window.show() + # initiate orientation and position + self.orientation.set_active(0) + self.position_x.set_value(self.scan_koords[0]) + self.position_y.set_value(self.scan_koords[1]) + self.size_x.set_value(self.scan_koords[2]) + self.size_y.set_value(self.scan_koords[3]) + + + self.mode_combobox.set_active(0) + if "gocr" not in pakages: + self.mode_combobox.remove_text(1) + self.mode_combobox.insert_text(1, "< not installed >") + if "libdmtx" not in pakages: + self.mode_combobox.remove_text(2) + self.mode_combobox.insert_text(2, "< not installed >") + if "pdf417decode" not in pakages: + self.mode_combobox.remove_text(3) + self.mode_combobox.insert_text(3, "< not installed >") + + + # connect eventbox to close image window + (self.new_width, self.new_height ) = (0,0) + + # set tooltips + self.retry_button.set_tooltip_text("Restart PyCodeOCR to search for a SANE device.") + self.retry_button.set_visible(True) + self.main_image.set_tooltip_text("Click for bigger image") + self.popup_image.set_tooltip_text("Leave window to close") + + + # redirect print + self.logging = utils.logging(self.textbuffer) + sys.stdout = self.logging + sys.stderr = self.logging + + + # initialize treeviews in Blacklist Manager + BlacklistMgr.post_init(self.device_treeview, self.blacklist_treeview, local_path) + + print "---------",strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()),"----------" - return - - ## Run gtk mainloop and with it THIS APP. - def run(self): - gtk.gdk.threads_init() - - self.device_chooser_event = threading.Event() - - ## initialize sane - self.run_sane = utils.ocr.RunSANE(self.notebook, self.progress, self.device_chooser_button, BlacklistMgr,self.device_chooser_event,self.device_info_text) - self.run_sane.start() - # redirect print again to old textbuffer - sys.stdout = self.logging - - gtk.main() - - - def on_device_chooser_button_clicked(self, source=None): - self.device_chooser_button.set_visible(False) - self.device_chooser_event.set() - - - - ## set sensitivity of buttons the first time - def init_sensitivity(self): - # set sensitivity - if self.run_sane.found_scanner: - self.sane_input_button.set_active(True) - self.sane_input_button.set_sensitive(True) - else: - self.file_input_button.set_active(True) - self.sane_input_button.set_sensitive(False) - - # Try to set orientation and placement sensitive - self.toggle_orientation_sensitive(True) - self.toggle_placement_sensitive(True) - - ## toggle orientation sensitivity - def toggle_orientation_sensitive(self, value): - self.placement_label.set_sensitive(value) - self.orientation.set_sensitive(value) + + # display window + self.main_window.show() - ## toggle placement sensitivity - def toggle_placement_sensitive(self, value): - if self.sane_input_button.get_active(): - self.placement_frame.set_sensitive(value) - else: - self.placement_frame.set_sensitive(False) + return + + ## Run gtk mainloop and with it THIS APP. + def run(self): + gtk.gdk.threads_init() + + self.device_chooser_event = threading.Event() + + ## initialize sane + self.run_sane = utils.ocr.RunSANE(self.notebook, self.progress, self.device_chooser_button, BlacklistMgr,self.device_chooser_event,self.device_info_text) + self.run_sane.start() + # redirect print again to old textbuffer + sys.stdout = self.logging + + gtk.main() + + + def on_device_chooser_button_clicked(self, source=None): + self.device_chooser_button.set_visible(False) + self.device_chooser_event.set() + + + ## set sensitivity of buttons the first time + def init_sensitivity(self): + # set sensitivity + if self.run_sane.found_scanner: + self.sane_input_button.set_active(True) + self.sane_input_button.set_sensitive(True) + else: + self.file_input_button.set_active(True) + self.sane_input_button.set_sensitive(False) + + # Try to set orientation and placement sensitive + self.toggle_orientation_sensitive(True) + self.toggle_placement_sensitive(True) + + ## toggle orientation sensitivity + def toggle_orientation_sensitive(self, value): + self.placement_label.set_sensitive(value) + self.orientation.set_sensitive(value) + ## toggle placement sensitivity + def toggle_placement_sensitive(self, value): + if self.sane_input_button.get_active(): + self.placement_frame.set_sensitive(value) + else: + self.placement_frame.set_sensitive(False) + ## signals / glade callbacks + # + def on_pointer_motion(self, source=None, event=None): + pass +# (x,y,state) = self.main_window.window.get_pointer() +# (wxim, wyim ) = self.main_image.get_size_request() +# if x > 16+(wxim-self.new_width)/2 and x < 16+(wxim+self.new_width)/2 and y > 75+(wyim-self.new_height)/2 and y < 75+(wyim+self.new_height)/2: +# if not self.img_popup.get_visible(): +# self.on_main_image_eventbox_button_press_event() + + def on_main_image_eventbox_button_press_event(self, source=None, event=None): + if self.img_popup.get_visible(): + # clean-up + os.remove( self.image_file_big ) + # hide window + self.img_popup.hide() + else: + # load original image + im1 = Image.open(self.imageFile) + # adjust width and height to your needs and keep ratio + (im_width, im_height) = im1.size #get image size + # get size of shown image + width = self.main_image.allocation.width + height = self.main_image.allocation.height + + # make it bigger in window + # size should be at least 600 + if max(width,height) < 300: + ratio = min(600/float(width),600/float(height)) + width = ratio*width + height = ratio*height + # or 2x bigger + else: + width = 2*width + height = 2*height + + ratio = min(float(width)/im_width,float(height)/im_height) #calculate resizing ratio + new_width = int(im_width*ratio) + new_height = int(im_height*ratio) + # resize to fit popup window + im = im1.resize((new_width, new_height), Image.BILINEAR) + # save + self.image_file_big = self.temp+"06.jpg" + im.save( self.image_file_big ) + # set image + self.popup_image.set_from_file( self.image_file_big ) + # show window + self.img_popup.show() - ## signals / glade callbacks - # - def on_pointer_motion(self, source=None, event=None): - pass -# (x,y,state) = self.main_window.window.get_pointer() -# (wxim, wyim ) = self.main_image.get_size_request() -# if x > 16+(wxim-self.new_width)/2 and x < 16+(wxim+self.new_width)/2 and y > 75+(wyim-self.new_height)/2 and y < 75+(wyim+self.new_height)/2: -# if not self.img_popup.get_visible(): -# self.on_main_image_eventbox_button_press_event() - - def on_main_image_eventbox_button_press_event(self, source=None, event=None): - if self.img_popup.get_visible(): - # clean-up - os.remove( self.image_file_big ) - # hide window - self.img_popup.hide() - else: - # load original image - im1 = Image.open(self.imageFile) - # adjust width and height to your needs and keep ratio - (im_width, im_height) = im1.size #get image size - # get size of shown image - width = self.main_image.allocation.width - height = self.main_image.allocation.height - - # make it bigger in window - # size should be at least 600 - if max(width,height) < 300: - ratio = min(600/float(width),600/float(height)) - width = ratio*width - height = ratio*height - # or 2x bigger - else: - width = 2*width - height = 2*height - - ratio = min(float(width)/im_width,float(height)/im_height) #calculate resizing ratio - new_width = int(im_width*ratio) - new_height = int(im_height*ratio) - # resize to fit popup window - im = im1.resize((new_width, new_height), Image.BILINEAR) - # save - self.image_file_big = self.temp+"06.jpg" - im.save( self.image_file_big ) - # set image - self.popup_image.set_from_file( self.image_file_big ) - # show window - self.img_popup.show() + + ## add device to blacklist + def blacklist_add(self, widget=None): + BlacklistMgr.blacklist_add() + + ## remove device from blacklist + def blacklist_remove(self, widget=None): + BlacklistMgr.blacklist_remove() + + ## one of the placement coordinates changed + def on_placement_value_changed(self, source=None, event=None): + self.scan_koords = (self.position_x.get_value(),self.position_y.get_value(), + self.size_x.get_value(),self.size_y.get_value()) - - ## add device to blacklist - def blacklist_add(self, widget=None): - BlacklistMgr.blacklist_add() - - ## remove device from blacklist - def blacklist_remove(self, widget=None): - BlacklistMgr.blacklist_remove() - - ## one of the placement coordinates changed - def on_placement_value_changed(self, source=None, event=None): - self.scan_koords = (self.position_x.get_value(),self.position_y.get_value(), - self.size_x.get_value(),self.size_y.get_value()) + ## Orientation changed + def on_orientation_changed(self, source=None, event=None): + orient = self.orientation.get_model()[self.orientation.get_active()][0] - ## Orientation changed - def on_orientation_changed(self, source=None, event=None): - orient = self.orientation.get_model()[self.orientation.get_active()][0] + self.position_x.set_value(std_scan_koords[orient][0][0]) + self.position_y.set_value(std_scan_koords[orient][0][1]) + self.size_x.set_value(std_scan_koords[orient][0][2]) + self.size_y.set_value(std_scan_koords[orient][0][3]) - self.position_x.set_value(std_scan_koords[orient][0][0]) - self.position_y.set_value(std_scan_koords[orient][0][1]) - self.size_x.set_value(std_scan_koords[orient][0][2]) - self.size_y.set_value(std_scan_koords[orient][0][3]) + self.mode = std_scan_koords[orient][1] + + ## mode changed + def on_mode_changed(self, source=None): + op_mode = self.mode_combobox.get_active() + if (op_mode == self.MDE['invoices']): + self.toggle_placement_sensitive(True) + self.toggle_orientation_sensitive(True) + elif (op_mode == self.MDE['barcode']): + self.toggle_placement_sensitive(False) + self.toggle_orientation_sensitive(True) + elif (op_mode == self.MDE['DataMatrix']): + self.toggle_placement_sensitive(False) + self.toggle_orientation_sensitive(False) + elif (op_mode == self.MDE['PDF417']): + self.toggle_placement_sensitive(True) + self.toggle_orientation_sensitive(True) - self.mode = std_scan_koords[orient][1] - - ## mode changed - def on_mode_changed(self, source=None): - op_mode = self.mode_combobox.get_active() - if (op_mode == self.MDE['invoices']): - self.toggle_placement_sensitive(True) - self.toggle_orientation_sensitive(True) - elif (op_mode == self.MDE['barcode']): - self.toggle_placement_sensitive(False) - self.toggle_orientation_sensitive(True) - elif (op_mode == self.MDE['DataMatrix']): - self.toggle_placement_sensitive(False) - self.toggle_orientation_sensitive(False) - elif (op_mode == self.MDE['PDF417']): - self.toggle_placement_sensitive(True) - self.toggle_orientation_sensitive(True) + ## ToggleButton: 'scan'/'stop'. + def on_scan_button_clicked(self, source=None, event=None, *a): + if self.scan_button.get_active(): # scan ! + # test if we ask for a scanner, but there is none connected + if not self.run_sane.found_scanner and self.sane_input_button.get_active(): + self.__stop = True + self.scan_button.set_active(False) + return + + self.scan_button.set_label("stop") + self.__stop = False - ## ToggleButton: 'scan'/'stop'. - def on_scan_button_clicked(self, source=None, event=None, *a): - if self.scan_button.get_active(): # scan ! - # test if we ask for a scanner, but there is none connected - if not self.run_sane.found_scanner and self.sane_input_button.get_active(): - self.__stop = True - self.scan_button.set_active(False) - return - - self.scan_button.set_label("stop") - self.__stop = False + self.output.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FFFFFF")) # widget color + self.refresh() - self.output.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FFFFFF")) # widget color - self.refresh() + for i in range(self.max_retry): + check = self.scancode() + if check or (check == None) or self.__stop: break + if self.__stop: return - for i in range(self.max_retry): - check = self.scancode() - if check or (check == None) or self.__stop: break - if self.__stop: return + self.output.modify_base(gtk.STATE_NORMAL, self.res_color[check]) # widget color + self.refresh() - self.output.modify_base(gtk.STATE_NORMAL, self.res_color[check]) # widget color - self.refresh() + self.__stop = True # other way around; to be able to decide if it was stopped or ended correctly + self.scan_button.set_active(False) # (since this triggers THIS function again) + else: # stop/abort ! + self.scan_button.set_label("scan") + if self.__stop: return + self.__stop = True - self.__stop = True # other way around; to be able to decide if it was stopped or ended correctly - self.scan_button.set_active(False) # (since this triggers THIS function again) - else: # stop/abort ! - self.scan_button.set_label("scan") - if self.__stop: return - self.__stop = True + self.output.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FFFFFF")) # widget color + self.progressbar.set_text("Stopped by user!") + self.refresh() + return - self.output.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FFFFFF")) # widget color - self.progressbar.set_text("Stopped by user!") - self.refresh() - return + ## exit and restart + def on_retry_button_clicked(self, source=None, event=None): + self.device_chooser_event.clear() + self.run_sane.retry() - ## exit and restart - def on_retry_button_clicked(self, source=None, event=None): - self.device_chooser_event.clear() - self.run_sane.retry() + ## exit + def on_exit_button_clicked(self, source=None, event=None): + self.on_main_window_destroy() - ## exit - def on_exit_button_clicked(self, source=None, event=None): - self.on_main_window_destroy() + ## press x-button on window + def on_main_window_destroy(self, source=None, event=None): + try: + os.remove( self.temp+"04.jpg" ) # clean-up + os.remove( self.image_file_small ) + except: + pass + # exit + gtk.main_quit() - ## press x-button on window - def on_main_window_destroy(self, source=None, event=None): - try: - os.remove( self.temp+"04.jpg" ) # clean-up - os.remove( self.image_file_small ) - except: - pass - # exit - gtk.main_quit() + ## file selected + def on_filechooserbutton_file_set(self, source=None): + self.file_input_button.set_active(True) + self.inp_file = self.filechooserbutton.get_filename() + if not os.path.exists(self.inp_file): + self.progress(0., "File not found!") + return None + self.setimage(self.inp_file) - ## file selected - def on_filechooserbutton_file_set(self, source=None): - self.file_input_button.set_active(True) - self.inp_file = self.filechooserbutton.get_filename() - if not os.path.exists(self.inp_file): - self.progress(0., "File not found!") - return None - self.setimage(self.inp_file) + # helpers + # + ## Main scanning and number recognition procedure. + # + # @todo Put this function (may be as class with functions for each step) into utils::ocr + # + def scancode(self): + # Initialization of scanning process + # (0/7) + self.progress(0., "") + max_steps = 7 + op_mode = self.mode_combobox.get_active() + source_mode = self.sane_input_button.get_active() + if (op_mode == self.MDE['invoices']): # 0: invoices (tesser) + self.on_placement_value_changed() # scan selected range + self.on_orientation_changed() # orientation mode + opt = { 'tmp_file': "02.tif", + 'recog_class': utils.RunExternal, + 'recog_cmd': self.cmd_tesser % (self.temp+"02", self.temp+"03"), + 'recog_error_msg': [ "Unable" ], + 'valid_code_len': self.valid_code_len, + 'resolution': 600, } + elif (op_mode == self.MDE['barcode']): # 1: barcode (gocr) + self.on_orientation_changed() # orientation mode + self.scan_koords = std_scan_koords["A4"][0] + #self.mode = std_scan_koords["A4"][1] + opt = { 'tmp_file': "02.pnm", + 'recog_class': utils.RunExternal, + 'recog_cmd': self.cmd_gocr % (self.temp+"02",), + 'recog_error_msg': [ "\nERROR pnm.c" ], + 'valid_code_len': [ 13, 10, 9 ], + 'resolution': 300, } + elif (op_mode == self.MDE['DataMatrix']): # 2: DataMatrix (libdmtx) + #self.on_orientation_changed() # orientation mode + self.scan_koords = std_scan_koords["A4"][0] + self.mode = std_scan_koords["A4"][1] + #pydmtx recognition +# opt = { 'tmp_file': "02.jpg", # some issues with recogition +# 'recog_class': utils.RunLibdmtx, # . +# 'recog_cmd': self.temp+"02.jpg", # of different file formats +# 'recog_error_msg': [ None ], # . + #dmtxread recognition + opt = { 'tmp_file': "02.jpg", # some issues with recogition + 'recog_class': utils.RunExternal, # . + 'recog_cmd': "%s -v -D %s02.jpg"%(paths["dmtxread"],self.temp), # of different file formats + 'recog_error_msg': [ "error" ], # . + #opt = { 'tmp_file': "02.bmp", # and drawing/marking the + # 'recog_cmd': (self.temp+"02.bmp", [ None ], utils.ocr.RunLibdmtx), } # processed region(s)... + #opt = { 'tmp_file': "02.png", # (but this should work for 'tif') + # 'recog_cmd': (self.temp+"02.png", [ None ], utils.ocr.RunLibdmtx), } # + 'resolution': 150, } + elif (op_mode == self.MDE['PDF417']): # 3: PDF417 barcode (pdf417decode/wine) + self.on_placement_value_changed() # scan selected range + self.on_orientation_changed() # orientation mode + opt = { 'tmp_file': "02.png", + 'recog_class': utils.RunExternal, + 'recog_cmd': self.cmd_pdf417dec % (self.temp+"02",), + 'recog_error_msg': [ "wine: cannot find", "pdf417decode.exe imagefile|string.txt|-i", "Decoding failed." ], + 'resolution': 300, } - # helpers - # - ## Main scanning and number recognition procedure. - # - # @todo Put this function (may be as class with functions for each step) into utils::ocr - # - def scancode(self): - # Initialization of scanning process - # (0/7) - self.progress(0., "") - max_steps = 7 - op_mode = self.mode_combobox.get_active() - source_mode = self.sane_input_button.get_active() - if (op_mode == self.MDE['invoices']): # 0: invoices (tesser) - self.on_placement_value_changed() # scan selected range - self.on_orientation_changed() # orientation mode - opt = { 'tmp_file': "02.tif", - 'recog_class': utils.RunExternal, - 'recog_cmd': self.cmd_tesser % (self.temp+"02", self.temp+"03"), - 'recog_error_msg': [ "Unable" ], - 'valid_code_len': self.valid_code_len, - 'resolution': 600, } - elif (op_mode == self.MDE['barcode']): # 1: barcode (gocr) - self.on_orientation_changed() # orientation mode - self.scan_koords = std_scan_koords["A4"][0] - #self.mode = std_scan_koords["A4"][1] - opt = { 'tmp_file': "02.pnm", - 'recog_class': utils.RunExternal, - 'recog_cmd': self.cmd_gocr % (self.temp+"02",), - 'recog_error_msg': [ "\nERROR pnm.c" ], - 'valid_code_len': [ 13, 10, 9 ], - 'resolution': 300, } - elif (op_mode == self.MDE['DataMatrix']): # 2: DataMatrix (libdmtx) - #self.on_orientation_changed() # orientation mode - self.scan_koords = std_scan_koords["A4"][0] - self.mode = std_scan_koords["A4"][1] - #pydmtx recognition -# opt = { 'tmp_file': "02.jpg", # some issues with recogition -# 'recog_class': utils.RunLibdmtx, # . -# 'recog_cmd': self.temp+"02.jpg", # of different file formats -# 'recog_error_msg': [ None ], # . - #dmtxread recognition - opt = { 'tmp_file': "02.jpg", # some issues with recogition - 'recog_class': utils.RunExternal, # . - 'recog_cmd': "%s -v -D %s02.jpg"%(paths["dmtxread"],self.temp), # of different file formats - 'recog_error_msg': [ "error" ], # . - - #opt = { 'tmp_file': "02.bmp", # and drawing/marking the - # 'recog_cmd': (self.temp+"02.bmp", [ None ], utils.ocr.RunLibdmtx), } # processed region(s)... - #opt = { 'tmp_file': "02.png", # (but this should work for 'tif') - # 'recog_cmd': (self.temp+"02.png", [ None ], utils.ocr.RunLibdmtx), } # - 'resolution': 150, } - elif (op_mode == self.MDE['PDF417']): # 3: PDF417 barcode (pdf417decode/wine) - self.on_placement_value_changed() # scan selected range - self.on_orientation_changed() # orientation mode - opt = { 'tmp_file': "02.png", - 'recog_class': utils.RunExternal, - 'recog_cmd': self.cmd_pdf417dec % (self.temp+"02",), - 'recog_error_msg': [ "wine: cannot find", "pdf417decode.exe imagefile|string.txt|-i", "Decoding failed." ], - 'resolution': 300, } + #os.chdir(home_path) # (still needed?) + self.refresh() + if self.__stop: return - #os.chdir(home_path) # (still needed?) - self.refresh() - if self.__stop: return + # Scaning and retrieving data OR reading from image file + # (tesseract has a direct python interface: http://code.google.com/p/pytesser/) + # (1/?) + if source_mode: # SANE scanning interface + self.progress(1./max_steps, "Scanning data...") + self.inp_file = self.temp+"01.tif" + #self.run_sane = utils.ocr.RunExternal(self.cmd_scan % ( self.scan_koords + (inp_file,) ), [ "no SANE devices found" ]) + self.run_sane.post_init(self.scan_koords, self.inp_file) # utils.ocr.RunSANE().post_init(...) 2nd part of __init__(...) + self.run_sane.resolution = opt["resolution"] + if self.run_sane(): + print self.run_sane.stderr + self.progress(0., self.run_sane.stderr) + return None + #del self.run_sane + else: # direct file input + self.progress(1./max_steps, "Reading image...") + #self.inp_file = self.filechooserbutton.get_filename() + #if not os.path.exists(self.inp_file): + # self.progress(0., "File not found!") + # return None + self.refresh() + if self.__stop: return - # Scaning and retrieving data OR reading from image file - # (tesseract has a direct python interface: http://code.google.com/p/pytesser/) - # (1/?) - if source_mode: # SANE scanning interface - self.progress(1./max_steps, "Scanning data...") - self.inp_file = self.temp+"01.tif" - #self.run_sane = utils.ocr.RunExternal(self.cmd_scan % ( self.scan_koords + (inp_file,) ), [ "no SANE devices found" ]) - self.run_sane.post_init(self.scan_koords, self.inp_file) # utils.ocr.RunSANE().post_init(...) 2nd part of __init__(...) - self.run_sane.resolution = opt["resolution"] - if self.run_sane(): - print self.run_sane.stderr - self.progress(0., self.run_sane.stderr) - return None - #del self.run_sane - else: # direct file input - self.progress(1./max_steps, "Reading image...") - #self.inp_file = self.filechooserbutton.get_filename() - #if not os.path.exists(self.inp_file): - # self.progress(0., "File not found!") - # return None - self.refresh() - if self.__stop: return + # Adjust and rotate the retrieved data + # (2/?) + self.progress(2./max_steps, "Adjusting image/picture data...") + mode = self.mode + try: + self.inp_file + except: + print "No input file. Please select input file or SANE Interface." + self.progress(0., "No input file. Please select input file or SANE Interface.") + return None + self.run_convert = utils.RunExternal(self.cmd_convert % (self.inp_file, mode, self.temp+opt['tmp_file']), error_msg=[ "convert: unable to open image" ]) +# self.run_convert = utils.RunMagickWand(inp_file, mode*90, self.temp+opt['tmp_file']) + # improve quality by using imagemagicks filter and conversion capabilities... + if self.run_convert(): + self.progress(0., self.run_convert.stderr[:-1]) + return None + #if (op_mode == self.MDE['invoices']): # 0: invoices + self.setimage( self.temp+opt['tmp_file'] ) + if source_mode: # SANE scanning interface + os.remove(self.inp_file) # clean-up + del self.run_convert + self.refresh() + if self.__stop: return - # Adjust and rotate the retrieved data - # (2/?) - self.progress(2./max_steps, "Adjusting image/picture data...") - mode = self.mode - try: - self.inp_file - except: - print "No input file. Please select input file or SANE Interface." - self.progress(0., "No input file. Please select input file or SANE Interface.") - return None - self.run_convert = utils.RunExternal(self.cmd_convert % (self.inp_file, mode, self.temp+opt['tmp_file']), error_msg=[ "convert: unable to open image" ]) -# self.run_convert = utils.RunMagickWand(inp_file, mode*90, self.temp+opt['tmp_file']) - # improve quality by using imagemagicks filter and conversion capabilities... - if self.run_convert(): - self.progress(0., self.run_convert.stderr[:-1]) - return None - #if (op_mode == self.MDE['invoices']): # 0: invoices - self.setimage( self.temp+opt['tmp_file'] ) - if source_mode: # SANE scanning interface - os.remove(self.inp_file) # clean-up - del self.run_convert - self.refresh() - if self.__stop: return + # Data character recognition / Barcode search and recognition + # (3/?) + self.progress(3./max_steps, "Recognition...") + self.run_recognition = opt['recog_class'](opt['recog_cmd'], error_msg=opt['recog_error_msg']) + if self.run_recognition(): + # create debug info output + os.rename(self.temp+opt['tmp_file'], self.debug[0]+opt['tmp_file'][-4:]) + #print "debug info output in '%s'" % self.debug[0] - # Data character recognition / Barcode search and recognition - # (3/?) - self.progress(3./max_steps, "Recognition...") - self.run_recognition = opt['recog_class'](opt['recog_cmd'], error_msg=opt['recog_error_msg']) - if self.run_recognition(): - # create debug info output - os.rename(self.temp+opt['tmp_file'], self.debug[0]+opt['tmp_file'][-4:]) - #print "debug info output in '%s'" % self.debug[0] + print self.run_recognition.stderr[:-1] + " Look at debug info!" + self.progress(0., self.run_recognition.stderr[:-1] + " Look at debug info!") + return None - print self.run_recognition.stderr[:-1] + " Look at debug info!" - self.progress(0., self.run_recognition.stderr[:-1] + " Look at debug info!") - return None + if (op_mode == self.MDE['invoices']): # 0: invoices + # Simple workaround: The program simply continuous if no text is found at all + # and therefore no txt-file is generated. + if not os.path.exists(self.temp+"03.txt"): + origdata = "$" + data = "$" + else: + df = file(self.temp+"03.txt", "r") + data = df.read(-1) + df.close() + origdata = data + os.remove(self.temp+"03.txt") # clean-up + + elif (op_mode == self.MDE['barcode']): # 1: barcode + # (cheap'n'ugly but working...) + raw_data = self.regex_gocr.search(self.run_recognition.stdout).groups() + raw_data = raw_data[0].strip() + raw_data = raw_data.replace("=", ":") + raw_data = raw_data.replace('" ', '", "') + raw_data = raw_data.replace(':"', '":"') + raw_data = '{ "' + raw_data + ' }' + data = eval( raw_data ) + origdata = str(data) + elif (op_mode == self.MDE['DataMatrix']): # 2: DataMatrix (libdmtx) + data = self.run_recognition.stdout + #pydmtx recognition +# if self.run_recognition.count == 1: +# data = self.run_recognition.message[0] +# else: +# data = str(self.run_recognition.message) +# origdata = str(self.run_recognition.stats) + elif (op_mode == self.MDE['PDF417']): # 3: PDF417 barcode (pdf417decode/wine) + data = self.run_recognition.stdout.split("\r\n")[1] + origdata = data + self.refresh() + if self.__stop: return - if (op_mode == self.MDE['invoices']): # 0: invoices - # Simple workaround: The program simply continuous if no text is found at all - # and therefore no txt-file is generated. - if not os.path.exists(self.temp+"03.txt"): - origdata = "$" - data = "$" - else: - df = file(self.temp+"03.txt", "r") - data = df.read(-1) - df.close() - origdata = data - os.remove(self.temp+"03.txt") # clean-up - - elif (op_mode == self.MDE['barcode']): # 1: barcode - # (cheap'n'ugly but working...) - raw_data = self.regex_gocr.search(self.run_recognition.stdout).groups() - raw_data = raw_data[0].strip() - raw_data = raw_data.replace("=", ":") - raw_data = raw_data.replace('" ', '", "') - raw_data = raw_data.replace(':"', '":"') - raw_data = '{ "' + raw_data + ' }' - data = eval( raw_data ) - origdata = str(data) - elif (op_mode == self.MDE['DataMatrix']): # 2: DataMatrix (libdmtx) - data = self.run_recognition.stdout - #pydmtx recognition -# if self.run_recognition.count == 1: -# data = self.run_recognition.message[0] -# else: -# data = str(self.run_recognition.message) -# origdata = str(self.run_recognition.stats) - elif (op_mode == self.MDE['PDF417']): # 3: PDF417 barcode (pdf417decode/wine) - data = self.run_recognition.stdout.split("\r\n")[1] - origdata = data - self.refresh() - if self.__stop: return + # Data character correction + # (4/?) + if (op_mode == self.MDE['invoices']): # 0: invoices + self.progress(4./max_steps, "Character correction...") + print "*** " * 10 + data = utils.ocr.char_correction(data) + self.refresh() + if self.__stop: return - # Data character correction - # (4/?) - if (op_mode == self.MDE['invoices']): # 0: invoices - self.progress(4./max_steps, "Character correction...") - print "*** " * 10 - data = utils.ocr.char_correction(data) - self.refresh() - if self.__stop: return + # Data validity check + # (5/?) + self.progress(5./max_steps, "Check on validity...") + if (op_mode == self.MDE['invoices']): # 0: invoices + check = (not "?" in data) or (not "!" in data) # any unrecognized char in code? + check = check and ( len(data) in opt['valid_code_len'] ) # correct code len? + if check: + tmp = data[:-1].split(">") + amount = tmp[0] + tmp = tmp[1].split("+ ") + reference = tmp[0] + account = tmp[1] + # initialize modulo10 checksum + m10 = modulo10(amount, account, reference) + # check amount, account number and reference number + print "Amount: " + str(m10.amount) +" "+ str(m10.checksum_b) + print "Account number: " +str(m10.account) +" "+ str(m10.checksum_k) + print "Reference number: "+ str(m10.reference) +" "+ str(m10.checksum_r) + + checksum = m10.checksum + +# if len(data) == 42: +# # extract details +# (tmp, betrag, tmp, referenz, tmp, konto, tmp) = struct.unpack("2s11ss16s2s9ss",data) +# print "Betrag: "+str(int(betrag[:-1])/100.) +# print "Konto: "+konto[:2]+"-"+konto[3:-2]+"-"+konto[-2:] +# print "Referenznr: "+referenz +# if check: +# # modulo10 checksum for betrag +# checknr = modulo10().run(betrag[:-1]) +# print "Checknr: ",checknr +# checknr = ( checknr == int(betrag[-1]) ) + elif (op_mode == self.MDE['barcode']): # 1: barcode + check = not (data['type'] == "unknown") + if check: + check = check and ( int(data['crc']) == 0 ) # CRC error check? + check = check and (float(data['error']) < 0.15) # recognizion errors? + print 'type:' +" "+ data['type'] + print 'chars:' +" "+ data['chars'] + print 'crc:' +" "+ data['crc'] + print 'error:' +" "+ data['error'] + data = data['code'] + else: + data = "type: " + data['type'] + #check = check and ( len(data) in opt['valid_code_len'] ) # correct code len? + elif (op_mode == self.MDE['DataMatrix']): # 2: DataMatrix (libdmtx) + check = not (self.run_recognition.error == "error") + #pydmtx recognition +# check = not self.run_recognition.error +# if check: +# print self.run_recognition.decode +# print self.run_recognition.count +# #print self.run_recognition.message +# print self.run_recognition.stats + + elif (op_mode == self.MDE['PDF417']): # 3: PDF417 barcode (pdf417decode/wine) + check = not self.run_recognition.error + print data +" "+ str(len(data)) +" "+ str(check) + del self.run_recognition + self.refresh() + if self.__stop: return - # Data validity check - # (5/?) - self.progress(5./max_steps, "Check on validity...") - if (op_mode == self.MDE['invoices']): # 0: invoices - check = (not "?" in data) or (not "!" in data) # any unrecognized char in code? - check = check and ( len(data) in opt['valid_code_len'] ) # correct code len? - if check: - tmp = data[:-1].split(">") - amount = tmp[0] - tmp = tmp[1].split("+ ") - reference = tmp[0] - account = tmp[1] - # initialize modulo10 checksum - m10 = modulo10(amount, account, reference) - # check amount, account number and reference number - print "Amount: " + str(m10.amount) +" "+ str(m10.checksum_b) - print "Account number: " +str(m10.account) +" "+ str(m10.checksum_k) - print "Reference number: "+ str(m10.reference) +" "+ str(m10.checksum_r) - - checksum = m10.checksum - -# if len(data) == 42: -# # extract details -# (tmp, betrag, tmp, referenz, tmp, konto, tmp) = struct.unpack("2s11ss16s2s9ss",data) -# print "Betrag: "+str(int(betrag[:-1])/100.) -# print "Konto: "+konto[:2]+"-"+konto[3:-2]+"-"+konto[-2:] -# print "Referenznr: "+referenz -# if check: -# # modulo10 checksum for betrag -# checknr = modulo10().run(betrag[:-1]) -# print "Checknr: ",checknr -# checknr = ( checknr == int(betrag[-1]) ) - elif (op_mode == self.MDE['barcode']): # 1: barcode - check = not (data['type'] == "unknown") - if check: - check = check and ( int(data['crc']) == 0 ) # CRC error check? - check = check and (float(data['error']) < 0.15) # recognizion errors? - print 'type:' +" "+ data['type'] - print 'chars:' +" "+ data['chars'] - print 'crc:' +" "+ data['crc'] - print 'error:' +" "+ data['error'] - data = data['code'] - else: - data = "type: " + data['type'] - #check = check and ( len(data) in opt['valid_code_len'] ) # correct code len? - elif (op_mode == self.MDE['DataMatrix']): # 2: DataMatrix (libdmtx) - check = not (self.run_recognition.error == "error") - #pydmtx recognition -# check = not self.run_recognition.error -# if check: -# print self.run_recognition.decode -# print self.run_recognition.count -# #print self.run_recognition.message -# print self.run_recognition.stats - - elif (op_mode == self.MDE['PDF417']): # 3: PDF417 barcode (pdf417decode/wine) - check = not self.run_recognition.error - print data +" "+ str(len(data)) +" "+ str(check) - del self.run_recognition - self.refresh() - if self.__stop: return + # Data final output + # (6/?) + self.progress(6./max_steps, "Final data output...") + if check: + os.remove(self.temp+opt['tmp_file']) # clean-up - # Data final output - # (6/?) - self.progress(6./max_steps, "Final data output...") - if check: - os.remove(self.temp+opt['tmp_file']) # clean-up + self.output.set_text(data) - self.output.set_text(data) + # get the clipboard + clipboard = gtk.clipboard_get() + # set the clipboard text data + clipboard.set_text(data) + # make our data available to other applications + clipboard.store() + #print "data sent to (gtk/gnome) clipboard" + if checksum: + self.progress(1., "Code recognized and sent to clipboard. Finished.") + else: + self.progress(1., "Code recognized and sent to clipboard, BUT checksum failed! CHECK code again! Finished.") + else: + # create debug info output + log = file(self.debug[1], "w") + for i in range(len(origdata)): + log.write(str( (origdata[i], ord(origdata[i])) )) + log.write("\n") + for i in range(len(data)): + log.write(str( (data[i], ord(data[i])) )) + log.close() + #print "debug info output in '%s'" % self.debug[1] + os.rename(self.temp+opt['tmp_file'], self.debug[0]+opt['tmp_file'][-4:]) + #print "debug info output in '%s'" % self.debug[0] - # get the clipboard - clipboard = gtk.clipboard_get() - # set the clipboard text data - clipboard.set_text(data) - # make our data available to other applications - clipboard.store() - #print "data sent to (gtk/gnome) clipboard" - if checksum: - self.progress(1., "Code recognized and sent to clipboard. Finished.") - else: - self.progress(1., "Code recognized and sent to clipboard, BUT checksum failed! CHECK code again! Finished.") - else: - # create debug info output - log = file(self.debug[1], "w") - for i in range(len(origdata)): - log.write(str( (origdata[i], ord(origdata[i])) )) - log.write("\n") - for i in range(len(data)): - log.write(str( (data[i], ord(data[i])) )) - log.close() - #print "debug info output in '%s'" % self.debug[1] - os.rename(self.temp+opt['tmp_file'], self.debug[0]+opt['tmp_file'][-4:]) - #print "debug info output in '%s'" % self.debug[0] + self.progress(1., "Code could not be recognized correct. Look at debug info!") + self.refresh() + if self.__stop: return - self.progress(1., "Code could not be recognized correct. Look at debug info!") - self.refresh() - if self.__stop: return + # Done + # (7/7) + return check - # Done - # (7/7) - return check + ## Refresh window during running processes. + def refresh(self): + self.main_window.queue_draw() + time.sleep(0.1) # give also some time to the user... :) + while gtk.events_pending(): + gtk.main_iteration() - ## Refresh window during running processes. - def refresh(self): - self.main_window.queue_draw() - time.sleep(0.1) # give also some time to the user... :) - while gtk.events_pending(): - gtk.main_iteration() + ## Resize and set PIL image to gtk/gnome window. + # resize an image using the PIL image library + # tested with Python24 vegaseat 11oct2005 + # open an image file (.bmp,.jpg,.png,.gif) you have in the working folder + # @see http://www.daniweb.com/code/snippet216637.html + # @see http://www.pythonware.com/products/pil/index.htm + def setimage(self, imageFile): + print imageFile[-3:] + if imageFile[-3:] in ["bmp","jpg","png","gif"]: + #already in right format + # original file name + self.imageFile = imageFile + # load file + im1 = Image.open(self.imageFile) + else: + #convert Image + self.run_convert = utils.RunExternal(self.cmd_convert % (imageFile, 0, self.temp+"04.jpg"), error_msg=[ "convert: unable to open image" ]) + if self.run_convert(): + self.progress(0., self.run_convert.stderr[:-1]) + return None + # original filename + self.imageFile = self.temp+"04.jpg" + # load file + im1 = Image.open(self.imageFile) + + # adjust width and height to your needs and keep ratio + (im_width, im_height) = im1.size #get image size + #get needed size + width = self.main_image.allocation.width + height = self.main_image.allocation.height + ratio = min(float(width)/im_width,float(height)/im_height) #calculate resizing ratio + self.new_width = int(im_width*ratio) + self.new_height = int(im_height*ratio) + + # use one of these filter options to resize the image + + #im = im1.resize((new_width, new_height), Image.NEAREST) # use nearest neighbour + im = im1.resize((self.new_width, self.new_height), Image.BILINEAR) # linear interpolation in a 2x2 environment + #im = im1.resize((new_width, new_height), Image.BICUBIC) # cubic spline interpolation in a 4x4 environment + #im = im1.resize((new_width, new_height), Image.ANTIALIAS) # best down-sizing filter + #ext = ".jpg" + + # set image preview + self.image_file_small = self.temp+"05.jpg" + im.save( self.image_file_small ) + self.main_image.set_from_file( self.image_file_small ) - ## Resize and set PIL image to gtk/gnome window. - # resize an image using the PIL image library - # tested with Python24 vegaseat 11oct2005 - # open an image file (.bmp,.jpg,.png,.gif) you have in the working folder - # @see http://www.daniweb.com/code/snippet216637.html - # @see http://www.pythonware.com/products/pil/index.htm - def setimage(self, imageFile): - print imageFile[-3:] - if imageFile[-3:] in ["bmp","jpg","png","gif"]: - #already in right format - # original file name - self.imageFile = imageFile - # load file - im1 = Image.open(self.imageFile) - else: - #convert Image - self.run_convert = utils.RunExternal(self.cmd_convert % (imageFile, 0, self.temp+"04.jpg"), error_msg=[ "convert: unable to open image" ]) - if self.run_convert(): - self.progress(0., self.run_convert.stderr[:-1]) - return None - # original filename - self.imageFile = self.temp+"04.jpg" - # load file - im1 = Image.open(self.imageFile) - - # adjust width and height to your needs and keep ratio - (im_width, im_height) = im1.size #get image size - #get needed size - width = self.main_image.allocation.width - height = self.main_image.allocation.height - ratio = min(float(width)/im_width,float(height)/im_height) #calculate resizing ratio - self.new_width = int(im_width*ratio) - self.new_height = int(im_height*ratio) - - # use one of these filter options to resize the image - - #im = im1.resize((new_width, new_height), Image.NEAREST) # use nearest neighbour - im = im1.resize((self.new_width, self.new_height), Image.BILINEAR) # linear interpolation in a 2x2 environment - #im = im1.resize((new_width, new_heigh... [truncated message content] |