-
-
/*
- * 說明:產生隨機碼,並以圖形方式顯示隨機碼。
- */
$ViewRandomCode = mt_rand(1000,10000);
session_start();
- $_SESSION['checksum'] = $ViewRandomCode;
function set_4pixel($r, $g, $b, $x, $y)
- {
- 全域$sx, $sy , $pixels; p>
$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);
- $pixels[$ofs + 5] = chr($b);
- }
- //產生數位影像的函數
- function draw2digits($x, $y, $number)
- {
- draw_digit($x, $y) , (int) ($number / 10));
- draw_digit($x + 11, $y, $number % 10);
- }
函數draw_digit( $x , $y, $digit)
- {
- 全域$sx, $sy, $pixels, $digits, $lines;
$digit = $digits[ $digit];
- $m = 8;
- for ($b = 1, $i = 0; $i {
- 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);
- }
- }
- }
- }
- }
//將文字加入表格中
- function add_chunk($type)
- {
- global $result, $data, $chunk , $crc_table;
// chunk : 為層
- // length: 4 字節: 用於計算chunk
- // chunk type: 4 位元組
- // chunk data: length bytes
- // CRC: 4 位元組: 循環冗餘碼校驗
- // 複製資料並建立CRC 校驗和
- $len = strlen($data);
- $chunk = pack(“c*”, ($len >> 24) & 255,
- ($ len >> 16) & 255,
- ($len>> 8) & 255,
- $len & 255);
- $chunk .= $type;
- $chunk .= $ data;
//計算CRC校驗和,位元組為chunk[4..len-1]
- $z = 16777215;
- $z |= 255 $c = $z;
- 對於($n = 4; $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;
- }
-
//主程式
$sx = 55;
- $sy = 21;
- $pixels = rand(100,99990)%2?”qwer”:””;
/ /填充
- for ($h = 0; $h {
- for ($w = 0; $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);
- }
- }
$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 = 隊列( 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);否則$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 = deflate/inflate)
- // 過濾方法: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 個位元組
- // 一個塊(RFC-1951):
- // 位元0:BFINAL:1 表示最後一個區塊
- // 位元1 和2:BTYPE:0 表示無壓縮
- // 下一個2個位元組:LEN(LSB在前)
- //接下來的2個位元組:LEN的補碼
- // 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 $data .= chr(0);
- for ($w = 0; $w $data .= $pixels[$i2++] ;
- }
- }
// 計算Adler32 校驗和,位元組為data[start..len-1]
- $s1 = 1;
- $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 >> 24) & 255);
- $data .= chr(($adler >> 255); 16) & 255);
- $data .= chr(($adler >> 8) & 255);
- $data .= chr($adler & 255);
- add_chunk(“ IDAT ”);
// IEND:標記PNG 檔案的結尾
- $data = “”;
- add_chunk(“IEND”);> ;
- //印刷快照
echo($result);
- ?>
複製程式碼
|