不用GD库生成当前时间的PNG格式图象的程序
发布时间:2020-12-13 14:11:31 所属栏目:PHP教程 来源:网络整理
导读:该程序是不用GD库可以生成当前时间的PNG格式图象,给人大开眼界,很有参考价值. teaman整理 ?? ???php ?? ?? function set_4pixel($r,$g,$b,$x,$y) ?? { ?? global $sx,$sy,$pixels; ?? ?? $ofs = 3 * ($sx * $y + $x); ?? $pixels[$ofs] = chr($r); ?? $pixe
该程序是不用GD库可以生成当前时间的PNG格式图象,给人大开眼界,很有参考价值. teaman整理 ?? ??<?php ?? ?? 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,(int) ($number / 10)); ?? draw_digit($x + 11,$number % 10); ?? } ?? ?? function draw_digit($x,$digit) ?? { ?? global $sx,$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 <= $y1; $h++,$ofs += 3 * $sx) { ?? $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); ?? } ?? } ?? } ?? } ?? } ?? ?? //将文字加入到图象中 ?? function add_chunk($type) ?? { ?? global $result,$data,$chunk,$crc_table; ?? ?? // chunk :为层 ?? // length: 4 字节: 用来计算 chunk ?? // chunk type: 4 字节 ?? // chunk data: length bytes ?? // CRC: 4 字节: 循环冗余码校验 ?? ?? // copy data and create CRC checksum ?? $len = strlen($data); ?? $chunk = pack("c*",($len >> 24) & 255, ?? ($len >> 16) & 255, ?? ($len >> 8) & 255, ?? $len & 255); ?? $chunk .= $type; ?? $chunk .= $data; ?? ?? // calculate a CRC checksum with the bytes chunk[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; ?? ?? $chunk .= chr(($crc >> 24) & 255); ?? $chunk .= chr(($crc >> 16) & 255); ?? $chunk .= chr(($crc >> 8) & 255); ?? $chunk .= chr($crc & 255); ?? ?? // 将结果加到$result中 ?? $result .= $chunk; ?? } ?? ?? ?? //主程序 ?? ?? $sx = 80; ?? $sy = 21; ?? $pixels = ""; ?? ?? // 填充 ?? 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); ?? } ?? } ?? ?? $date = getdate(); ?? $s = $date["seconds"]; ?? $m = $date["minutes"]; ?? $h = $date["hours"]; ?? $digits = array(95,5,118,117,45,121,123,69,127,125); ?? $lines = array(1,1,2,0); ?? ?? draw2digits(4,$h); ?? draw2digits(30,$m); ?? draw2digits(56,$s); ?? set_4pixel(0,26,7); ?? set_4pixel(0,13); ?? set_4pixel(0,52,13); ?? ?? // 创建循环冗余码校验表 ?? $z = -306674912; // = 0xedb88320 ?? for ($n = 0; $n < 256; $n++) { ?? $c = $n; ?? for ($k = 0; $k < 8; $k++) { ?? $c2 = ($c >> 1) & 0x7fffffff; ?? if ($c & 1) $c = $z ^ ($c2); else $c = $c2; ?? } ?? $crc_table[$n] = $c; ?? } ?? ?? // PNG file signature ?? $result = pack("c*",137,80,78,71,13,10,10); ?? ?? // IHDR chunk data: ?? // width: 4 bytes ?? // height: 4 bytes ?? // bit depth: 1 byte (8 bits per RGB value) ?? // color type: 1 byte (2 = RGB) ?? // compression method: 1 byte (0 = deflate/inflate) ?? // filter method: 1 byte (0 = adaptive filtering) ?? // interlace method: 1 byte (0 = no interlace) ?? $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); ?? add_chunk("IHDR"); ?? ?? // 以下不敢乱翻译,请自行参考 ?? // scanline: ?? // filter byte: 0 = none ?? // RGB bytes for the line ?? // the scanline is compressed with "zlib",method 8 (RFC-1950): ?? // compression method/flags code: 1 byte ($78 = method 8,32k window) ?? // additional flags/check bits: 1 byte ($01: FCHECK = 1,FDICT = 0,FLEVEL = 0) ?? // compressed data blocks: n bytes ?? // one block (RFC-1951): ?? // bit 0: BFINAL: 1 for the last block ?? // bit 1 and 2: BTYPE: 0 for no compression ?? // next 2 bytes: LEN (LSB first) ?? // next 2 bytes: one's complement of LEN ?? // LEN bytes uncompressed data ?? // check value: 4 bytes (Adler-32 checksum of the uncompressed data) ?? // ?? $len = ($sx * 3 + 1) * $sy; ?? $data = pack("c*",0x78,0x01, ?? 1, ?? $len & 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++]; ?? } ?? } ?? ?? ?? // calculate a Adler32 checksum with the bytes data[start..len-1] ?? $s1 = 1; ?? $s2 = 0; ?? for ($n = $start; $n < strlen($data); $n++) { ?? $s1 = ($s1 + ord($data[$n])) % 65521; ?? $s2 = ($s2 + $s1) % 65521; ?? } ?? $adler = ($s2 << 16) | $s1; ?? ?? $data .= chr(($adler >> 24) & 255); ?? $data .= chr(($adler >> 16) & 255); ?? $data .= chr(($adler >> 8) & 255); ?? $data .= chr($adler & 255); ?? add_chunk("IDAT"); ?? ?? // IEND: marks the end of the PNG-file ?? $data = ""; ?? add_chunk("IEND"); ?? ?? // 列印图象 ?? ?? echo($result); ???> ?? ??//如何调用,其实很简单,将上面存为Timeimg.php ??//然后新建一个页面如下: ?? ??<html> ?? <head> ?? <title>test</title> ?? <meta http-equiv="Content-Type" content="text/html"> ?? </head> ?? <body> ?? <img src="Timeimg.php"> //以图象连接方式调用PHP文件 ??</body> ??</html> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |