在pyinsane

时间:2016-09-11 11:58:13

标签: python scanning sane 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

我决定使用pyinsane将其移至Python代码,以便进一步与我的图像处理工作流程集成。这应该在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 个答案:

答案 0 :(得分:1)

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可以正常工作。也许这些值定义了步进电机的步数?

扫描图像将-x-y开关解释为宽度和长度,-l-t切换为偏移时,pyinsane采用右下角x (br-x),左上角y(tl-y)等

答案 1 :(得分:0)

Pyinsane报道了Sane报道的内容。 Sane报告司机报告的内容。根据我的经验,所有的驱动程序都没有完全相同的方式,这可以解释这个奇怪的单位(换句话说,它可能是一个驱动程序的错误)。我之前从未真正担心过这个单位。我有时间会检查扫描仪上的内容。

无论如何我不确定它为什么说“mm”,因为根据我的经验,这里的单位实际上总是像素(再次,文档说它可以是'mm',所以我需要检查)。 如果要扫描特定大小,您应该查看分辨率(每英寸点数),然后进行数学运算以确定您期望的像素大小。