用python控制掃描儀的嘗試
用掃描儀軟件控制掃描相機(jī),拍出的畫面是被壓縮過的,因?yàn)檐浖凑誂4幅面來掃描,與我掃描相機(jī)4*12厘米的比例完全不符,但是官方或者第三方掃描儀軟件都無法單獨(dú)改變XY軸的分辨率,掃描范圍的修改也是有限的,因此就需要一些編程技巧來解決問題,這里我用的是python 3.67。

這張圖片的分辨率為:11339*10200,拉到ps里,把寬度改成31339之后,畫面才稍微正常一些,但是這樣會損失一部分畫質(zhì)(其實(shí)擴(kuò)放很大,也看不出來)
twain是第三方開源的掃描儀驅(qū)動程序,它可以讓你不必掌握復(fù)雜的編程知識,就能靈活的控制掃描儀,軟件的安裝和調(diào)試,我參考了這篇文章:https://blog.csdn.net/runwuwusheng1230/article/details/121490944
文章最下面給出的twain_module.py是我需要的,把它拷貝下來放在python的這個文件夾里:C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\Lib\site-packages
按照文章里的案例測試掃描儀,雖然軟件的安裝并不復(fù)雜,但安裝成功,也不保證就能順利的實(shí)現(xiàn)控制,這點(diǎn)我沒有深入研究,只是通過換電腦來解決的。。。
平臺搭建好之后,就可以進(jìn)入?yún)?shù)設(shè)置環(huán)節(jié),
還是twain_module.py這個文件,拉到最下面,找到如下代碼:
if dpi:
??????????????? sd.set_capability(ICAP_XRESOLUTION, TWTY_FIX32, dpi)?
??????????????? sd.set_capability(ICAP_YRESOLUTION, TWTY_FIX32, dpi)??
修改dpi,就能改變x或者y軸的掃描分辨率
對了,掃描腳本還沒貼出來,其實(shí)很簡單,就兩行:
import twain_module
twain_module.acquire(r'./test.bmp',dpi=200,pixel_type='gray',frame=(0.0,0.0,8.27,9.9))
括號里的參數(shù)分別代表:定義照片名和格式,dpi(按我的經(jīng)驗(yàn),這個地方最好不要動),像素類型:灰度;彩色;黑白,照片坐標(biāo)(左,上,右,下)單位是英寸。
照片坐標(biāo)后兩個數(shù),就是在軟件理解下,照片的“縱向尺寸和橫向尺寸”,由于掃描相機(jī)去除了反射鏡,掃描區(qū)域的寬度從A4的210mm變成了掃描CCD的長度,就是40mm,掃描長度由A4紙的297mm變成了我買的軌道行程,就是120mm,但是這twain目的仍然是讓你去掃描文件而不是拍照的,所以在掃描尺寸的設(shè)置上,還得按照A4紙的尺寸進(jìn)行轉(zhuǎn)換,畢竟驅(qū)動電機(jī)用的還是原裝的那套機(jī)制,步進(jìn)電機(jī)的步距角,步數(shù),都沒變,我就假裝它掃的還是A4那么大的紙張,只是通過修改照片的長度,讓電機(jī)多轉(zhuǎn)幾圈,這樣我就可以實(shí)現(xiàn)3:1的畫幅比例,官方軟件是沒法這么玩的,你只能通過損失寬度來實(shí)現(xiàn)3:1畫幅,一根CCD上的像素沒法被充分利用,而且畫幅也變小了,經(jīng)過測試,長度為9.9英寸時(shí),我的第一代導(dǎo)軌正好走滿,但是我換了新導(dǎo)軌之后,這個長度還要再加一點(diǎn)。所以frame這個參數(shù)的目的,放在掃描相機(jī)上,就是讓CCD走滿導(dǎo)軌的行程。
圖片實(shí)際的比例,還是通過修改dpi來實(shí)現(xiàn)的,針對愛普生v30系列掃描儀,X軸dpi為1800,Y軸dpi為600是比較合適的組合,這個dpi是不能隨意寫的,如果改成X=1200,Y=400,或者X=2400,Y=800,都有可能報(bào)錯,具體原因我沒有研究過。
運(yùn)行這個腳本,得到的圖片,直接就是3:1比例的寬畫幅,不需要再到ps里修改分辨率了(還需要旋轉(zhuǎn))。
但是也有一些問題:
bmp格式的圖片在ps圖層里顯示為“索引”,需要選擇“圖像-模式-RGB顏色”之后,圖片才可以編輯
無法使用IR作為光源類型,如果不設(shè)置光源類型,拍出來的灰度圖會有重影,像拍攝彩色圖片那樣,是三個通道的直接疊加
/* 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位灰度
關(guān)于這個問題,官網(wǎng)給出了解釋:
ICAP_BITDEPTH,在twain 3.8或3.9版本里,對于灰度圖,默認(rèn)給的位寬都是8bit,如果要使用12,14,16bit位寬的話,另一個參數(shù)ICAP_XFERMECH 應(yīng)該設(shè)置成 TWSX_MEMORY模式,它還有另外兩個模式,TWSX_NATIVE,?TWSX_FILE,默認(rèn)值是TWSX_NATIVE,就是說掃描出來的原始數(shù)據(jù)先放掃描儀內(nèi)存里的時(shí)候,才可以使用更高的位寬,這里我還沒有找到現(xiàn)成的案例,暫時(shí)先不研究它了。
最后放一個epson官方的twain頭文件解釋,看這個可以解決twain編程里遇到的絕大部分問題:
https://www.epsondevelopers.com/twain-programming-guide-epson-scan/capability-reference/