不用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缓存类代码(附详细说明)
Jun 09 PHP
php二维数组排序与默认自然排序的方法介绍
Apr 27 PHP
php实现图片缩放功能类
Dec 18 PHP
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
May 04 PHP
php时间戳格式化显示友好的时间函数分享
Oct 21 PHP
php图片上传类 附调用方法
May 15 PHP
PHP的消息通信机制测试实例
Nov 10 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
Jun 27 PHP
Windows平台实现PHP连接SQL Server2008的方法
Jul 26 PHP
PHP实现基于栈的后缀表达式求值功能
Nov 10 PHP
php抽象方法和普通方法的区别点总结
Oct 13 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
Dec 04 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
咖啡磨器 如何选购一台适合家用的意式磨豆机
2021/03/05 新手入门
windows下PHP APACHE MYSQ完整配置
2007/01/02 PHP
phpMyAdmin 安装教程全攻略
2007/03/19 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
PHP单例模式模拟Java Bean实现方法示例
2018/12/07 PHP
XHTML下,JS浮动代码失效的问题
2009/11/12 Javascript
jquery 元素相对定位代码
2010/10/15 Javascript
用JQuery调用Session的实现代码
2010/10/29 Javascript
jQuery中live方法的重复绑定说明
2011/10/21 Javascript
jquery中获取id值方法小结
2013/09/22 Javascript
Javascript全局变量var与不var的区别深入解析
2013/12/09 Javascript
JS获取select-option-text_value的方法
2013/12/26 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
直接拿来用的页面跳转进度条JS实现
2016/01/06 Javascript
JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法
2016/07/01 Javascript
jquery设置表单元素为不可用的简单代码
2016/07/04 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
AngularJS报错$apply already in progress的解决方法分析
2017/01/30 Javascript
JS及JQuery对Html内容编码,Html转义
2017/02/17 Javascript
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
Angular ElementRef简介及其使用
2018/10/01 Javascript
使用Typescript和ES模块发布Node模块的方法
2020/05/25 Javascript
使用Python判断IP地址合法性的方法实例
2014/03/13 Python
Python使用Flask框架获取当前查询参数的方法
2015/03/21 Python
python 调用c语言函数的方法
2017/09/29 Python
python TKinter获取文本框内容的方法
2018/10/11 Python
python pandas时序处理相关功能详解
2019/07/03 Python
python实现把两个二维array叠加成三维array示例
2019/11/29 Python
Python数据模型与Python对象模型的相关总结
2021/01/26 Python
雅萌 (YA-MAN) :日本美容家电领域的龙头企业
2017/05/12 全球购物
Geekbuying波兰:购买中国电子产品
2019/10/20 全球购物
快递业务员岗位职责
2014/01/06 职场文书
个人四风问题对照检查材料思想汇报
2014/10/06 职场文书
教师批评与自我批评发言稿
2014/10/15 职场文书
关于开学的感想
2015/08/10 职场文书