国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP識別24位BMP的驗證碼

2024-05-04 21:52:00
字體:
來源:轉載
供稿:網友

PHP識別24位BMP的驗證碼

今天接到個活,就是識別一個簡單的驗證碼,這個驗證碼異常的簡單,具有很少的干擾信息,所以只要拿到信息進行比較.很容易就可以識別,但是一切不會那么一帆風順的..也許是對于我來說吧.我覺得我干什么都十分曲折...

這個驗證碼圖片是用ASP生成的..理所當然成了BMP格式.

但是對于PHP來說.這是個軟傷.因為PHP的GD庫根本就沒把BMP納入在內.雖然有wbmp但是還是不一樣的.

所以就google了一下.結果又讓我一陣喜悅.竟然有個現成的識別256色BMP的類..十分激動..有這個還不是白拿錢的事啊!!

結果又是令人失望的..256色的BMP跟24位色的根本是兩個概念..這就意味這我得重新寫了..

看來沒有現成的類庫和函數.只能自己寫了.用最最原始的fopen.分析BMP頭.一個一個字節的讀了.

所有又去google了BMP的24位色的頭分析..那么長的文章...立馬就失望了..

所以無聊就去翻手冊..眼睜睜的看著有imagecreatefromgif imagecreatefromjpeg imagecreatefrompng imagecreatefromwbmp等等.就是沒有imagecreatefrombmp

于是突發奇想.去google一下imagecreatefrombmp會是什么結果..果然不出我所料.已經有達人寫出了這個函數..

這個函數的過程是這樣的..用fopen打開文件.一個字節一個字節的讀出來..先讀BMP頭.然后逐行讀像素.再用imagecreatetruecolor新建立個圖像.把剛讀出來的像素逐個再畫到剛才創建的圖片上.
最后返回這個圖像的resource .

估計大家跟我一樣.一開始就被這么長的函數嚇到了.其實不用怕.分析一下.我們是要分析24位色的BMP.所以上面函數的大部分語句我們都不用.if($biBitCount==24)以下的才是關鍵..

$B=freadbyte($f);

$G=freadbyte($f);

$R=freadbyte($f);

這三行就是讀取像素了..我們需要的就是把每個像素放到數組中.這樣就容易被操作了.

$array[] = sprintf("d",$R).sprintf("d",$G).sprintf("d",$B);

這樣我們就把每個像素放到$array這個數組中了.但是這樣還不夠.因為我們得識別像素.所以我是這樣想的.把白色的(255255255)改為0.其他顏色改為1.這是因為我這個驗證碼比較簡單.而且干擾顏色非常少..

最后形成的$array就類似這樣的了

0001111000 0001111000 0001111000 0000101000

0010000100 0010000100 0010000100 0000100000

0010000100 0010000100 0010000100 0000100000

0010110100 0000000100 0000000100 0000100000

0010110100 0000101000 0000000100 0000100000

0010110100 0000110000 0011000100 0000010000

0010110100 0000001000 0010111000 0000010000

0010000100 0010000100 0010000000 0010001000

0011000100 0010000110 0010000000 0010001000

0001111000 0001111000 0011111100 0011111100

當然 之所以形成這個樣子是我輸出的時候處理過的.
很容易看的清楚.這是0357..

有的人會問為什么是倒的?這是因為BMP在存儲圖像的時候就是倒著存放的.比較BT.
不過這個不必擔心.我們也不用給他費勁正過來.因為我們是要做比較.只要這個對比碼也是倒著的就可以了.

為了更清楚的說明白這個數組是怎么存儲內容的.我給大家詳細的描述一下.就按照上面的例子.

數組下標0 1 2 3 4 5 6 7 8 9 10..... ... 39

存儲內容0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 第一行

數組下標40 41 .... ...79

存儲內容0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 第二行

為了省略我就不寫了..很容易看出來.這是個一維的數組.一共有399個元素..但是為了識別驗證碼.我們得把其中的每個數字取出來.

0-9 40-49 80-89 ...為一組

10-19 50-59 90-99 ...為一組

20-29 60-69 100-109...為一組

30-39 70-79 110-119..為一組

你可以自己寫個算法..

這樣整理出來后..是一個具有4個元素的數組.
每個元素都有100位0和1的數字.

元素取出來了.要跟誰比較呢??對.我們得找個參照物才行..
找參照物就是體力活了..
返回到上面的過程..不斷的刷新驗證碼..直到把0-9都出現了.針對每個.記下他的樣子比如說0是這樣

0001111000

0010000100

0010000100

0010110100

0010110100

0010110100

0010110100

0010000100

0011000100

0001111000

變成字符串.0就是這樣了0001111000001000010000100001000010110100001011010000101101000010110100001000010000110001000001111000
也就是上面的按照順序放在一行.

0-9都記下來后.我們可以放到一個數組中,就叫$key吧.

這樣的話跟我們生成出來的元素就一一對應了.

下面就要開始比較了.

循環是免不了的.比較的技巧是用similar_text和參照物逐個比較.把相思百分比放到一個數組中.
然后把這個數組中最大的那個百分比取出來.所對應的索引值(此索引值不是自動生成的)就是我們識別出來的數字了.
下面的代碼值描述重要的部分

然后取出$maxArr這個最大的索引值.就是我們識別出來的數字了.

到此驗證碼算是識別完成了.

但是部署給用戶的時候.發現他的機器上用fopen打開遠程URL.只有30%的幾率能獲取到.其他的情況都是HTTP Request failed...
更改了很多方法還是不成功.結果我的解決辦法是.
用CURL把驗證碼保存到本地.然后fopen打開本地圖片就100%OK啦..

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金湖县| 特克斯县| 湛江市| 芒康县| 潍坊市| 长春市| 贡觉县| 鸡泽县| 鸡东县| 伊吾县| 临安市| 金阳县| 深圳市| 咸阳市| 崇州市| 湘阴县| 英吉沙县| 郯城县| 德惠市| 邢台市| 融水| 体育| 通江县| 五莲县| 云霄县| 徐州市| 宝鸡市| 乌兰察布市| 云安县| 隆林| 大名县| 中超| 桑日县| 弥渡县| 宜兰县| 扶风县| 德化县| 沿河| 朝阳县| 湘潭县| 保山市|