-
-
/* - * 설명: 무작위 코드를 생성하고 무작위 코드를 그래픽으로 표시합니다.
- */
$ViewRandomCode = mt_rand(1000,10000);
session_start();
- $_SESSION[' checksum'] = $ViewRandomCode;
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);
- $pixels[$ofs 5] = chr($b);
- }
- //生成数字图象的函数
- function draw2digits($x, $y, $number)
- {
- draw_digit($x, $y, (int) ($number / 10));
- draw_digit($x 11, $y, $number % 10);
- }
function draw_digit($x, $y, $digit)
- {
- 글로벌 $sx, $sy, $pixels, $digits, $lines;
$digit = $digits[$digit];
- $m = 8;
- for ($b = 1, $i = 0; $i < 7; $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 <= $x1; $w ) {
- $pixels[$ofs ] = chr(0);
- $pixels[$ofs ] = chr(0);
- $pixels[$ofs ] = chr(0);
- }
- }
- }
- }
- }
-
//将文字加入到图象中
- 함수 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]
- $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;< ;/p>
$chunk .= chr(($crc >> 24) & 255);
- $chunk .= chr(($crc >> 16) & 255 );
- $chunk .= chr(($crc >> 8) & 255);
- $chunk .= chr($crc & 255);
- $result .= $chunk;
- }
//主程序
- < p>$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 0);
- $digits = 배열(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);
- < p>// set_4pixel(0, 0, 0, 26, 7);
- // set_4pixel(0, 0, 0, 26, 13);
// 创建循环冗余码校验表
- $z = -306674912; // = 0xedb88320
- for ($n = 0; $n < 256; $n ) {
- $c = $n;
- for ($k = 0; $k < 8; $ 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”);
// 以下不敢乱翻译,请自行参考
- // 스캔라인:
- / / 필터 바이트: 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의 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 $data .= chr(0);
- for ($w = 0; $w < $sx * 3; $w ) {
- $data .= $pixels[$i2 ];
- }
- }
// 계산 data[start..len-1]
- $s1 = 1;
- $s2 = 0;
- for ($n = $start; $n < strlen($data) 바이트의 Adler32 체크섬 ); $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 ”);
// IEND: PNG 파일의 끝을 표시
- $data = “”;
- add_chunk(“IEND”);
// 列印图象
echo($result);
- ?>
-
复제대码
|