IT学习者 | 文章大全 | 技术文档 | 桌面壁纸 | 网络电台 | 成语 | 歇后语 | 站长导航 | 下载 | 周公解梦 | 生日密码 | 站长助手 | Flash | IP地址查询
 您现在的位置: IT学习者 >> 文章大全 >> 网络编程 >> PHP

不用GD库生成当前时间的PNG格式图象的程序

【 来源:网络  更新时间:2007-5-27 | 字体:
该程序是不用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, $y, (int) ($number / 10));
   draw_digit($x + 11, $y, $number % 10);
   }
  
   function draw_digit($x, $y, $digit)
   {
   global $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 <= $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, 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);
   draw2digits(56, 2, $s);
   set_4pixel(0, 0, 0, 26, 7);
   set_4pixel(0, 0, 0, 26, 13);

   set_4pixel(0, 0, 0, 52, 7);
   set_4pixel(0, 0, 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,26,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,
   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,
   ($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++];
   }
   }
  
  
   // 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>
相 关 文 章
没有相关文章
相 关 软 件

音乐
嫁衣 画心 放生 天亮了 牡丹江 那滋味 擦肩而过 怀念过去 北京欢迎你 突然好想你 吻的太逼真 说好的幸福呢 坐上火车去拉萨 没有人比我更爱你
愚爱 心碎 稻香 带我走 醉赤壁 魔杰座 我还想她 明天过后 一定要爱你 等爱的玫瑰 原谅我一次 越单纯越幸福 最后一次的温柔 给我一首歌的时间
白狐 光荣 降临 下雨天 小酒窝 樱花草 恋爱新手 说唱脸谱 红色高跟鞋 寂寞才说爱 深深爱过你 爱上你是个错 即使知道要见面 不是因为寂寞才想你
城府 假如 花海 兰亭序 棉花糖 舍不得 最后一次 女人如烟 外滩十八号 我们的纪念 我们的无奈 心在跳情在烧 爱上你是我的错 爱情里没有谁对谁错
加入收藏留言建议自助友情链接普通友情链接站长的Blog
版权所有   COPYRIGHT 2002-2009 ★IT学习者★ ALL RIGHTS RESERVED.