ホームページ > バックエンド開発 > PHPチュートリアル > ランダムコードを生成するPHPのコード

ランダムコードを生成するPHPのコード

WBOY
リリース: 2016-07-25 09:07:14
オリジナル
1279 人が閲覧しました
  1. /*

  2. * 説明: ランダム コードを生成し、ランダム コードをグラフィカルに表示します。
  3. */

  4. $ViewRandomCode = mt_rand(1000,10000);

  5. session_start();

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

  8. {
  9. global $sx, $sy, $pixels;

  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. $ピクセル[$ofs + 5] = chr($b);
  24. }
  25. // 数字図形の関数を生成
  26. functiondraw2digits($x, $y, $number)
  27. {
  28. draw_digit($x, $y, ( int) ($number / 10));
  29. draw_digit($x + 11, $y, $number % 10);
  30. }

  31. functiondraw_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++、$b *= 2)
  37. {
  38. if (($b & $digit) == $b) {
  39. $j = $i * 4 ;
  40. $x0 = $lines[$j] * $m + $x;
  41. $y0 = $lines[$j + 1] * $m + $y;
  42. $x1 = $lines[$j + 2] * $m + $x;
  43. $y1 = $lines[$j + 3] * $m + $y;
  44. if ($x0 == $x1) {
  45. $ofs = 3 * ($sx * $y0 + $ x0);
  46. for ($h = $y0; $h $pixels[$ofs] = chr(0);
  47. $pixels[$ofs + 1] = chr(0);
  48. $pixels[$ofs + 2] = chr(0);
  49. }
  50. } else {
  51. $ofs = 3 * ($sx * $y0 + $x0);
  52. for ($w = $x0; $w $pixels[$ofs++] = chr(0);
  53. $pixels[$ofs++] = chr(0);
  54. $pixels[$ofs++] = chr(0);
  55. }
  56. }
  57. }
  58. }
  59. }< ;/p>
  60. //画像に文字を追加します

  61. function add_chunk($type)
  62. {
  63. global $result, $data, $chunk, $crc_table;

  64. // 長さ: 4 字节: 用来计算チャンク
  65. // チャンクタイプ: 4 字节
  66. // チャンクデータ: 長さバイト
  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. // バイトチャンク[4..len-1]で CRC チェックサムを計算します

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

  85. $chunk 。 = chr(($crc >> 24) & 255);

  86. $chunk .= chr(($crc >> 16) & 255);
  87. $chunk .= chr(($crc >> 8) & 255);
  88. $chunk .= chr($crc & 255);

  89. // 結果を$result中に追加

  90. $result .= $chunk;
  91. }< /p>
  92. //主程序

  93. $sx = 55;

  94. $sy = 21;
  95. $pixels = rand(100,99990)%2?”qwer”: ”";

  96. // 充填

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

  110. $h = (int)($checknum/100);
  111. $m = (int)($checknum%100);
  112. $digits = array(95, 5, 118, 117, 45, 121, 123, 69, 127, 125);
  113. $lines = array(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);

  114. draw2digits (4, 2, $h);

  115. draw2digits(30, 2, $m);

  116. // set_4pixel(0, 0, 0, 26, 7);

  117. // set_4pixel( 0, 0, 0, 26, 13);

  118. // 创建循環环冗余码校验表

  119. $z = -306674912; // = 0xedb88320
  120. for ($n = 0; $n $c = $n;
  121. for ($k = 0; $k $c2 = ($c >> 1) & 0×7fffffff;
  122. if ($c & 1) $c = $z ^ ($c2); else $c = $c2;
  123. }
  124. $crc_table[$n] = $c;
  125. }

  126. // PNG ファイルの署名

  127. $result = Pack(“c*”, 137,80,78,71,13,10,26,10);

  128. < ;p>// IHDR チャンク データ:
  129. // 幅: 4 バイト
  130. // 高さ: 4 バイト
  131. // ビット深度: 1 バイト (RGB 値ごとに 8 ビット)
  132. // カラー タイプ: 1 バイト (2 = RGB) )
  133. // 圧縮方式: 1 バイト (0 = 収縮/膨張)
  134. // フィルター方式: 1 バイト (0 = 適応フィルター)
  135. // インターレース方式: 1 バイト (0 = インターレースなし)
  136. $data = Pack( “c*”, ($sx >> 24) & 255,
  137. ($sx >> 16) & 255,
  138. ($sx >> 8) & 255,
  139. $sx & 255,
  140. ($sy >> 24) & 255,
  141. ($sy >> 16) & 255,
  142. ($sy >> 8) & 255,
  143. $sy & 255,
  144. 8,
  145. 2,
  146. 0,
  147. 0,
  148. 0);
  149. add_chunk(“IHDR”);

  150. // 以下不戦乱翻译、请自行参考

  151. // scanline:
  152. // フィルターバイト: 0 = なし
  153. // ラインの RGB バイト
  154. // スキャンラインは「zlib」、メソッド 8 (RFC-1950) で圧縮されます:
  155. // 圧縮メソッド/フラグ コード: 1 バイト ($78 = メソッド 8、32k ウィンドウ) )
  156. // 追加のフラグ/チェック ビット: 1 バイト ($01: FCHECK = 1、FDICT = 0、FLEVEL = 0)
  157. // 圧縮データ ブロック: n バイト
  158. // 1 つのブロック (RFC-1951):
  159. //ビット 0: BFINAL: 1 (最後のブロックの場合)
  160. // ビット 1 および 2: BTYPE: 0 (圧縮なしの場合)
  161. // 次の 2 バイト: LEN (LSB ファースト)
  162. // 次の 2 バイト: LEN の 1 の補数
  163. // LEN バイトの非圧縮データ
  164. // チェック値: 4 バイト (非圧縮データの Adler-32 チェックサム)
  165. //
  166. $len = ($sx * 3 + 1) * $sy;
  167. $data = Pack(“c* ”, 0×78, 0×01,
  168. 1,
  169. $len & 255,
  170. ($len >> 8) & 255,
  171. 255 – ($len & 255),
  172. 255 – (($len >> 8) & 255));
  173. $start = strlen($data);
  174. $i2 = 0;
  175. for ($h = 0; $h < $sy; $h++) {
  176. $data .= chr(0);
  177. for ($w = 0; $w < $sx * 3; $w++) {
  178. $data .= $pixels[$i2++];
  179. }
  180. }

  181. // バイト data[start..len-1]

  182. $s1 = 1;
  183. を使用して Adler32 チェックサムを計算します$s2 = 0;
  184. for ($n = $start; $n $s1 = ($s1 + ord($data[$n])) % 65521;
  185. $s2 = ($s2 + $s1) % 65521;
  186. }
  187. $adler = ($s2

    $data .= chr(($adler >> 24) & 255);

  188. $data .= chr(($adler >> 16) & 255 );
  189. $data .= chr(($adler >> 8) & 255);
  190. $data .= chr($adler & 255);
  191. add_chunk(“IDAT”);

  192. < ;p>// IEND: PNG ファイルの終わりをマークします
  193. $data = “”;
  194. add_chunk(“IEND”);

  195. // 列印图象

  196. echo($result);

  197. ?>

复制代


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート