加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

不用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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读