Уведомления

Группа в Telegram: @pythonsu

#1 Июль 20, 2017 12:00:05

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  1  -
Профиль   Отправить e-mail  

Работа со сканером. Чем можно воспользоваться? Нашёл только pytwain, но не могу разобраться.

Не загоняется он в QPixmap
pixmap = QPixmap.fromWinHBITMAP(handle) ошибок не выдаёт, но и никакой картинки в нём не появляется.

Офлайн

#2 Июль 20, 2017 13:16:52

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  1  -
Профиль   Отправить e-mail  

Работа со сканером. Чем можно воспользоваться? Нашёл только pytwain, но не могу разобраться.

Python-sane намного понятнее. Но мне нужен Windows

Офлайн

#3 Июль 20, 2017 13:52:14

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Работа со сканером. Чем можно воспользоваться? Нашёл только pytwain, но не могу разобраться.

Pluto
Python-sane намного понятнее. Но мне нужен Windows
а это не подходит?
https://github.com/openpaperwork/pyinsane
вроде заявлена поддержка WIA 2 для висты и выше?



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#4 Июль 20, 2017 13:58:29

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  1  -
Профиль   Отправить e-mail  

Работа со сканером. Чем можно воспользоваться? Нашёл только pytwain, но не могу разобраться.

А эта зараза требует установить Visual Studio 2010. Иначе компилятор в винде какой-то не тот, и не туда, и не тем.
Так-то при установке пакета он пишет, что ему нужен лишь Microsoft Visual C++ 10.0.
Но он и так установлен.
Пошарив по Интернетам, нашёл то решение, что выше изложил. Мне к моей малюсенькой программке на питоне вдовесок забабахивать на комп целую студию?

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

Enjoykin вспомнился: Безысходность…

Офлайн

#5 Июль 20, 2017 16:12:10

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Работа со сканером. Чем можно воспользоваться? Нашёл только pytwain, но не могу разобраться.

Хмм похоже 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)

Офлайн

#6 Июль 21, 2017 11:25:42

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  1  -
Профиль   Отправить e-mail  

Работа со сканером. Чем можно воспользоваться? Нашёл только pytwain, но не могу разобраться.

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

Может, если ещё осталось желание, подскажете, как его заставить выполнить ещё одно сканирование.
Если после
source.RequestAcquire(0, 0)
result = source.XferImageNatively()
Сделать снова RequestAcquire(0, 0), то опять всякие ошибки посыплются.

Офлайн

#7 Июль 21, 2017 12:37:27

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Работа со сканером. Чем можно воспользоваться? Нашёл только pytwain, но не могу разобраться.

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_())



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#8 Июль 21, 2017 12:53:22

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  1  -
Профиль   Отправить e-mail  

Работа со сканером. Чем можно воспользоваться? Нашёл только pytwain, но не могу разобраться.

Огромное спасибо. Теперь можно и пытаться нарисовать программу.

Офлайн

#9 Июль 21, 2017 13:16:11

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Работа со сканером. Чем можно воспользоваться? Нашёл только pytwain, но не могу разобраться.

Pluto скчайте свежую версию отсюда, https://github.com/denisenkom/pytwain там вроде чтото фиксили.
А та что на https://pypi.python.org/pypi/pytwain четрехлетней давности.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#10 Июль 24, 2017 09:02:56

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  1  -
Профиль   Отправить e-mail  

Работа со сканером. Чем можно воспользоваться? Нашёл только pytwain, но не могу разобраться.

Н-да. И в этой, типа поправленной версии, даже их собственный пример (simple_tk.py) не может сделать повторное сканирование.

Отредактировано Pluto (Июль 24, 2017 09:28:20)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version