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

首頁 > 開發(fā) > PHP > 正文

談PHP識別24位BMP的驗(yàn)證碼

2024-05-04 21:52:18
字體:
供稿:網(wǎng)友

PHP識別24位BMP的驗(yàn)證碼

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

這個驗(yàn)證碼圖片是用ASP生成的..理所當(dāng)然成了BMP格式.

但是對于PHP來說.這是個軟傷.因?yàn)镻HP的GD庫根本就沒把BMP納入在內(nèi).雖然有wbmp但是還是不一樣的.

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

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

看來沒有現(xiàn)成的類庫和函數(shù).只能自己寫了.用最最原始的fopen.分析BMP頭.一個一個字節(jié)的讀了.

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

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

于是突發(fā)奇想.去google一下imagecreatefrombmp會是什么結(jié)果..果然不出我所料.已經(jīng)有達(dá)人寫出了這個函數(shù)..

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

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

$B=freadbyte($f);

$G=freadbyte($f);

$R=freadbyte($f);

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

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

這樣我們就把每個像素放到$array這個數(shù)組中了.但是這樣還不夠.因?yàn)槲覀兊米R別像素.所以我是這樣想的.把白色的(255255255)改為0.其他顏色改為1.這是因?yàn)槲疫@個驗(yàn)證碼比較簡單.而且干擾顏色非常少..

最后形成的$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

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

有的人會問為什么是倒的?這是因?yàn)锽MP在存儲圖像的時候就是倒著存放的.比較BT.
不過這個不必?fù)?dān)心.我們也不用給他費(fèi)勁正過來.因?yàn)槲覀兪且霰容^.只要這個對比碼也是倒著的就可以了.

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

數(shù)組下標(biāo)0 1 2 3 4 5 6 7 8 9   10.....                                                       ...  39

存儲內(nèi)容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  第一行

數(shù)組下標(biāo)40 41 ....                                                                           ...79

存儲內(nèi)容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    第二行

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

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個元素的數(shù)組.
每個元素都有100位0和1的數(shù)字.

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

0001111000

0010000100

0010000100

0010110100

0010110100

0010110100

0010110100

0010000100

0011000100

0001111000

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

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

這樣的話跟我們生成出來的元素就一一對應(yīng)了.

下面就要開始比較了.

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

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

到此驗(yàn)證碼算是識別完成了.

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

至于詳細(xì)的代碼我就不貼了.因?yàn)榇a是賣給人家的.為了保障人家的利益.所以大家也不要開口跟我要了..思路我已經(jīng)給出來了.相信你是可以寫出來的.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 南木林县| 闸北区| 台湾省| 兴宁市| 铜陵市| 景东| 定南县| 黄浦区| 黄梅县| 凤庆县| 安平县| 南皮县| 东阳市| 永寿县| 上林县| 黄龙县| 湖北省| 和林格尔县| 赤水市| 徐汇区| 枝江市| 库尔勒市| 衡阳县| 永春县| 烟台市| 肇庆市| 历史| 察隅县| 晴隆县| 赣州市| 阜阳市| 卢湾区| 赫章县| 房山区| 仁化县| 格尔木市| 福州市| 永福县| 汝州市| 仁寿县| 汶川县|