-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathImageScanner.py
More file actions
152 lines (121 loc) · 5.08 KB
/
ImageScanner.py
File metadata and controls
152 lines (121 loc) · 5.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#!/usr/bin/env python
# -*- coding: utf8 -*-
import pygtk
pygtk.require20()
import gtk
import gobject
from datetime import datetime
import os.path
import sys
import imagescanner
import imagescanner.events
if sys.platform in ('win32', 'cygwin'):
from imagescanner.backends.twain import twain as _twain
# imagescanner setup
imagescanner.settings.ENABLE_NET_BACKEND = False
imagescanner.settings.ENABLE_TEST_BACKEND = False
class ImageScanner(object):
def __init__(self):
builder = gtk.Builder()
builder.add_from_file('Resources/MainWindow.glade')
signals = { 'on_scanBtn_clicked' : self.on_scanBtn_clicked,
'on_loadBtn_clicked' : self.on_loadBtn_clicked }
builder.connect_signals(signals)
self.main_window = builder.get_object('mainWindow')
self.main_window.connect('destroy', gtk.main_quit)
self.scanner_combo = builder.get_object('scannerCombo')
self.target_dir_btn = builder.get_object('targetDirBtn')
self.dpi_combo = builder.get_object('dpiCombo')
self.format_combo = builder.get_object('formatCombo')
self.scanners = {}
self.main_window.show_all()
def main(self):
try:
gtk.main()
except BaseException as e:
# uklid
raise
def on_scanBtn_clicked(self, widget, data = None):
try:
self.main_window.set_sensitive(False)
scanner_name = self.__get_active_item(self.scanner_combo)
if scanner_name == None:
self.__show_error('Vyberte skener z nabídky.')
return
scanner = self.scanners[scanner_name]
dpi = self.__get_active_item(self.dpi_combo)
form = self.__get_active_item(self.format_combo)
target_dir = self.target_dir_btn.get_current_folder()
if target_dir == None:
self.__show_error('Vyberte cílový adresář.')
return
target_dir = target_dir.decode('utf8')
image = self.__scan_image(scanner, dpi)
self.__store_image(target_dir, image, form)
finally:
self.main_window.set_sensitive(True)
def on_loadBtn_clicked(self, widget, data = None):
try:
self.main_window.set_sensitive(False)
try:
self.__load_scanners()
except Exception as e:
self.__show_error('Chyba při načítání dostupných skenerů:\n\n' + str(e))
self.__set_scanners_to_model()
finally:
self.main_window.set_sensitive(True)
def __load_scanners(self):
iscan = imagescanner.ImageScanner()
scanners = iscan.list_scanners()
for scanner in scanners:
if scanner.name not in self.scanners:
self.scanners[scanner.name] = scanner
else:
self.scanners[scanner.id] = scanner
def __set_scanners_to_model(self):
if len(self.scanners) == 0:
return
model = self.scanner_combo.get_model()
for scanner_name in self.scanners.keys():
model.append([scanner_name])
def __show_error(self, message):
dialog = gtk.MessageDialog(parent=self.main_window, type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_OK, message_format=message)
dialog.run()
dialog.destroy()
def __get_active_item(self, combo):
model = combo.get_model()
active = combo.get_active()
if (active < 0):
return None
return model[active][0]
def __scan_image(self, scanner, dpi):
self.__set_scanner_settings(scanner, dpi)
image = scanner.scan(dpi)
self.__remove_scanner_settings(scanner)
return image
def __set_scanner_settings(self, scanner, dpi):
if sys.platform in ('win32', 'cygwin'):
def set_capability(ea):
dev = ea.event_data # scanner device
dev.SetCapability(_twain.ICAP_PIXELTYPE, _twain.TWTY_UINT16, _twain.TWPT_RGB)
elif sys.platform in ('linux2'):
def set_capability(ea):
dev = ea.event_data # scanner device
dev.resolution = int(dpi)
if set_capability:
scanner.bind(imagescanner.events.SCAN_BEFORE_EVENT, set_capability)
def __remove_scanner_settings(self, scanner):
if sys.platform in ('win32', 'cygwin', 'linux2'):
scanner.unbind(imagescanner.events.SCAN_BEFORE_EVENT)
def __store_image(self, target_dir, image, img_format):
path = self.__build_path(target_dir, img_format)
while os.path.exists(path):
path = self.__build_path(target_dir, img_format)
image.save(path, img_format)
def __build_path(self, target_dir, img_format):
now = datetime.now()
filename = 'Scanned_at_%s.%s' % (now.strftime('%Y-%m-%d_%H-%M-%S'), img_format.lower())
return os.path.join(target_dir, filename)
if __name__ == '__main__':
gui = ImageScanner()
gui.main()