侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

技术  /  管理员 发布于 7年前   419

该程序是不用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="https:/article/Timeimg.php">  //以图象连接方式调用PHP文件
</body>
</html> 

 


  • 上一条:
    一次编写,随处运行
    下一条:
    风格模板初级不完全修改教程
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 2024.07.09日OpenAI将终止对中国等国家和地区API服务(0个评论)
    • 2024/6/9最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(0个评论)
    • 国外服务器实现api.openai.com反代nginx配置(0个评论)
    • 2024/4/28最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-12
    • 2024-02
    • 2024-04
    • 2024-05
    • 2024-06
    • 2025-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客