Найти - Пользователи
Полная версия: Работа со сканером. Чем можно воспользоваться? Нашёл только pytwain, но не могу разобраться.
Начало » Python для новичков » Работа со сканером. Чем можно воспользоваться? Нашёл только pytwain, но не могу разобраться.
1 2 3
Pluto
Не загоняется он в QPixmap
pixmap = QPixmap.fromWinHBITMAP(handle) ошибок не выдаёт, но и никакой картинки в нём не появляется.
Pluto
Python-sane намного понятнее. Но мне нужен Windows
PEHDOM
Pluto
Python-sane намного понятнее. Но мне нужен Windows
а это не подходит?
https://github.com/openpaperwork/pyinsane
вроде заявлена поддержка WIA 2 для висты и выше?
Pluto
А эта зараза требует установить Visual Studio 2010. Иначе компилятор в винде какой-то не тот, и не туда, и не тем.
Так-то при установке пакета он пишет, что ему нужен лишь Microsoft Visual C++ 10.0.
Но он и так установлен.
Пошарив по Интернетам, нашёл то решение, что выше изложил. Мне к моей малюсенькой программке на питоне вдовесок забабахивать на комп целую студию?

Вдобавок, мне нужно чтобы моя программка работала и на windows xp тоже.

Enjoykin вспомнился: Безысходность…
PEHDOM
Хмм похоже pytwain кроме как в БМП не умеет сохранять, и хендлы что оно выдает, годяться только для него самого… Походу когда оно сканирует то на выходе получае хендл на обьект в глобальной памяти ОС. можете посмотреть функцию twain._dib_write.
Как перевести хендл на обьект в памяти в хендл для картинки я пока ХЗ.
хотя можно “пропатчить” pytwain, там походу ошибка. , Достаточно зменить io.StringIO на io.BytesIO в twain._dib_write чтобы не было ексепшина при отсутвующем имени файла, и оно будет возвращать строку котороую можно скрмить QPixmap-у да и PIL чтото такое должен уметь.

итоговый скрипт будет :
 import twain, sys
# получаем список имеющихся источников для сканирования
sm = twain.SourceManager(1) # некий менеджер в свойствах которого будет этот источник
source_list = sm.source_list # получили список источников
print(source_list)
#sm.close()
#exit(0)
# создаём объект для работы с источником и указываем ему этот самый источник
source = sm.open_source(source_list[0].encode()) # encode() обязателен. Без него не воспринимает.
# установка параметра dpi
dpi = 150
source.set_capability(twain.ICAP_XRESOLUTION, twain.TWTY_FIX32, dpi)
source.set_capability(twain.ICAP_YRESOLUTION, twain.TWTY_FIX32, dpi)
# установка цветности
pixel_type_map = {'bw'   :twain.TWPT_BW,
                  'gray' :twain.TWPT_GRAY,
                  'color':twain.TWPT_RGB}
pixel_type = pixel_type_map['color']
source.set_capability(twain.ICAP_PIXELTYPE, twain.TWTY_UINT16, pixel_type)
# старт сканирования
source.RequestAcquire(0, 0)
print('fxfp',source.image_info)
result = source.XferImageNatively()
handle, count = result
raw_data = twain.DIBToBMFile(handle) # получаем файлв виде строки
from PyQt4 import QtGui
from PyQt4.QtGui import QPixmap
from PyQt4.QtCore import QByteArray
app = QtGui.QApplication(sys.argv)
Mw = QtGui.QWidget()
Mw.show()
layout = QtGui.QVBoxLayout(Mw)
Mw.setLayout(layout)
lab = QtGui.QLabel('tabName', Mw)
layout.addWidget(lab)
pixmap = QPixmap()
pixmap.loadFromData(QByteArray(raw_data)) # загоняем скартинку  в пиксмап
source.close()
sm.close()
print('ps', pixmap.size())
lab.setPixmap(pixmap)
sys.exit(app.exec_())

Pluto
Очень благодарен за уделённое моей персоне внимание.

Может, если ещё осталось желание, подскажете, как его заставить выполнить ещё одно сканирование.
Если после
source.RequestAcquire(0, 0)
result = source.XferImageNatively()
Сделать снова RequestAcquire(0, 0), то опять всякие ошибки посыплются.
PEHDOM
Pluto
Может, если ещё осталось желание, подскажете, как его заставить выполнить ещё одно сканирование.
сам автор советует для этого таки исапользовать acquire_natively. Но он (acquire_natively), я так понимаю, вызывает окошко драйвера сканера где можно сделать прескан, установить дпи, цветность, и прочие настройки, и потом, как нажимаеть “скан”, должен в функцию after возвращать зендл на отканированую картинку. Правда у меня почемкто не хочет сканироват, при нажатии кнопки “скан” ничего не происходит.
НО я так понимаю вам нужно не это. Чтобы сделать несколько сканов подряд из пайтона, нужно закрыть source и опять открыть.
както так:
 import twain, sys
# получаем список имеющихся источников для сканирования
sm = twain.SourceManager(1) # некий менеджер в свойствах которого будет этот источник
source_list = sm.source_list # получили список источников
print(source_list)
#sm.close()
#exit(0)
from PyQt4 import QtGui
from PyQt4.QtGui import QPixmap
from PyQt4.QtCore import QByteArray
app = QtGui.QApplication(sys.argv)
size = 256 # будем уменьшать наши картинки чтобы влезли...
Mw = QtGui.QWidget()
Mw.show()
layout = QtGui.QHBoxLayout(Mw)
Mw.setLayout(layout)
for i in range(3):
    # создаём объект для работы с источником и указываем ему этот самый источник
    source = sm.open_source(source_list[0].encode()) # encode() обязателен. Без него не воспринимает.
    # установка параметра dpi
    dpi = 150
    source.set_capability(twain.ICAP_XRESOLUTION, twain.TWTY_FIX32, dpi)
    source.set_capability(twain.ICAP_YRESOLUTION, twain.TWTY_FIX32, dpi)
    # установка цветности
    pixel_type_map = {'bw'   :twain.TWPT_BW,
                      'gray' :twain.TWPT_GRAY,
                      'color':twain.TWPT_RGB}
    pixel_type = pixel_type_map['color']
    source.set_capability(twain.ICAP_PIXELTYPE, twain.TWTY_UINT16, pixel_type)
    # старт сканирования
    source.RequestAcquire(0, 0)
    result = source.XferImageNatively()
    handle, count = result
    print(result)
    raw_data = twain.DIBToBMFile(handle) # получаем файлв виде строки
    pixmap = QPixmap()
    pixmap.loadFromData(QByteArray(raw_data)) # загоняем скартинку  в пиксмап
    pixmap = pixmap.scaledToHeight(size, 1)
    print('ps', pixmap.size())
    source.close()
    lab = QtGui.QLabel('', Mw)
    layout.addWidget(lab)
    lab.setPixmap(pixmap)
sm.close()
sys.exit(app.exec_())
Pluto
Огромное спасибо. Теперь можно и пытаться нарисовать программу.
PEHDOM
Pluto скчайте свежую версию отсюда, https://github.com/denisenkom/pytwain там вроде чтото фиксили.
А та что на https://pypi.python.org/pypi/pytwain четрехлетней давности.
Pluto
Н-да. И в этой, типа поправленной версии, даже их собственный пример (simple_tk.py) не может сделать повторное сканирование.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB