欢迎光临散文网 会员登陆 & 注册

用python控制扫描仪的尝试

2023-08-14 22:23 作者:repalm  | 我要投稿

用扫描仪软件控制扫描相机,拍出的画面是被压缩过的,因为软件按照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/






用python控制扫描仪的尝试的评论 (共 条)

分享到微博请遵守国家法律