php產生隨機碼的一段程式碼

WBOY
發布: 2016-07-25 09:07:14
原創
1246 人瀏覽過
  1. /*

  2. * 說明:產生隨機碼,並以圖形方式顯示隨機碼。
  3. */
  4. $ViewRandomCode = mt_rand(1000,10000);

  5. session_start();

  6. $_SESSION['checksum'] = $ViewRandomCode;
  7. function set_4pixel($r, $g, $b, $x, $y)

  8. {
  9. 全域$sx, $sy , $pixels; p>
  10. $ofs = 3 * ($sx * $y + $x);

  11. $pixels[$ofs] = chr($r);
  12. $pixels[$ofs + 1 ] = chr($g);
  13. $pixels[$ofs + 2] = chr($b);
  14. $pixels[$ofs + 3] = chr($r );
  15. $pixels[ $ofs + 4] = chr($g);
  16. $pixels[$ofs + 5] = chr($b);
  17. $ofs += 3 * $sx;
  18. $pixels[$ofs] = chr($r);
  19. $pixels[$ofs + 1] = chr($g);
  20. $pixels[$ofs + 2] = chr($b );
  21. $pixels[$ofs + 3] = chr($r);
  22. $pixels[$ofs + 4] = chr($g);
  23. $pixels[$ofs + 5] = chr($b);
  24. }
  25. //產生數位影像的函數
  26. function draw2digits($x, $y, $number)
  27. {
  28. draw_digit($x, $y) , (int) ($number / 10));
  29. draw_digit($x + 11, $y, $number % 10);
  30. }
  31. 函數draw_digit( $x , $y, $digit)

  32. {
  33. 全域$sx, $sy, $pixels, $digits, $lines;
  34. $digit = $digits[ $digit];

  35. $m = 8;
  36. for ($b = 1, $i = 0; $i {
  37. if (($b & $digit) == $b) {
  38. $j = $i * 4;
  39. $x0 = $lines [$j] * $m + $x;
  40. $y0 = $lines[$j + 1] * $m + $y;
  41. $x1 = $lines[$j + 2] * $m + $x;
  42. $y1 = $lines[$j + 3] * $m + $ y;
  43. if ($x0 == $x1) {
  44. $ofs = 3 * ($sx * $ y0 + $x0);
  45. for ($h = $y0; $h $pixels[$ofs] = chr( 0);
  46. $pixels[$ofs + 1] = chr(0);
  47. $pixels[$ofs + 2] = chr(0);
  48. }
  49. } else {
  50. $ofs = 3 * ($sx * $y0 + $x0);
  51. for ($w = $x0; $w $pixels[$ofs++] = chr (0);
  52. $pixels[$ofs++] = chr(0);
  53. $pixels [$ ofs++] = chr(0);
  54. }
  55. }
  56. }
  57. }
  58. }
  59. //將文字加入表格中

  60. function add_chunk($type)
  61. {
  62. global $result, $data, $chunk , $crc_table;
  63. // chunk : 為層

  64. // length: 4 字節: 用於計算chunk
  65. // chunk type: 4 位元組
  66. // chunk data: length bytes
  67. // CRC: 4 位元組: 循環冗餘碼校驗
  68. // 複製資料並建立CRC 校驗和
  69. $len = strlen($data);
  70. $chunk = pack(“c*”, ($len >> 24) & 255,
  71. ($ len >> 16) & 255,
  72. ($len>> 8) & 255,
  73. $len & 255);
  74. $chunk .= $type;
  75. $chunk .= $ data;
  76. //計算CRC校驗和,位元組為chunk[4..len-1]

  77. $z = 16777215;
  78. $z |= 255 $c = $z;
  79. 對於($n = 4; $n $c8 = ($c >> 8) & 0xffffff;
  80. $c = $crc_table[($c ^ ord($chunk[$n])) & 0xff] ^ $c8;
  81. }
  82. $crc = $c ^ $z;
  83. $chunk .= chr(($crc >> 24) & 255);

  84. $chunk . = chr(($crc >> 16) & 255 );
  85. $chunk .= chr(($crc >> 8) & 255);
  86. $chunk .= chr($crc & 255);
  87. ;// 將結果加到$result中

  88. $result .= $chunk;
  89. }
  90. //主程式

  91. $sx = 55;

  92. $sy = 21;
  93. $pixels = rand(100,99990)%2?”qwer”:””;
  94. / /填充

  95. for ($h = 0; $h {
  96. for ($w = 0; $w {
  97. $r = 100 / $sx * $w + 155;
  98. $g = 100 / $sy * $h + 155;
  99. $b = 255 – (100 / ($sx + $sy) * ($w + $h));
  100. $pixels .= chr($r);
  101. $pixels .= chr($g);
  102. $pixels .= chr($b);
  103. }
  104. }
  105. $checknum = isset($ViewRandomCode)?$ViewRandomCode:1234;

  106. $h = (int)($checknum/100);
  107. $m = (int)($checknum%100);
  108. $digits = array(95, 5, 118, 117, 45, 121, 123, 69, 127, 125);
  109. $lines = 隊列( 1, 1, 1, 2, 0, 1, 0, 2, 1, 0, 1, 1, 0, 0, 0, 1, 0, 2, 1, 2, 0, 1, 1, 1, 0, 0, 1, 0);
  110. draw2digits(4, 2, $h);

  111. draw2digits(30, 2, $m);
  112. // set_4pixel(0, 0, 0, 26, 7);

  113. // set_4pixel(0, 0, 0, 26, 13);
  114. ;// 建立循環校驗碼校驗表

  115. $z = -306674912; // = 0xedb88320
  116. for ($n = 0; $n $c = $n;
  117. for ($k = 0; $k $c2 = ($c >> 1) & 0×7fffffff;
  118. if ($c & 1) $c = $z ^ ($c2);否則$c = $c2;
  119. }
  120. $crc_table[$n] = $c;
  121. }
  122. // PNG檔案簽章

  123. $result = pack(“c*”, 137,80,78,71,13,10,26,10); p>
  124. // IHDR 區塊資料:

  125. // 寬度:4 位元組
  126. // 高度:4 位元組
  127. // 位元深度:1 位元組(每個RGB 值8 位元)
  128. // 顏色類型:1 位元組(2 = RGB)
  129. // 壓縮方法:1 位元組(0 = deflate/inflate)
  130. // 過濾方法:1 位元組(0 = 自適應過濾)
  131. // 隔行掃描方式:1 位元組(0 = 無隔行掃描​​)
  132. $data = pack(“c*”, ($sx >> 24) & 255,
  133. ($sx >> 16 ) & 255,
  134. ($sx >> 8) & 255,
  135. $sx & 255,
  136. ($sy >> 24) & 255,
  137. ($sy > > 16 ) & 255,
  138. ($sy >> 8) & 255,
  139. $sy & 255,
  140. 8,
  141. 2,
  142. 0,
  143. 0,
  144. 0) ;
  145. add_chunk(“IHDR”);
  146. //以下不敢亂翻譯,請自行參考

  147. // scanline:
  148. / / 過濾位元組: 0 =無
  149. // 行的RGB 位元組
  150. // 掃描線使用「zlib」壓縮,方法8 (RFC-1950):
  151. // 壓縮方法/標誌代碼: 1 個位元組($78 =方法8,32k 視窗)
  152. // 附加標誌/檢查位元:1 個位元組($01: FCHECK = 1, FDICT = 0, FLEVEL = 0)
  153. // 壓縮資料區塊:n 個位元組
  154. // 一個塊(RFC-1951):
  155. // 位元0:BFINAL:1 表示最後一個區塊
  156. // 位元1 和2:BTYPE:0 表示無壓縮
  157. // 下一個2個位元組:LEN(LSB在前)
  158. //接下來的2個位元組:LEN的補碼
  159. // LEN位元組未壓縮資料
  160. //校驗值:4字節(未壓縮資料的Adler-32校驗和)
  161. //
  162. $len = ($sx * 3 + 1) * $sy;
  163. $data = pack(“c*”, 0 ×78, 0×01,
  164. 1,
  165. $len & 255,
  166. ($len >> 8) & 255,
  167. 255 – ($len & 255),
  168. 255 – (($len >> 8) & 255));
  169. $start = strlen($data);
  170. $i2 = 0;
  171. for ($h = 0; $h $data .= chr(0);
  172. for ($w = 0; $w $data .= $pixels[$i2++] ;
  173. }
  174. }
  175. // 計算Adler32 校驗和,位元組為data[start..len-1]

  176. $s1 = 1;
  177. $s2 = 0;
  178. for ($n = $start; $n $s1 = ($s1 + ord($data[$n])) % 65521;
  179. $s2 = ($s2 + $s1) % 65521;
  180. }
  181. $adler = ($s2
  182. $ data .= chr(($adler >> 24) & 255);

  183. $data .= chr(($adler >> 24) & 255);
  184. $data .= chr(($adler >> 255); 16) & 255);
  185. $data .= chr(($adler >> 8) & 255);
  186. $data .= chr($adler & 255);
  187. add_chunk(“ IDAT ”);
  188. // IEND:標記PNG 檔案的結尾

  189. $data = “”;
  190. add_chunk(“IEND”);> ;
  191. //印刷快照
  192. echo($result);

  193. ?>
複製程式碼


來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板