在 pyinsane 的设备选项中设置扫描坐标
Setting scan coordinates in device options on 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
只采用整数。我试过使用像素坐标无济于事。我想知道坐标参数采用什么单位,以及我是否按正确的顺序使用它们。
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
开关解释为偏移量,但 pyinsane 需要底部 -右 x (br-x
)、左上 y (tl-y
) 等
Pyinsane 按原样报告 Sane 报告的内容。 Sane 报告了 drivers 报告的内容。根据我的经验,所有 driver 的行为方式并不完全相同,这可以解释这个奇怪的单元(换句话说,它可能是 driver 的错误)。我以前从来没有真正担心过这个单位。我会在有空的时候检查我的扫描仪它说的是什么..
无论如何我不确定为什么它说 'mm',因为根据我的经验,这里的单位实际上总是像素(同样,文档说它可以是 'mm',所以我需要去检查)。
如果您想扫描特定尺寸,您应该查看分辨率(每英寸点数),然后计算出您期望的像素尺寸。
我使用 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
只采用整数。我试过使用像素坐标无济于事。我想知道坐标参数采用什么单位,以及我是否按正确的顺序使用它们。
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
开关解释为偏移量,但 pyinsane 需要底部 -右 x (br-x
)、左上 y (tl-y
) 等
Pyinsane 按原样报告 Sane 报告的内容。 Sane 报告了 drivers 报告的内容。根据我的经验,所有 driver 的行为方式并不完全相同,这可以解释这个奇怪的单元(换句话说,它可能是 driver 的错误)。我以前从来没有真正担心过这个单位。我会在有空的时候检查我的扫描仪它说的是什么..
无论如何我不确定为什么它说 'mm',因为根据我的经验,这里的单位实际上总是像素(同样,文档说它可以是 'mm',所以我需要去检查)。 如果您想扫描特定尺寸,您应该查看分辨率(每英寸点数),然后计算出您期望的像素尺寸。