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


Posted in PHP onOctober 09, 2006

该程序是不用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> 

 

PHP 相关文章推荐
php缓存技术介绍
Nov 25 PHP
Could not load type System.ServiceModel.Activation.HttpModule解决办法
Dec 29 PHP
ThinkPHP之foreach标签使用概述
Jun 30 PHP
php实现转换ubb代码的方法
Jun 18 PHP
用PHP代码给图片加水印
Jul 01 PHP
php结合web uploader插件实现分片上传文件
May 10 PHP
Thinkphp3.2.3分页使用实例解析
Jul 28 PHP
如何使用PHP给图片加水印
Oct 12 PHP
php封装的smartyBC类完整实例
Oct 19 PHP
thinkPHP5 tablib标签库自定义方法详解
May 10 PHP
thinkPHP5项目中实现QQ第三方登录功能
Oct 20 PHP
PHP微商城开源代码实例
Mar 27 PHP
用定制的PHP应用程序来获取Web服务器的状态信息
Oct 09 #PHP
PHP在Web开发领域的优势
Oct 09 #PHP
优化NFR之一 --MSSQL Hello Buffer Overflow
Oct 09 #PHP
风格模板初级不完全修改教程
Oct 09 #PHP
如何对PHP程序中的常见漏洞进行攻击
Oct 09 #PHP
PHP安全配置
Oct 09 #PHP
用PHP 4.2书写安全的脚本
Oct 09 #PHP
You might like
php对二维数组按指定键值key排序示例代码
2013/11/26 PHP
php单文件版在线代码编辑器
2015/03/12 PHP
php类常量用法实例分析
2015/07/09 PHP
[原创]PHP简单开启curl的方法(测试可行)
2016/01/11 PHP
jquery 获取json数据实现代码
2009/04/27 Javascript
jquery 新浪网易的评论块制作
2010/07/01 Javascript
jquery动态加载js三种方法实例
2013/08/03 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
PHP实现的各种中文编码转换类分享
2015/01/23 Javascript
js根据鼠标移动速度背景图片自动旋转的方法
2015/02/28 Javascript
浅谈js中的延迟执行和定时执行
2016/05/31 Javascript
微信小程序 实战实例开发流程详细介绍
2017/01/05 Javascript
BootStrap Select清除选中的状态恢复默认状态
2017/06/20 Javascript
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
命令行批量截图Node脚本示例代码
2019/01/25 Javascript
微信小程序的开发范式BeautyWe.js入门详解
2019/07/10 Javascript
layUI的验证码功能及校验实例
2019/10/25 Javascript
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
JS面向对象之单选框实现
2020/01/17 Javascript
[01:14:35]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第一局
2016/02/26 DOTA
朴素贝叶斯算法的python实现方法
2014/11/18 Python
Python的Django框架安装全攻略
2015/07/15 Python
Python在Windows和在Linux下调用动态链接库的教程
2015/08/18 Python
Python正则获取、过滤或者替换HTML标签的方法
2016/01/28 Python
Python中进程和线程的区别详解
2017/10/29 Python
用Python将Excel数据导入到SQL Server的例子
2019/08/24 Python
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
selenium WebDriverWait类等待机制的实现
2020/03/18 Python
Python虚拟环境的创建和包下载过程分析
2020/06/19 Python
html5使用canvas画空心圆与实心圆
2014/12/15 HTML / CSS
英国运动服、设备及配件网站:DW Sports
2019/12/04 全球购物
小学少先队活动方案
2014/02/18 职场文书
广告艺术设计专业自荐书
2014/07/08 职场文书
期中考试复习计划
2015/01/19 职场文书
浅谈JS的原型和原型链
2021/06/04 Javascript