Установка координат сканирования в настройках устройства на pyinsane
Я использую утилиту командной строки Sane (scanimage
) для сканирования пленки с блока прозрачности моего сканера. Вот команда, которую я использовал с успехом:
scanimage --device-name pixma:04A9190D \
--source 'Transparency Unit' \
--resolution "4800" \
--format "tiff" \
--mode "color" \
-l "80.6" -x "56.2" -t "25.8" -y "219.2" \
> scan.tiff
Я решил переместить это в код Python, используя pyinsane
для того, чтобы включить дальнейшую интеграцию с моим рабочим процессом обработки изображений. Это должно предположительно дать следующее в коде Python:
import pyinsane.abstract as pyinsane
device = pyinsane.get_devices()[0]
device.options['resolution'].value = 4800
device.options['mode'].value = 'Color'
device.options['source'].value = 'Transparency Unit'
# Setting coordinates to non-integers fails
device.options['tl-y'].value = 25.8
device.options['tl-x'].value = 80.6
device.options['br-y'].value = 219.2
device.options['br-x'].value = 56.2
scan_session = device.scan(multiple=False)
try:
while True:
scan_session.scan.read()
except EOFError:
pass
image = scan_session.images[0]
Но мои первые испытания не увенчались успехом, потому что я не могу понять, как установить координаты сканирования pyinsane
, Как вы видите, я нашел подходящие варианты, но я не знаю, в каком подразделении они находятся. scanimage
принимает координаты в миллиметрах по умолчанию, но pyinsane
принимает только целые числа. Я пытался использовать координаты пикселей безрезультатно. Интересно, какие единицы измерения принимают параметры координат и правильно ли я их использую.
2 ответа
Описания опций pyinsane на самом деле говорят, что значения в миллиметрах:
Option: br-x
Title: Bottom-right x
Desc: Bottom-right x position of scan area.
Type: <class 'pyinsane.rawapi.SaneValueType'> : Fixed (2)
Unit: <class 'pyinsane.rawapi.SaneUnit'> : Mm (3)
Size: 4
Capabilities: <class 'pyinsane.rawapi.SaneCapabilities'> :[ Automatic, Soft_select, Soft_detect,]
Constraint type: <class 'pyinsane.rawapi.SaneConstraintType'> : Range (1)
Constraint: (0, 14160319, 0)
Value: 20
Но они не! Я разделил максимум диапазона для br-x
переменная шириной области сканирования моего сканера, и я получил число 65536 (что составляет 2^16). Установка координат в миллиметровое значение умноженная на 65536 работает. Может быть, эти значения определяют количество шагов шагового двигателя?
Также не то, что пока scanimage интерпретирует -x
а также -y
переключается как ширина и длина, и -l
а также -t
переключается как смещение, пиинсан принимает нижний правый х (br-x
), слева вверху y (tl-y
), так далее.
Pyinsane сообщает, что Sane сообщает, как есть. И Sane сообщает, что сообщают водители. По моему опыту, все драйверы не ведут себя точно так же, что может объяснить это странное устройство (другими словами, это может быть ошибка драйвера). Я никогда не беспокоился об устройстве раньше. Я проверю на своем сканере, что он говорит, когда у меня будет некоторое время..
В любом случае, я не уверен, почему он говорит "мм", потому что, по моему опыту, здесь единица измерения - это всегда пиксели (опять же, в документации сказано, что это может быть "мм", поэтому мне нужно проверить). Если вы хотите отсканировать определенный размер, вам нужно взглянуть на разрешение (точка на дюйм), а затем выполнить математические расчеты, чтобы определить размер в пикселях, который вы ожидаете.