-
-
/* - * 説明: ランダム コードを生成し、ランダム コードをグラフィカルに表示します。
- */
$ViewRandomCode = mt_rand(1000,10000);
session_start();
- $_SESSION['checksum'] = $ViewRandomCode;< ;/p>
function set_4pixel($r, $g, $b, $x, $y)
- {
- global $sx, $sy, $pixels;
$ofs = 3 * ($sx * $y + $x);
- $pixels[$ofs] = chr($r);
- $pixels[$ofs + 1] = chr($g);
- $pixels[ $ofs + 2] = chr($b);
- $pixels[$ofs + 3] = chr($r);
- $pixels[$ofs + 4] = chr($g);
- $pixels[$ofs + 5] = chr($b);
- $ofs += 3 * $sx;
- $pixels[$ofs] = chr($r);
- $pixels[$ofs + 1] = chr($g);
- $pixels[$ofs + 2] = chr($b);
- $pixels[$ofs + 3] = chr($r);
- $pixels[$ofs + 4] = chr($g);
- $ピクセル[$ofs + 5] = chr($b);
- }
- // 数字図形の関数を生成
- functiondraw2digits($x, $y, $number)
- {
- draw_digit($x, $y, ( int) ($number / 10));
- draw_digit($x + 11, $y, $number % 10);
- }
functiondraw_digit($x, $y, $digit )
- {
- グローバル $sx, $sy, $pixels, $digits, $lines;
$digit = $digits[$digit];
- $m = 8;
- for ($ b = 1、$i = 0; $i++、$b *= 2)
- {
- if (($b & $digit) == $b) {
- $j = $i * 4 ;
- $x0 = $lines[$j] * $m + $x;
- $y0 = $lines[$j + 1] * $m + $y;
- $x1 = $lines[$j + 2] * $m + $x;
- $y1 = $lines[$j + 3] * $m + $y;
- if ($x0 == $x1) {
- $ofs = 3 * ($sx * $y0 + $ x0);
- for ($h = $y0; $h $pixels[$ofs] = chr(0);
- $pixels[$ofs + 1] = chr(0);
- $pixels[$ofs + 2] = chr(0);
- }
- } else {
- $ofs = 3 * ($sx * $y0 + $x0);
- for ($w = $x0; $w $pixels[$ofs++] = chr(0);
- $pixels[$ofs++] = chr(0);
- $pixels[$ofs++] = chr(0);
- }
- }
- }
- }
- }< ;/p>
//画像に文字を追加します
- function add_chunk($type)
- {
- global $result, $data, $chunk, $crc_table;
- // 長さ: 4 字节: 用来计算チャンク
- // チャンクタイプ: 4 字节
- // チャンクデータ: 長さバイト
- // CRC: 4 字节: 循環冗長校验
// データをコピーし、CRC チェックサムを作成します
- $len = strlen($data);
- $chunk = Pack(“c*”, ($len >> 24) & 255,
- ($len >> 16) & 255,
- ($len >> 8) & 255,
- $len & 255);
- $chunk .= $type;
- $chunk .= $ data;
// バイトチャンク[4..len-1]で CRC チェックサムを計算します
- $z = 16777215;
- $z |= 255 << 24;
- $c = $z;
- for ($n = 4; $n < strlen($chunk); $n++) {
- $c8 = ($c >> 8) & 0xffffff;
- $c = $crc_table[($c ^ ord($chunk[$n])) & 0xff] ^ $c8;
- }
- $crc = $c ^ $z;
$chunk 。 = chr(($crc >> 24) & 255);
- $chunk .= chr(($crc >> 16) & 255);
- $chunk .= chr(($crc >> 8) & 255);
- $chunk .= chr($crc & 255);
// 結果を$result中に追加
- $result .= $chunk;
- }< /p>
//主程序
$sx = 55;
- $sy = 21;
- $pixels = rand(100,99990)%2?”qwer”: ”";
// 充填
- for ($h = 0; $h < $sy; $h++)
- {
- for ($w = 0; $w < $sx ; $w++)
- {
- $r = 100 / $sx * $w + 155;
- $g = 100 / $sy * $h + 155;
- $b = 255 – (100 / ($sx + $sy) * ($w + $h));
- $pixels .= chr($r);
- $pixels .= chr($g);
- $pixels .= chr($b);
- }
- } p>
$checknum = isset($ViewRandomCode)?$ViewRandomCode:1234;
- $h = (int)($checknum/100);
- $m = (int)($checknum%100);
- $digits = array(95, 5, 118, 117, 45, 121, 123, 69, 127, 125);
- $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);
draw2digits (4, 2, $h);
- draw2digits(30, 2, $m);
// set_4pixel(0, 0, 0, 26, 7);
- // set_4pixel( 0, 0, 0, 26, 13);
// 创建循環环冗余码校验表
- $z = -306674912; // = 0xedb88320
- for ($n = 0; $n $c = $n;
- for ($k = 0; $k $c2 = ($c >> 1) & 0×7fffffff;
- if ($c & 1) $c = $z ^ ($c2); else $c = $c2;
- }
- $crc_table[$n] = $c;
- }
// PNG ファイルの署名
- $result = Pack(“c*”, 137,80,78,71,13,10,26,10);
- < ;p>// IHDR チャンク データ:
- // 幅: 4 バイト
- // 高さ: 4 バイト
- // ビット深度: 1 バイト (RGB 値ごとに 8 ビット)
- // カラー タイプ: 1 バイト (2 = RGB) )
- // 圧縮方式: 1 バイト (0 = 収縮/膨張)
- // フィルター方式: 1 バイト (0 = 適応フィルター)
- // インターレース方式: 1 バイト (0 = インターレースなし)
- $data = Pack( “c*”, ($sx >> 24) & 255,
- ($sx >> 16) & 255,
- ($sx >> 8) & 255,
- $sx & 255,
- ($sy >> 24) & 255,
- ($sy >> 16) & 255,
- ($sy >> 8) & 255,
- $sy & 255,
- 8,
- 2,
- 0,
- 0,
- 0);
- add_chunk(“IHDR”);
// 以下不戦乱翻译、请自行参考
- // scanline:
- // フィルターバイト: 0 = なし
- // ラインの RGB バイト
- // スキャンラインは「zlib」、メソッド 8 (RFC-1950) で圧縮されます:
- // 圧縮メソッド/フラグ コード: 1 バイト ($78 = メソッド 8、32k ウィンドウ) )
- // 追加のフラグ/チェック ビット: 1 バイト ($01: FCHECK = 1、FDICT = 0、FLEVEL = 0)
- // 圧縮データ ブロック: n バイト
- // 1 つのブロック (RFC-1951):
- //ビット 0: BFINAL: 1 (最後のブロックの場合)
- // ビット 1 および 2: BTYPE: 0 (圧縮なしの場合)
- // 次の 2 バイト: LEN (LSB ファースト)
- // 次の 2 バイト: LEN の 1 の補数
- // LEN バイトの非圧縮データ
- // チェック値: 4 バイト (非圧縮データの Adler-32 チェックサム)
- //
- $len = ($sx * 3 + 1) * $sy;
- $data = Pack(“c* ”, 0×78, 0×01,
- 1,
- $len & 255,
- ($len >> 8) & 255,
- 255 – ($len & 255),
- 255 – (($len >> 8) & 255));
- $start = strlen($data);
- $i2 = 0;
- for ($h = 0; $h < $sy; $h++) {
- $data .= chr(0);
- for ($w = 0; $w < $sx * 3; $w++) {
- $data .= $pixels[$i2++];
- }
- }
// バイト data[start..len-1]
- $s1 = 1;
- を使用して Adler32 チェックサムを計算します$s2 = 0;
- for ($n = $start; $n $s1 = ($s1 + ord($data[$n])) % 65521;
- $s2 = ($s2 + $s1) % 65521;
- }
- $adler = ($s2
$data .= chr(($adler >> 24) & 255);
- $data .= chr(($adler >> 16) & 255 );
- $data .= chr(($adler >> 8) & 255);
- $data .= chr($adler & 255);
- add_chunk(“IDAT”);
- < ;p>// IEND: PNG ファイルの終わりをマークします
- $data = “”;
- add_chunk(“IEND”);
// 列印图象
echo($result);
- ?>
复制代
|