用python控制扫描仪的尝试
用扫描仪软件控制扫描相机,拍出的画面是被压缩过的,因为软件按照A4幅面来扫描,与我扫描相机4*12厘米的比例完全不符,但是官方或者第三方扫描仪软件都无法单独改变XY轴的分辨率,扫描范围的修改也是有限的,因此就需要一些编程技巧来解决问题,这里我用的是python 3.67。

这张图片的分辨率为:11339*10200,拉到ps里,把宽度改成31339之后,画面才稍微正常一些,但是这样会损失一部分画质(其实扩放很大,也看不出来)
twain是第三方开源的扫描仪驱动程序,它可以让你不必掌握复杂的编程知识,就能灵活的控制扫描仪,软件的安装和调试,我参考了这篇文章:https://blog.csdn.net/runwuwusheng1230/article/details/121490944
文章最下面给出的twain_module.py是我需要的,把它拷贝下来放在python的这个文件夹里:C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\Lib\site-packages
按照文章里的案例测试扫描仪,虽然软件的安装并不复杂,但安装成功,也不保证就能顺利的实现控制,这点我没有深入研究,只是通过换电脑来解决的。。。
平台搭建好之后,就可以进入参数设置环节,
还是twain_module.py这个文件,拉到最下面,找到如下代码:
if dpi:
sd.set_capability(ICAP_XRESOLUTION, TWTY_FIX32, dpi)
sd.set_capability(ICAP_YRESOLUTION, TWTY_FIX32, dpi)
修改dpi,就能改变x或者y轴的扫描分辨率
对了,扫描脚本还没贴出来,其实很简单,就两行:
import twain_module
twain_module.acquire(r'./test.bmp',dpi=200,pixel_type='gray',frame=(0.0,0.0,8.27,9.9))
括号里的参数分别代表:定义照片名和格式,dpi(按我的经验,这个地方最好不要动),像素类型:灰度;彩色;黑白,照片坐标(左,上,右,下)单位是英寸。
照片坐标后两个数,就是在软件理解下,照片的“纵向尺寸和横向尺寸”,由于扫描相机去除了反射镜,扫描区域的宽度从A4的210mm变成了扫描CCD的长度,就是40mm,扫描长度由A4纸的297mm变成了我买的轨道行程,就是120mm,但是这twain目的仍然是让你去扫描文件而不是拍照的,所以在扫描尺寸的设置上,还得按照A4纸的尺寸进行转换,毕竟驱动电机用的还是原装的那套机制,步进电机的步距角,步数,都没变,我就假装它扫的还是A4那么大的纸张,只是通过修改照片的长度,让电机多转几圈,这样我就可以实现3:1的画幅比例,官方软件是没法这么玩的,你只能通过损失宽度来实现3:1画幅,一根CCD上的像素没法被充分利用,而且画幅也变小了,经过测试,长度为9.9英寸时,我的第一代导轨正好走满,但是我换了新导轨之后,这个长度还要再加一点。所以frame这个参数的目的,放在扫描相机上,就是让CCD走满导轨的行程。
图片实际的比例,还是通过修改dpi来实现的,针对爱普生v30系列扫描仪,X轴dpi为1800,Y轴dpi为600是比较合适的组合,这个dpi是不能随意写的,如果改成X=1200,Y=400,或者X=2400,Y=800,都有可能报错,具体原因我没有研究过。
运行这个脚本,得到的图片,直接就是3:1比例的宽画幅,不需要再到ps里修改分辨率了(还需要旋转)。
但是也有一些问题:
bmp格式的图片在ps图层里显示为“索引”,需要选择“图像-模式-RGB颜色”之后,图片才可以编辑
无法使用IR作为光源类型,如果不设置光源类型,拍出来的灰度图会有重影,像拍摄彩色图片那样,是三个通道的直接叠加
/* ICAP_LIGHTSOURCE values (LS_ means Light Source) */
#define TWLS_RED 0
#define TWLS_GREEN 1
#define TWLS_BLUE 2
#define TWLS_NONE 3
#define TWLS_WHITE 4
#define TWLS_UV 5
#define TWLS_IR 6
pixel_type='gray'的灰度最高只能是8位,而官方或者vuescan都可以扫描16位灰度
关于这个问题,官网给出了解释:
ICAP_BITDEPTH,在twain 3.8或3.9版本里,对于灰度图,默认给的位宽都是8bit,如果要使用12,14,16bit位宽的话,另一个参数ICAP_XFERMECH 应该设置成 TWSX_MEMORY模式,它还有另外两个模式,TWSX_NATIVE, TWSX_FILE,默认值是TWSX_NATIVE,就是说扫描出来的原始数据先放扫描仪内存里的时候,才可以使用更高的位宽,这里我还没有找到现成的案例,暂时先不研究它了。
最后放一个epson官方的twain头文件解释,看这个可以解决twain编程里遇到的绝大部分问题:
https://www.epsondevelopers.com/twain-programming-guide-epson-scan/capability-reference/