本發(fā)明涉及圖片驗證碼的生成方法。
背景技術:
隨著互聯(lián)網(wǎng)技術的發(fā)展,人們工作、學習、生活越來越多的依賴于互聯(lián)網(wǎng)提供的資源。一些不法分子會利用于“網(wǎng)絡爬蟲”或“機器人程序”自動的訪問網(wǎng)絡資源,進行垃圾郵件的攻擊、注冊驗證短信攻擊、在線投票系統(tǒng)上的虛假投票、大量購買限購商品或車票以及對網(wǎng)站進行飽和攻擊。為了阻擋“網(wǎng)絡爬蟲”或“機器人程序”對網(wǎng)站資源的訪問,各種基于互聯(lián)網(wǎng)的系統(tǒng)通常會采用圖片驗證碼的方式進行驗證,如果用戶可以識別出驗證碼并輸入正確的內容那么允許繼續(xù)訪問系統(tǒng)資源,反之不允許繼續(xù)訪問。
隨著人工智能技術的快速發(fā)展,計算機程序已經(jīng)可以自動識別系統(tǒng)生成的圖片驗證碼。而為了防止圖片驗證碼被識別,現(xiàn)有的技術通常采用的手段是:變換字體、扭曲變形文字、加入雜點或色塊、拉伸平移文字以及加入干擾文字來防止計算機程序自動識別。由于目前的人工智能識別能力已經(jīng)很強,當前技術采用的方式會遇到一個兩難的境地:如果圖片驗證碼中的文字扭曲變形的不夠,那么計算機智能程序可以很容易的識別其內容,起不到防護目的;如果內容過度的變化扭曲,那么普通用戶也會難于識別出其中的內容,會把正常用戶也阻擋在系統(tǒng)之外。
因此需要提供一種新的圖片驗證碼的生成方法和裝置來解決現(xiàn)有問題,提高“網(wǎng)絡爬蟲”或“機器人程序”識別圖片驗證碼的難度的同時不阻擋普通用戶識別圖片驗證碼中的內容。
技術實現(xiàn)要素:
本發(fā)明的目的是為了解決現(xiàn)有技術提高“網(wǎng)絡爬蟲”或“機器人程序”識別圖片驗證碼的難度的同時也阻擋了普通用戶識別圖片驗證碼中內容的缺點,而提出一種圖片驗證碼的生成方法。
一種圖片驗證碼的生成方法具體是按照以下步驟進行的:
步驟一、輸入驗證碼GIF圖片顯示需要的文本信息,輸入驗證碼GIF圖片的寬度W和高度H,輸入驗證碼GIF圖片所對應的幀數(shù);
所述寬度W取值范圍為100≤W≤1000;高度H取值范圍為100≤H≤1000;GIF為動態(tài)圖片;
步驟二、生成一個寬度為W和高度為H的白色背景的空白圖片(寬度高度是方法使用者輸入的),將文本信息以黑色繪制在白色背景的空白圖片上,將繪制后的圖片轉換為由0和1構成的模板二維數(shù)組;
步驟三、生成一個寬度為W和高度為H的256級灰度圖片,在該256級灰度圖片上的隨機位置繪制LineNum條寬度隨機、顏色隨機的直線,將繪制后的256級灰度圖片轉換為由0到255數(shù)值構成的紋理二維數(shù)組;
所述LineNum為行數(shù);
步驟四、隨機生成二維方向矢量v,建立圖片列表,根據(jù)二維方向矢量v、模板二維數(shù)組和圖片列表輸出驗證碼GIF圖片所對應的幀數(shù)個圖片,將所有輸出驗證碼GIF圖片所對應的幀數(shù)個圖片放入圖片列表之中;
步驟五、將圖片列表中的驗證碼GIF圖片所對應的幀數(shù)個圖片轉換為GIF動態(tài)圖片文件,將GIF動態(tài)圖片文件作為圖片驗證碼輸出。
本發(fā)明的有益效果為:
針對現(xiàn)有技術存在的問題,本發(fā)明提供一種圖片驗證碼的生成方法,通過該方法可以生成一個由動態(tài)GIF圖片構成的圖片驗證碼,該驗證碼內部包含的文字內容不需要經(jīng)過變形或扭曲,正常的用戶觀察該圖片會有在滿是雜色紋理背景下浮現(xiàn)出文字的感覺,識別其中內容較為容易;而人工智能程序加載該圖片之后,在該動態(tài)圖片的任何一幀畫面均是由雜亂的線條構成的,其中不包含驗證文字信息,程序無法識別其中的內容。
利用該方法生成的圖片驗證碼,“網(wǎng)絡爬蟲”或“機器人程序”較難識別,而普通用戶較容易識別;利用該技術可以有效的幫助各種基于互聯(lián)網(wǎng)的系統(tǒng)阻擋“網(wǎng)絡爬蟲”或“機器人程序”的隨意訪問,而不阻擋普通使用者;可以極大的提高基于互聯(lián)網(wǎng)的系統(tǒng)的安全性。經(jīng)測試普通使用者在注視10秒之內便可以識別出圖片中包含的文字,而基于SHIFT、神經(jīng)網(wǎng)、支持向量機等智能算法的人工智能程序均無法識別出驗證碼內部的文字。
附圖說明
圖1為本發(fā)明流程圖;
圖2為本發(fā)明構成模板二維數(shù)組流程圖;
圖3為本發(fā)明構成紋理二維數(shù)組流程圖;
圖4為本發(fā)明構建圖片列表過程流程圖;
圖5為本發(fā)明圖片驗證碼輸出結果流程圖。
圖6為本發(fā)明實施例生成的白色圖片文件,將文本內容寫在白色的背景上的示意圖;
圖7為本發(fā)明實施例生成的256級灰度圖;
圖8為本發(fā)明實施例生成的一種文字浮在紋理之上的動態(tài)示意圖。
具體實施方式
具體實施方式一:結合圖1說明本實施方式,本實施方式的一種圖片驗證碼的生成方法具體是按照以下步驟進行的:
步驟一、輸入驗證碼GIF圖片顯示需要的文本信息text,輸入驗證碼GIF圖片的寬度W和高度H,輸入驗證碼GIF圖片所對應的幀數(shù)frameNumber;
所述寬度W取值范圍為100≤W≤1000;高度H取值范圍為100≤H≤1000;GIF圖片為動態(tài)圖片;
文本信息是方法使用者(比如網(wǎng)站的服務程序、安全管理程序)輸入的,比如網(wǎng)站需要顯示的驗證碼;
步驟二、生成一個寬度width為W和高度height為H的白色背景的空白圖片(寬度高度是方法使用者輸入的),將文本信息以黑色繪制在白色背景的空白圖片上,將繪制后的圖片轉換為由0和1構成的模板二維數(shù)組MaskArray;
步驟三、生成一個寬度width為W和高度height為H的256級灰度圖片,在該256級灰度圖片上的隨機位置繪制LineNum條寬度隨機、顏色隨機的直線,將繪制后的256級灰度圖片轉換為由0到255數(shù)值構成的紋理二維數(shù)組BmpArray;
所述LineNum為行數(shù);
步驟四、隨機生成二維方向矢量v,建立圖片列表BmpList,根據(jù)二維方向矢量v、模板二維數(shù)組MaskArray和圖片列表BmpArray輸出驗證碼GIF圖片所對應的幀數(shù)frameNumber個圖片,將所有輸出驗證碼GIF圖片所對應的幀數(shù)個圖片放入圖片列表BmpList之中;
步驟五、將圖片列表BmpList中的驗證碼GIF圖片所對應的幀數(shù)frameNumber個圖片轉換為GIF動態(tài)圖片文件GIFFile,將GIF動態(tài)圖片文件GIFFile作為圖片驗證碼輸出。
具體實施方式二:結合圖2說明本實施方式,本實施方式與具體實施方式一不同的是:所述步驟二中生成一個寬度width為W和高度height為H的白色背景的空白圖片(寬度高度是方法使用者輸入的),將文本信息以黑色繪制在白色背景的空白圖片上,將繪制后的圖片轉換為由0和1構成的模板二維數(shù)組MaskArray;具體過程為:
步驟二一、生成一個寬度width為W和高度height為H的白色背景的空白圖片文件WhiteBMP;
步驟二二、將文本信息以黑色方式繪制在一個寬度為W和高度為H的白色背景的空白圖片文件WhiteBMP上;
步驟二三、建立一個寬度width為W和高度height為H的模板二維數(shù)組MaskArray;
步驟二四、對于繪制后的寬度為W和高度為H的白色背景的空白圖片文件WhiteBMP中的每一個像元,如果該像元為白色,則模板二維數(shù)組MaskArray的對應位置(MashArray的元素個數(shù)與WhiteBMP圖片的像元個數(shù)完全相同,MashArray的每一個元素與WhiteBMP的像元一一對應。)元素賦值為0;如果該像元為黑色,則模板二維數(shù)組MaskArray的對應位置元素賦值為1。
其它步驟及參數(shù)與具體實施方式一相同。
具體實施方式三:本實施方式與具體實施方式一或二不同的是:所述步驟三中生成一個寬度width為W和高度height為H的256級灰度圖片,在該256級灰度圖片上的隨機位置繪制LineNum條寬度隨機、顏色隨機的直線,將繪制后的256級灰度圖片轉換為由0到255數(shù)值構成的紋理二維數(shù)組BmpArray;具體過程為:
LineNum的值通過如下公式計算:
LineNum=(width+height)×20。
其它步驟及參數(shù)與具體實施方式一或二相同。
具體實施方式四:結合圖3說明本實施方式,本實施方式與具體實施方式一至三之一不同的是:所述步驟三中生成一個寬度width為W和高度height為H的256級灰度圖片,在該256級灰度圖片上的隨機位置繪制LineNum條寬度隨機、顏色隨機的直線,將繪制后的256級灰度圖片轉換為由0到255數(shù)值構成的紋理二維數(shù)組BmpArray;具體過程為:
步驟三一、生成一個寬度width為W和高度height為H的256級灰度圖片GrayBMP;
步驟三二、將條寬度隨機、顏色隨機的直線的個數(shù)計數(shù)器LineCounter的值置為LineNum;
步驟三三、當LineCounter大于0時轉到步驟三四,否則轉到步驟三七;
所述LineCounter為條寬度隨機、顏色隨機的直線的個數(shù)計數(shù)器;
步驟三四、生成6個在區(qū)間(0,1)范圍內的隨機變量r1,r2,r3,r4,r5,r6;
步驟三五、在一個寬度width為W和高度height為H的256級灰度圖片GrayBMP上繪制一條直線,該直線的起點坐標為(r1×height,r2×width),終點坐標為(r1×height+r3×20,r2×width+r4×20),寬度為2+r5×5,顏色灰度為r6×255;
所述r1×height為直線的起點橫坐標,r2×width為直線的起點縱坐標;r1×height+r3×20為直線的終點橫坐標,r2×width+r4×20直線的終點縱坐標;height為高度,width為寬度;
步驟三六、LineCounter自減1,轉到步驟三三;
步驟三七、建立一個寬度width為W和高度height為H的紋理二維數(shù)組BmpArray;
步驟三八、對于一個寬度width為W和高度height為H的256級灰度圖片GrayBMP的每一個像元,取出每一個像元的灰度值,將灰度值存儲在紋理二維數(shù)組BmpArray的對應位置(GrayBmp是按照行和列存儲的圖片,而BmpArray是按照行和列存儲的二維數(shù)組,它們的元素個數(shù)一致,按照行和列進行對應。)的元素中。
其它步驟及參數(shù)與具體實施方式一至三之一相同。
具體實施方式五:結合圖4說明本實施方式,本實施方式與具體實施方式一至四之一不同的是:所述步驟四中隨機生成二維方向矢量v,建立圖片列表BmpList,根據(jù)二維方向矢量v、模板二維數(shù)組MaskArray和圖片列表BmpArray輸出驗證碼GIF圖片所對應的幀數(shù)frameNumber個圖片,將所有輸出驗證碼GIF圖片所對應的幀數(shù)個圖片放入圖片列表BmpList之中;具體過程為:
步驟四一、隨機生成二維方向矢量v=(v1,v2),其中v1,v2均為-2到2之間的隨機整數(shù);
所述v1為二維方向矢量的橫坐標,v2為二維方向矢量的縱坐標;
步驟四二、建立圖片列表BmpList,將圖片列表BmpList置為空;
將步驟三得到的紋理二維數(shù)組BmpArray復制三次,獲得三個數(shù)組暫存數(shù)組1TempArray1、暫存數(shù)組2TempArray2和暫存數(shù)組3TempArray3;
建立一個空白的寬度width為W和高度height為H的圖片F(xiàn)rameBMP;
步驟四三、將幀的個數(shù)計數(shù)器frameCounter的值置為輸入驗證碼GIF圖片所對應的幀數(shù)frameNumber;
步驟四四、當幀的個數(shù)計數(shù)器frameCounter大于0則轉到步驟四五,否則轉到步驟四十;
步驟四五、按照二維方向矢量v的方向將暫存數(shù)組1TempArray1數(shù)組中的所有元素移動并存回暫存數(shù)組1TempArray1數(shù)組之中;
暫存數(shù)組1TempArray1數(shù)組中元素的原始位置坐標為(origX,origY),移動后的位置坐標為(disX,disY);
步驟四六、按照二維方向矢量v的反方向將暫存數(shù)組2TempArray2數(shù)組中的所有元素移動并存回暫存數(shù)組2TempArray2數(shù)組之中;
暫存數(shù)組2TempArray2數(shù)組中元素的原始位置坐標為(origX,origY),移動后的位置坐標為(disX,disY);
步驟四七、對于模板二維數(shù)組MaskArray中的每一個元素,如果該元素值為0那么將暫存數(shù)組1TempArray1數(shù)組中每個位置元素值復制到暫存數(shù)組3TempArray3的對應位置,如果該元素值為1那么將暫存數(shù)組2TempArray2數(shù)組中每個位置元素值復制到暫存數(shù)組3TempArray3的對應位置;
步驟四八、將暫存數(shù)組3TempArray3數(shù)組轉換為灰度圖片存儲到FrameBMP之中,并將FrameBMP加入到圖片列表BmpList之中;
步驟四九、幀的個數(shù)計數(shù)器frameCounter自減1,轉到步驟四四;
步驟四十、結束圖片列表BmpList建立過程。
其它步驟及參數(shù)與具體實施方式一至四之一相同。
具體實施方式六:本實施方式與具體實施方式一至五之一不同的是:所述步驟四五中移動后的位置坐標(disX,disY)計算公式表示為:
disX=(origX+v1+2×height)%height;
disY=(origY+v2+2×width)%width;
所述v1為二維方向矢量的橫坐標,v2為二維方向矢量的縱坐標,%為求余數(shù)操作;disX為移動后的位置坐標的橫坐標,disY為移動后的位置坐標的縱坐標。
其它步驟及參數(shù)與具體實施方式一至五之一相同。
具體實施方式七:本實施方式與具體實施方式一至六之一不同的是:所述步驟四六中移動后的位置坐標(disX,disY)計算公式表示為:
disX=(origX-v1+2×height)%height;
disY=(origY-v2+2×width)%width;
所述v1為二維方向矢量的橫坐標,v2為二維方向矢量的縱坐標,%為求余數(shù)操作;disX為移動后的位置坐標的橫坐標,disY為移動后的位置坐標的縱坐標。
其它步驟及參數(shù)與具體實施方式一至六之一相同。
具體實施方式八:結合圖5說明本實施方式,本實施方式與具體實施方式一至七之一不同的是:所述步驟五中將圖片列表BmpList中的驗證碼GIF圖片所對應的幀數(shù)frameNumber個圖片轉換為GIF動態(tài)圖片文件GIFFile,將GIF動態(tài)圖片文件GIFFile作為圖片驗證碼輸出;具體過程為:
步驟五一、建立寬度width為W和高度height為H的GIF動態(tài)圖片文件GIFFile;
步驟五二、指定GIF動態(tài)圖片文件GIFFile每一幀的顯示持續(xù)時間為0.2秒;
步驟五三、將圖片列表BmpList中的每一個圖片轉換為GIF圖片的一幀,加入到GIF動態(tài)圖片文件GIFFile之中;
步驟五四、將GIF動態(tài)圖片文件GIFFile作為圖片驗證碼輸出。
其它步驟及參數(shù)與具體實施方式一至七之一相同。
采用以下實施例驗證本發(fā)明的有益效果:
實施例一:
本實施例一種圖片驗證碼的生成方法具體是按照以下步驟制備的:
1.假設步驟一輸入的text為“TOM123”,幀數(shù)frameNumber為100,寬度width=214,高度height=71;
2.在步驟二,生成了白色圖片文件WhiteBMP,將文本內容寫在白色的背景上,如圖6;
對應WhiteBMP.bmp這個文件;
3.在步驟三生成的256級灰度圖片GrayBMP,其內容如圖7:
對應GrayBMP.bmp這個文件
4.在步驟四生成的BmpList包含100個文件,對應BmpList里面100個圖片文件
5.生成的GIFFile,對應GIFFile.gif這個文件,這個文件動態(tài)播放的時候由于模板二維數(shù)組MaskArray里面為0的像元和為1的像元移動方向相對,給觀察者一種文字浮在紋理之上的感覺,如圖8,使用時需要播放GIFFile.gif,圖8為動態(tài)圖。
本發(fā)明還可有其它多種實施例,在不背離本發(fā)明精神及其實質的情況下,本領域技術人員當可根據(jù)本發(fā)明作出各種相應的改變和變形,但這些相應的改變和變形都應屬于本發(fā)明所附的權利要求的保護范圍。