Форум сайта python.su
Не загоняется он в QPixmap
pixmap = QPixmap.fromWinHBITMAP(handle) ошибок не выдаёт, но и никакой картинки в нём не появляется.
Офлайн
Python-sane намного понятнее. Но мне нужен Windows
Офлайн
Plutoа это не подходит?
Python-sane намного понятнее. Но мне нужен Windows
[code python][/code]
Офлайн
А эта зараза требует установить Visual Studio 2010. Иначе компилятор в винде какой-то не тот, и не туда, и не тем.
Так-то при установке пакета он пишет, что ему нужен лишь Microsoft Visual C++ 10.0.
Но он и так установлен.
Пошарив по Интернетам, нашёл то решение, что выше изложил. Мне к моей малюсенькой программке на питоне вдовесок забабахивать на комп целую студию?
Вдобавок, мне нужно чтобы моя программка работала и на windows xp тоже.
Enjoykin вспомнился: Безысходность…
Офлайн
Хмм похоже 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_())
[code python][/code]
Отредактировано PEHDOM (Июль 21, 2017 10:41:48)
Офлайн
Очень благодарен за уделённое моей персоне внимание.
Может, если ещё осталось желание, подскажете, как его заставить выполнить ещё одно сканирование.
Если после
source.RequestAcquire(0, 0)
result = source.XferImageNatively()
Сделать снова RequestAcquire(0, 0), то опять всякие ошибки посыплются.
Офлайн
Plutoсам автор советует для этого таки исапользовать acquire_natively. Но он (acquire_natively), я так понимаю, вызывает окошко драйвера сканера где можно сделать прескан, установить дпи, цветность, и прочие настройки, и потом, как нажимаеть “скан”, должен в функцию after возвращать зендл на отканированую картинку. Правда у меня почемкто не хочет сканироват, при нажатии кнопки “скан” ничего не происходит.
Может, если ещё осталось желание, подскажете, как его заставить выполнить ещё одно сканирование.
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_())
[code python][/code]
Офлайн
Огромное спасибо. Теперь можно и пытаться нарисовать программу.
Офлайн
Pluto скчайте свежую версию отсюда, https://github.com/denisenkom/pytwain там вроде чтото фиксили.
А та что на https://pypi.python.org/pypi/pytwain четрехлетней давности.
[code python][/code]
Офлайн
Н-да. И в этой, типа поправленной версии, даже их собственный пример (simple_tk.py) не может сделать повторное сканирование.
Отредактировано Pluto (Июль 24, 2017 09:28:20)
Офлайн