談PHP識別24位BMP的驗證碼_PHP教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:解讀PHP數組讀取的操作
      PHP基本上就是一種數組語言。時常要進行大量的數組循環操作,主要有兩種方式,一種是foreach,另一種是while,到底哪種好哪種壞一直有爭論,雖然我很早就意識到了這個問題,但是一直沒有細究,懵懂的感覺一直持續到現在,為了以后能節省點CPU時間,下面總結

      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("%03d",$R).sprintf("%03d",$G).sprintf("%03d",$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啦..

      至于詳細的代碼我就不貼了.因為代碼是賣給人家的.為了保障人家的利益.所以大家也不要開口跟我要了..思路我已經給出來了.相信你是可以寫出來的.

      分享:解讀PHP開發者必備的發展要素
      語法結構教科書上的知識和實際的程序設計是有區別的,真正的知識要在實際的開發中獲得。每個php的開發人員在開始開發web應用程序之前,都應該熟悉下面的五件事: 1. 框架 框架可以說是php開發中的一個最重要的問題。用php開發web應用程序時有很多方法,有很

      來源:模板無憂//所屬分類:PHP教程/更新時間:2009-08-26
      相關PHP教程