node.js WEB開(kāi)發(fā)中圖片驗(yàn)證碼的實(shí)現(xiàn)方法
作者:
用node做web開(kāi)發(fā)很多都可能碰到需要驗(yàn)證碼的地方,之前在github上搜索,有一些比如node-captcha等的類庫(kù),都需要依賴第三方的圖形處理庫(kù)或者軟件,像我之前安裝cario這個(gè)圖形庫(kù)時(shí),真是費(fèi)了好大一番勁,但是其實(shí)我們只用到了這些圖形庫(kù)的一點(diǎn)點(diǎn)小功能,比如圖片的尺寸修改裁剪,或者生產(chǎn)驗(yàn)證碼。
先介紹一下CImg這個(gè)c++的圖形庫(kù)吧,CImg是一個(gè)跨平臺(tái)的C++的圖像處理庫(kù),提供了加載、處理、顯示、保存等一系列功能,最吸引人的地方是整個(gè)圖形庫(kù)就一個(gè)CImg.h這個(gè)文件,所以非常的便攜綠色環(huán)保,帶到哪里都可以進(jìn)行編譯使用,不用安裝一大推依賴。于是我就想利用這個(gè)CImg圖形庫(kù)做一個(gè)簡(jiǎn)單的demo,就從實(shí)現(xiàn)驗(yàn)證碼這個(gè)功能入手,當(dāng)然可以完全利用這個(gè)庫(kù)來(lái)做裁剪圖片等其他功能。
ccap模塊是基于CImg圖形庫(kù)的封裝,讓它可以供node使用,由于CImg圖形庫(kù)的便攜性,所以ccap模塊可以完全不依賴其他任何第三方圖形庫(kù)或者軟件而獨(dú)立工作,也就說(shuō)如果只是想要生成簡(jiǎn)單的驗(yàn)證碼,只要require這個(gè)ccap模塊即可。
1、安裝:
通用方法:npm install ccap
或者通過(guò)github下載,地址:https://github.com/DoubleSpout/ccap
注:安裝過(guò)程可能會(huì)出現(xiàn)錯(cuò)誤,請(qǐng)根據(jù)錯(cuò)誤提示安裝相應(yīng)依賴包
2、性能:
在2cpu的linux 64位服務(wù)器上生成驗(yàn)證碼速度可以達(dá)到1200次/秒,測(cè)試生成的圖片是BMP的,jpeg的圖片驗(yàn)證碼生成速度大約在600次/秒
3、聲明方法:
var ccap = require('ccap');
var captcha1 = ccap();
var captcha2 = ccap(width, height, offset);
var captcha3 = ccap({
width:256,//set width,default is 256
可以通過(guò)上述代碼實(shí)例化一個(gè)ccap類。 1、不傳任何參數(shù),全部使用默認(rèn)的參數(shù)進(jìn)行生成驗(yàn)證碼 2、只傳遞寬,高,偏移進(jìn)行實(shí)例化,調(diào)整圖片的大小,和圖片中文字的間隔 3、傳遞一個(gè)對(duì)象,除了寬,高和偏移,還傳遞了圖片質(zhì)量以及生成隨機(jī)數(shù)的方法,ccap模塊會(huì)根據(jù)自定義函數(shù)return的字符串作為圖片驗(yàn)證碼的內(nèi)容,默認(rèn)是0-9,A-Z的6位隨即字符串。
理論上可以生產(chǎn)很多不同的ccap的實(shí)例,而且他們之間互相沒(méi)有影響,所以即使是通過(guò)cluster開(kāi)啟多進(jìn)程的node同時(shí)生產(chǎn)驗(yàn)證碼也不存在互相鎖止的影響。
對(duì)于圖片質(zhì)量只對(duì)jpeg圖片有效,如果沒(méi)有安裝任何jpeg的lib庫(kù)的話,只能使用bmp未壓縮圖形了,體積比較大,但是生成速度比較快。
4、使用方法,get():
height:60,//set height,default is 60
offset:40,//set text spacing,default is 40
quality:100,//set pic quality,default is 50
generate:function(){//Custom the function to generate captcha text
//generate captcha text here
return text;//return the captcha text
}
});
實(shí)例化ccap類之后,會(huì)得到captcha對(duì)象,這個(gè)對(duì)象只有一個(gè)對(duì)外方法,get(),這個(gè)方法每次調(diào)用都會(huì)返回驗(yàn)證碼buffer和對(duì)應(yīng)的text字符串內(nèi)容,保存在數(shù)組里,類似這樣的結(jié)構(gòu):
["captcha text","picture buffer"]
5、一個(gè)簡(jiǎn)單的web例子:
var http = require('http');
var ccap = require('ccap')();//Instantiated ccap class
http.createServer(function (request, response) {
if(request.url == '/favicon.ico')return response.end('');//Intercept request favicon.ico
var ary = ccap.get();
var txt = ary[0];
var buf = ary[1];
response.end(buf);
console.log(txt);
}).listen(8124);
console.log('Server running at http://127.0.0.1:8124/');
注:有些代碼參數(shù)可根據(jù)自己的環(huán)境自行修改