[Pycodeocr-main] SF.net SVN: pycodeocr:[66] branches/redesign
Status: Beta
Brought to you by:
drtrigon
From: <la...@us...> - 2014-08-26 13:08:10
|
Revision: 66 http://sourceforge.net/p/pycodeocr/code/66 Author: laserb Date: 2014-08-26 13:07:59 +0000 (Tue, 26 Aug 2014) Log Message: ----------- Get some basic GUI to work. Modified Paths: -------------- branches/redesign/PyCodeOCR.py branches/redesign/Recognition/ESR.py branches/redesign/Recognition/ImageRecognition.py branches/redesign/gtkGUI/ImagePreview.py branches/redesign/gtkGUI/ProgressBar.py branches/redesign/gtkGUI/__init__.py Removed Paths: ------------- branches/redesign/blacklist branches/redesign/tests/ branches/redesign/utils/checksum.py branches/redesign/utils/ocr.py Modified: branches/redesign/PyCodeOCR.py =================================================================== --- branches/redesign/PyCodeOCR.py 2014-08-24 10:19:30 UTC (rev 65) +++ branches/redesign/PyCodeOCR.py 2014-08-26 13:07:59 UTC (rev 66) @@ -43,27 +43,80 @@ # @include "./CHANGES" # +import gtk, time import Source import Recognition +import gtkGUI +import threading class PyCodeOCR(object): def __init__(self): - self.sources = Source.Sources() - self.sources.searchScanner() + + srcs = Source.Sources() + srcs.searchScanner() + self.source = srcs.getSources()[0] + + self.win = gtk.Window() + self.win.set_border_width(5) + self.win.set_title('PyCodeOCR') + self.win.connect('delete-event', gtk.main_quit) + + hbox = gtk.HBox() + self.win.add(hbox) + + vboxImage = gtk.VBox() + self.imagePreview = gtkGUI.ImagePreview() + self.progressbar = gtkGUI.ProgressBar(4) + vboxImage.pack_start(self.imagePreview,True,True,0) + vboxImage.pack_end(self.progressbar,False,False,0) + + hbox.add(vboxImage) + + vboxProperties = gtk.VBox() + hbox.add(vboxProperties) + + button = gtk.Button("Scan") + button.connect("pressed",self.on_button_pressed) + vboxProperties.pack_end(button, False, False, 0) + + self.win.show_all() + def __call__(self): - self.runRecognition() + gtk.main() + - def runRecognition(self): - source = self.sources.getSources()[0] - imageRecognition = Recognition.ESR() - imageRecognition.setRotate([180]) + ## Refresh window during running processes. + def refresh(self): + self.win.queue_draw() + time.sleep(0.1) # give also some time to the user... :) + while gtk.events_pending(): + gtk.main_iteration() + + + def on_button_pressed(self, event): + self.imageRecognition = Recognition.ESR() + self.imageRecognition.setRotate([180]) + stdScannerData = Source.StdScannerData() scannerData = stdScannerData.getStdScannerData("180 deg") - runRecognition = Recognition.RunRecognition(source, scannerData, imageRecognition) - (check, msg) = runRecognition() - print msg - + + runRecognition = Recognition.RunRecognition(self.source, scannerData, self.imageRecognition) + runRecognition.connect("updateRecognition", self.onProgressUpdate) + runRecognition.connect("recognized", self.on_recognized) + t = threading.Thread(target=runRecognition) + t.start() + #gtk.threads_enter() + #self.imagePreview.setRecognitionData(esr.getRecognitionData()) + #gtk.threads_leave() + + def on_recognized(self, runRecognition): + self.imagePreview.setRecognitionData(self.imageRecognition.getRecognitionData()) + + def onProgressUpdate(self, runRecognition, message): + self.progressbar.nextProgress(message) + if __name__ == '__main__': + gtk.threads_init() main = PyCodeOCR() main() Modified: branches/redesign/Recognition/ESR.py =================================================================== --- branches/redesign/Recognition/ESR.py 2014-08-24 10:19:30 UTC (rev 65) +++ branches/redesign/Recognition/ESR.py 2014-08-26 13:07:59 UTC (rev 66) @@ -32,7 +32,7 @@ self.valid_code_len = [ 53, 43, 42, 32 ] # valid code lenghts ## @overwrite verification - def verify(self): + def doVerification(self): # correct for common char recognition errors self.recognitionData.setContent(self.char_correction(self.recognitionData.getContent())) @@ -69,6 +69,11 @@ # @see http://www.bundesbank.de/zahlungsverkehr/zahlungsverkehr_pruefziffernberechnung.php # @return True if checksum is valid, false otherwise def checksum(self, number): + try: + int(number) + except: + return False + tabelle = [0,9,4,6,8,2,7,1,3,5] uebertrag = 0 Modified: branches/redesign/Recognition/ImageRecognition.py =================================================================== --- branches/redesign/Recognition/ImageRecognition.py 2014-08-24 10:19:30 UTC (rev 65) +++ branches/redesign/Recognition/ImageRecognition.py 2014-08-26 13:07:59 UTC (rev 66) @@ -19,7 +19,8 @@ # @li Modules: utils # -import os, gtk +import os, gtk, threading, gobject +import pyperclip from PIL import Image import utils @@ -31,6 +32,7 @@ self.name = name self.depth = 8 self.rotate = [0,90,90,90] + self.recognitionData = None ## Verify if data is valid. # @pre image acquired and recognized @@ -38,7 +40,9 @@ # @return (boolean, data) True if data is valid, false otherwise # if data is valid return data, otherwise return error message def verify(self): - return (True, "") + (check, msg) = self.doVerification() + self.recognitionData.setValid(check) + return (True, msg) ## get image and associated data # @pre image recognized @@ -89,6 +93,7 @@ self.image = image self.temp_name = "image_object_temp_file" self.content = "" + self.valid = None ## get image # @return image @@ -118,29 +123,35 @@ # @pre image recognized # @param information from image # @post information set - def setContent(self, content): + def setContent(self, content, valid = None): self.content = content + self.valid = valid ## get information associated with image # @return information content def getContent(self): return self.content + def setValid(self, valid): + self.valid = valid + + def isValid(self): + return self.valid + ## save content to clipboard # @pre information set # @post information saved in clipboard def saveClipboard(self): - # get the clipboard - clipboard = gtk.clipboard_get() # set the clipboard text data - clipboard.set_text(self.content) + pyperclip.setcb(self.content) # make our data available to other applications - clipboard.store() + pyperclip.getcb() ## Run the recognition and verify the information -class RunRecognition(object): +class RunRecognition(gobject.GObject): ## init def __init__(self, source, data, imageRecognition): + self.__gobject_init__() self.source = source self.data = data self.imageRecognition = imageRecognition @@ -149,6 +160,7 @@ # @return (boolean, data), True if data is valid, False otherwise # data if the acquired data is image, error-message otherwise def __call__(self): + self.emit("updateRecognition","Get Image ...") image = self.source.getImage(self.data) return self.recognize(image) @@ -157,15 +169,24 @@ # data if the acquired data is image, error message otherwise def recognize(self, image): # do recognition + self.emit("updateRecognition","Recognize image ...") self.imageRecognition.recognizeImage(image) # verify data + self.emit("updateRecognition","Verify data ...") (check, msg) = self.imageRecognition.verify() # if data is valid, save to clipboard and return data + self.emit("recognized") if check: + self.emit("updateRecognition","Data is valid. Save to clipboard.") self.imageRecognition.getRecognitionData().saveClipboard() return (True, self.imageRecognition.getRecognitionData().getContent()) # if data is invalid return error message - return (False, msg) \ No newline at end of file + self.emit("updateRecognition","Data is not valid.") + return (False, msg) + +gobject.type_register(RunRecognition) +gobject.signal_new("recognized", RunRecognition, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ()) +gobject.signal_new("updateRecognition", RunRecognition, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_STRING,)) Deleted: branches/redesign/blacklist =================================================================== --- branches/redesign/blacklist 2014-08-24 10:19:30 UTC (rev 65) +++ branches/redesign/blacklist 2014-08-26 13:07:59 UTC (rev 66) @@ -1 +0,0 @@ -Printer Name Modified: branches/redesign/gtkGUI/ImagePreview.py =================================================================== --- branches/redesign/gtkGUI/ImagePreview.py 2014-08-24 10:19:30 UTC (rev 65) +++ branches/redesign/gtkGUI/ImagePreview.py 2014-08-26 13:07:59 UTC (rev 66) @@ -3,20 +3,29 @@ # PIL/Pillow image library and it's SANE bindings from PIL import Image +import Recognition -class ImagePreview(gtk.Widget): +class ImagePreview(gtk.VBox): def __init__(self): - #Initialize the Widget - gtk.Widget.__init__(self) + #Initialize the VBox + gtk.VBox.__init__(self,False,0) + self.res_color = { True: gtk.gdk.color_parse("#00FF00"), + False: gtk.gdk.color_parse("#FF0000"), + None: gtk.gdk.color_parse("#FFFFFF"), } + # # retrieve widgets # # main_window - main window # ## gladefile raw_path.glade - self.gladefile = raw_path + ".glade" + self.gladefile = "/home/rf/Testing/pycodeocr/gtkGUI/ImagePreview.glade" # open GTKBuilder self.builder = gtk.Builder() self.builder.add_from_file(self.gladefile) # connect signal handlers self.builder.connect_signals(self) + + ## label + self.scanned_code_label = self.builder.get_object('scanned_code_label') + ## event box for image self.main_image_eventbox = self.builder.get_object('main_image_eventbox') ## event box for image window @@ -27,26 +36,37 @@ self.popup_image = self.builder.get_object('popup_image') ## image window self.img_popup = self.builder.get_object('img_popup') + + ## output line + self.output = self.builder.get_object('output') + # connect eventbox to close image window (self.new_width, self.new_height ) = (0,0) - self.main_image.set_tooltip_text("Click for bigger image") - self.popup_image.set_tooltip_text("Leave window to close") + self.main_image.set_tooltip_text("Click for original image") + #self.main_image.connect('expose-event', self.on_image_resize, "") # high cpu usage + self.popup_image.set_tooltip_text("Click to close") - + self.pack_start(self.scanned_code_label,False,False,0) + self.pack_start(self.main_image_eventbox,True,True,0) + self.pack_end(self.output,False,False,0) - def on_eventbox_button_press_event(self, source=None, event=None): + self.show_all() + + def on_popup_image_eventbox_button_press_event(self, source=None, event=None): if self.img_popup.get_visible(): # hide window self.img_popup.hide() + + def on_main_image_eventbox_button_press_event(self, source=None, event=None): + if self.img_popup.get_visible(): + # hide window + self.img_popup.hide() else: - pixbuf = self.image_to_pixbuf(self.image.getImage()) + image = self.recognitionData.getImage() + pixbuf = self.image_to_pixbuf(image) image = gtk.Image() image.set_from_pixbuf(pixbuf) - - scaled_pixbuf = pixbuf.scale_simple(300,300,gtk.gdk.INTERP_BILINEAR) - - # set image - self.popup_image.set_from_pixbuf( scaled_pixbuf ) + self.popup_image.set_from_pixbuf( pixbuf ) # show window self.img_popup.show() @@ -57,25 +77,73 @@ # @see http://www.daniweb.com/code/snippet216637.html # @see http://www.pythonware.com/products/pil/index.htm def setImage(self, image): - self.image = image - pixbuf = self.image_to_pixbuf(self.image.getImage()) + self.recognitionData = Recognition.RecognitionData(image) + self.setImageHelper() + + + def setImageHelper(self): + image = self.recognitionData.getImage() + pixbuf = self.image_to_pixbuf(image) image = gtk.Image() image.set_from_pixbuf(pixbuf) + + self.main_image.set_from_pixbuf( pixbuf ) + self.on_image_resize(self.main_image, "", "") - scaled_pixbuf = pixbuf.scale_simple(150,150,gtk.gdk.INTERP_BILINEAR) + def setOutput(self, output, mode = None): + self.recognitionData.setContent(output, mode) + self.setOutputHelper() + + def setOutputHelper(self): + self.output.set_text(self.recognitionData.getContent()) + mode = self.recognitionData.isValid() + + # widget color + self.output.modify_base(gtk.STATE_NORMAL, self.res_color[mode]) - - self.main_image.set_from_pixbuf( scaled_pixbuf ) + def setRecognitionData(self, recognitionData): + self.recognitionData = recognitionData + self.setImageHelper() + self.setOutputHelper() - - def image_to_pixbuf(self): + # @see http://stackoverflow.com/questions/7906814/converting-pil-image-to-gtk-pixbuf + def image_to_pixbuf(self, image): fd = StringIO.StringIO() - self.image.getImage().save(fd, "ppm") + self.recognitionData.getImage().save(fd, "png") contents = fd.getvalue() fd.close() - loader = gtk.gdk.PixbufLoader("pnm") + loader = gtk.gdk.PixbufLoader("png") loader.write(contents, len(contents)) pixbuf = loader.get_pixbuf() loader.close() return pixbuf + + def on_image_resize(self, widget, event, window): + allocation = widget.get_allocation() + image = self.recognitionData.getImage() + pixbuf = self.image_to_pixbuf(image) + image = gtk.Image() + image.set_from_pixbuf(pixbuf) + + width = pixbuf.get_width() + height = pixbuf.get_height() + if height != allocation.height or width != allocation.width: + # min width and height should be 10px + target_width = max(100,allocation.width) + target_height = max(100,allocation.height) + + # get current width and height + width, height = pixbuf.get_width(), pixbuf.get_height() + + # get scale for width and height + scale_width, scale_height = float(target_width)/width, float(target_height)/height + + # target scale is minimum scale for width and height + scale = min(scale_width,scale_height) + + # scale pixbuf + pixbuf = pixbuf.scale_simple(int(width*scale), int(height*scale), gtk.gdk.INTERP_BILINEAR) + + # set new pixbuf + widget.set_from_pixbuf(pixbuf) \ No newline at end of file Modified: branches/redesign/gtkGUI/ProgressBar.py =================================================================== --- branches/redesign/gtkGUI/ProgressBar.py 2014-08-24 10:19:30 UTC (rev 65) +++ branches/redesign/gtkGUI/ProgressBar.py 2014-08-26 13:07:59 UTC (rev 66) @@ -1,24 +1,23 @@ import gtk -class ProgressBar(gtk.Widget): +# @see http://bytes.com/topic/python/answers/579827-pygtk-custom-widgets +class ProgressBar(gtk.HBox): def __init__(self,maximum): - gtk.Widget.__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) - ## progressbar - self.progressbar = self.builder.get_object('progressbar') - self.progress = 0 - self.maximum = maximum + gtk.HBox.__init__(self,False,0) + self.maximum = 1.0*maximum + + self.set_border_width(2) + + # progressbar + self.progressbar = gtk.ProgressBar() + self.progress = 0.0 + self.pack_start(self.progressbar,True,True,0) + + self.show_all() def nextProgress(self, message): - self.progress += 1 + if self.progress < self.maximum: + self.progress += 1 self.setProgress(message) def resetProgress(self, message): @@ -28,10 +27,10 @@ def setProgress(self, message): self.progressbar.set_fraction(self.progress/self.maximum) self.progressbar.set_text(message) - self.refresh() +# self.refresh() def setMaximum(self, maximum): - self.maximum = maximum + self.maximum = 1.0*maximum self.progressbar.set_fraction(self.progress/self.maximum) def getMaximum(self): Modified: branches/redesign/gtkGUI/__init__.py =================================================================== --- branches/redesign/gtkGUI/__init__.py 2014-08-24 10:19:30 UTC (rev 65) +++ branches/redesign/gtkGUI/__init__.py 2014-08-26 13:07:59 UTC (rev 66) @@ -1,3 +1,3 @@ -import ImagePreview -import ProgressBar +from ImagePreview import ImagePreview +from ProgressBar import ProgressBar import ScanProperties \ No newline at end of file Deleted: branches/redesign/utils/checksum.py =================================================================== --- branches/redesign/utils/checksum.py 2014-08-24 10:19:30 UTC (rev 65) +++ branches/redesign/utils/checksum.py 2014-08-26 13:07:59 UTC (rev 66) @@ -1,47 +0,0 @@ -## -# @file utils/checksum.py -# @namespace utils::checksum -# @authors laserb, drtrigon -# @version 1.1 -# @brief Modulo 10 checksum for e-banking codes. -# -# @test Add unittest to check correct operation of this important module. -# -# $Id$ -# -# @section Description -# -# Modulo 10 checksum for e-banking codes -# - -class modulo10: - # thanks to http://www.hosang.ch/modulo10.aspx - # much more details http://www.sic.ch/de/dl_tkicch_dta.pdf ( page 51 ) - # @see http://www.bundesbank.de/download/zahlungsverkehr/zv_pz201012.pdf - # @see http://www.bundesbank.de/zahlungsverkehr/zahlungsverkehr_pruefziffernberechnung.php - def __init__(self, amount, account, reference): - self.tabelle = [0,9,4,6,8,2,7,1,3,5] - - self.account = account - self.reference = reference - - self.checksum_b = self._checksum(amount) - self.checksum_k = self._checksum(account) - self.checksum_r = self._checksum(reference) - self.checksum = self.checksum_b and self.checksum_k and self.checksum_r - - try: - self.amount = str(int(amount[2:-1])/100.) - except ValueError: - self.amount = amount + " [ERROR!]" - - def _run(self, nr): - self.uebertrag = 0 - # iterate over each character - for i in range(len(nr)): - self.uebertrag = self.tabelle[(self.uebertrag + int(nr[i]) )%10] - - return (10-self.uebertrag)%10 - - def _checksum(self, value): - return (int(value[-1]) == self._run(value[:-1]) ) Deleted: branches/redesign/utils/ocr.py =================================================================== --- branches/redesign/utils/ocr.py 2014-08-24 10:19:30 UTC (rev 65) +++ branches/redesign/utils/ocr.py 2014-08-26 13:07:59 UTC (rev 66) @@ -1,272 +0,0 @@ -# -*- coding: utf-8 -*- -## -# @file utils/ocr.py -# @namespace utils::ocr -# @authors laserb, drtrigon -# @version 1.1 -# @brief Character recogition (OCR) functions and classes. -# -# $Id$ -# -# @section Description -# -# Character recogition (OCR) functions. -# - -# python standard modules -import os, re, sys, subprocess, gobject, threading, gtk -from logging import logging - -# PIL image library and it's SANE bindings -import sane # f12: 'python-imaging-sane' - - -## Character correction after recogition (on basis that there should be numbers and few special chars). -# -# @test Add unittest to check correct operation of this important module/function. -# -def char_correction(data): - data = re.sub("\n", "", data) - print data - corrections = [ - # Zero - ("O", "0"), ("D", "0"), ("U", "0"), ("Q", "0"), ("\(\)", "0"), ("G", "0"), ("o", "0"), - # Two - ("Z", "2"), - # Three - ("\?>", "3"), - # Four - ("l\.", "4"), ("A", "4"), ("l»", "4"), ("h", "4"), ("i»", "4"), ("l\xe2\x80\xa2", "4"), ("&", "4"), ("l\+", "4"), - # Five - ("S", "5"), - # Six - ("c>", "6"), - # Seven - #("\?", "7"), - # One (critical, therefore done as last; has also Overlapps e.g. with Four) - (chr(226)+chr(128)+chr(153)+"I", "1"), - (chr(226)+chr(128)+chr(153)+"\|", "1"), - (chr(226)+chr(128)+chr(152)+"\|", "1"), - (chr(226)+chr(128)+chr(152)+"I", "1"), - (chr(39)+"I", "1"), - ("I", "1"), - (chr(153)+"l", "1"), - (chr(39)+"l", "1"), - ("l", "1"), - (chr(39)+"!", "1"), - (chr(39)+"\|", "1"), - ("'\|", "1"), - ("\|", "1"), - ("'\]", "1"), - ("'\}", "1"), - (r'\\', "1"), - # non-numbers - (" ", ""), - ("\xe2", ""), - ("\x80", ""), - ("\xbb", ""), - ("\x99", ""), - ("\x98", ""), - ("\x5f", ""), - ("\x60", ""), - ("'", ""), - #('\xbb', 187)('\x99', 153)('\x98', 152) - ("\+", "+ "), - ("\)", ">"), - ("\x92", "1"), # post correction - ] - for item in corrections: - olddata = data - data = re.sub(item[0], item[1], data) - if not (data == olddata): print 'subst: "%s" => "%s"' % (item[0], item[1]) - - return data - -## SANE/PIL interface python wrapper/bindings. -class RunSANE(threading.Thread): - # "scanimage --format=tif --resolution 300 --mode Gray > %s.tif" - # "scanimage --format=tif --resolution 600 --mode Gray -t 82 -y 20 -l 60 -x 155.9 > %s.tif" - #cmd_scan = "scanimage --format=tif --resolution 600 --mode Gray -t %d -l %d -y %d -x %d > %s.tif" - - resolution = 600 - - ## Init of sane interface -> device. - def __init__(self, notebook, progress, device_chooser_button, BlacklistMgr,device_chooser_event,device_info_text): - print "init sane python interface ..." - self.device_chooser_event = device_chooser_event - self.notebook = notebook - self.progress = progress - self.device_chooser_button = device_chooser_button - self.BlacklistMgr = BlacklistMgr - self.device_info_text = device_info_text - - threading.Thread.__init__(self) - - def run(self): - - # get blacklist - self.blacklist = self.BlacklistMgr.read_blacklist() - - # init SANE - self.n = 4. - self.progress(0.,"init sane python interface ...") - try: - self.version = sane.init() - self.progress(1./self.n,"init sane python interface ... search devices") - # get sane devices - self.devices = sane.get_devices() - - # filter blacklisted devices - if len(self.devices) > 0 : - self.devices = self.BlacklistMgr.filter_devices(self.devices) - - # check how many devices we found - if len(self.devices) == 0: - self.progress(0./self.n,"No device found.") - self.device_chooser_button.set_visible(False) - self.found_scanner = False - gtk.gdk.threads_leave() - return - elif len(self.devices) > 1: - # simply continue and select device in GUI ( see init_sane ) - self.progress(2./self.n,"More than one device found.") - self.device_chooser_button.set_visible(True) - self.notebook.set_show_tabs(False) - self.found_scanner = None - self.BlacklistMgr.device_treeview.set_cursor(0) - - # show tab with device list - # choose device and press ok to initialize scanner - self.notebook.set_current_page(2) - - - gtk.gdk.threads_leave() - self.device_chooser_event.wait() - - # show main tab again - self.notebook.set_show_tabs(True) - self.notebook.set_current_page(0) - - # get selection from treeview - self.devnr = self.BlacklistMgr.device_treeview.get_cursor()[0][0] - - else: - # only one device found, continue - self.progress(2./self.n,"Device: %s" % self.devices[0][1]+" "+self.devices[0][2]) - self.device_chooser_button.set_visible(False) - self.devnr = 0 - - except: - # No device found at all - self.found_scanner = False - self.device_chooser_button.set_visible(False) - print "No sane device found. Retry again." - self.progress(0./self.n,"No sane device found. Retry again.") - gtk.gdk.threads_leave() - return - - - ## Init of sane interface -> scanner - print "Use device number: "+str(self.devnr) - try: - # finish init device - self.dev = self.devices[self.devnr][0] # choose device - print "%s" % self.dev - self.progress(3./self.n,"Device initialized. Open scanner...") - - # open scanner device - self.scanner = sane.open(self.dev) - self.params = self.scanner.get_parameters() - self.opts = self.scanner.get_options() - - self.found_scanner = True - - self.progress(4./self.n,"Ready: %s" % self.devices[self.devnr][1]+" "+self.devices[self.devnr][2]) -# self.info() - self.device_chooser_button.set_visible(False) - print "done." - - except: - # init scanner failed. maybe device has no scanner - self.found_scanner = False - print "Loading sane device failed. Retry again." - self.progress(0./self.n,"Loading sane device failed. Retry again.") - gtk.gdk.threads_leave() - - - self.info() - gtk.gdk.threads_leave() - - - ## Not init of sane and scanner, but of scan operation. - def post_init(self, coords, out_filename): - self.coords = coords - self.out_filename = out_filename - #self.info() - - ## call - def __call__(self): - (self.error, self.stdout, self.stderr) = self._run() - return self.error - - ## Scan and save the PIL image object to file. - # @see http://mail.python.org/pipermail/image-sig/1997-June/000307.html - # @see http://sane-pygtk.sourceforge.net/) - def _run(self): - try: - # Set scan parameters (also with higher resolution!) - (t, l, y, x) = self.coords - self.scanner.tl_y = float(t) - self.scanner.tl_x = float(l) - self.scanner.br_y = (float(y) + self.scanner.tl_y) - self.scanner.br_x = (float(x) + self.scanner.tl_x) - self.scanner.resolution = self.resolution - self.scanner.mode = "Gray" - - # Initiate the scan - self.scanner.start() - - # Get an Image object containing the scanned image - im = self.scanner.snap() - - # Write the image out as a TIFF file (or whatever) - im.save(self.out_filename) - - #self.scanner.stop() - except: - return (True, "error", sys.exc_info()[1]) - - return (False, "ok", "") - - ## Show some info about the scanner and SANE. - def info(self): - entrybuffer = self.device_info_text.get_buffer() - entrybuffer.delete(entrybuffer.get_start_iter(),entrybuffer.get_end_iter()) - # redirect print to device textbuffer - logdev = logging(entrybuffer) - sys.stdout = logdev - - print 'SANE version: %s' % repr(self.version).replace('array',' ') - print "\n" - print 'Available devices:' - for device in self.devices: - print device[1]+" "+device[2] - print "\n" - print 'Selected device: '+self.devices[self.devnr][1]+" "+self.devices[self.devnr][2] - print "\n" - print 'SaneDev object= %s' % self.scanner - print "\n" - print 'Device parameters: %s' % repr(self.params).replace('array',' ') - print "\n" - print 'Device options:' - for opt in self.opts: - print "%s: %s" % (opt[2], opt[3]) - - - def retry(self): - try: - self.scanner.close() - except: - pass - sane.exit() - self.run() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |