不用GD库生成当前时间的PNG格式图象的程序
2012-02-11 13:03
381 查看
//没有 gd 库的情况下
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
//chunktype:4字节
//chunkdata:lengthbytes
//CRC:4字节:循环冗余码校验
//copydataandcreateCRCchecksum
$len=strlen($data);
$chunk=pack("c*",($len>>24)&255,
($len>>16)&255,
($len>>8)&255,
$len&255);
$chunk.=$type;
$chunk.=$data;
//calculateaCRCchecksumwiththebyteschunk[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;
}
//PNGfilesignature
$result=pack("c*",137,80,78,71,13,10,26,10);
//IHDRchunkdata:
//width:4bytes
//height:4bytes
//bitdepth:1byte(8bitsperRGBvalue)
//colortype:1byte(2=RGB)
//compressionmethod:1byte(0=deflate/inflate)
//filtermethod:1byte(0=adaptivefiltering)
//interlacemethod:1byte(0=nointerlace)
$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:
//filterbyte:0=none
//RGBbytesfortheline
//thescanlineiscompressedwith"zlib",method8(RFC-1950):
//compressionmethod/flagscode:1byte($78=method8,32kwindow)
//additionalflags/checkbits:1byte($01:FCHECK=1,FDICT=0,FLEVEL=0)
//compresseddatablocks:nbytes
//oneblock(RFC-1951):
//bit0:BFINAL:1forthelastblock
//bit1and2:BTYPE:0fornocompression
//next2bytes:LEN(LSBfirst)
//next2bytes:one'scomplementofLEN
//LENbytesuncompresseddata
//checkvalue:4bytes(Adler-32checksumoftheuncompresseddata)
//
$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++];
}
}
//calculateaAdler32checksumwiththebytesdata[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:markstheendofthePNG-file
$data="";
add_chunk("IEND");
//列印图象
echo($result);
exit;
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
//chunktype:4字节
//chunkdata:lengthbytes
//CRC:4字节:循环冗余码校验
//copydataandcreateCRCchecksum
$len=strlen($data);
$chunk=pack("c*",($len>>24)&255,
($len>>16)&255,
($len>>8)&255,
$len&255);
$chunk.=$type;
$chunk.=$data;
//calculateaCRCchecksumwiththebyteschunk[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;
}
//PNGfilesignature
$result=pack("c*",137,80,78,71,13,10,26,10);
//IHDRchunkdata:
//width:4bytes
//height:4bytes
//bitdepth:1byte(8bitsperRGBvalue)
//colortype:1byte(2=RGB)
//compressionmethod:1byte(0=deflate/inflate)
//filtermethod:1byte(0=adaptivefiltering)
//interlacemethod:1byte(0=nointerlace)
$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:
//filterbyte:0=none
//RGBbytesfortheline
//thescanlineiscompressedwith"zlib",method8(RFC-1950):
//compressionmethod/flagscode:1byte($78=method8,32kwindow)
//additionalflags/checkbits:1byte($01:FCHECK=1,FDICT=0,FLEVEL=0)
//compresseddatablocks:nbytes
//oneblock(RFC-1951):
//bit0:BFINAL:1forthelastblock
//bit1and2:BTYPE:0fornocompression
//next2bytes:LEN(LSBfirst)
//next2bytes:one'scomplementofLEN
//LENbytesuncompresseddata
//checkvalue:4bytes(Adler-32checksumoftheuncompresseddata)
//
$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++];
}
}
//calculateaAdler32checksumwiththebytesdata[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:markstheendofthePNG-file
$data="";
add_chunk("IEND");
//列印图象
echo($result);
exit;
相关文章推荐
- php不用GD库生成当前时间的PNG格式图象的程序第1/2页
- 不用GD库生成当前时间的PNG格式图象的程序
- 不用GD库生成当前时间的PNG格式图象的程序
- php不用GD库生成当前时间的PNG格式图象的程序第1/2页
- 不用GD库生成当前时间的PNG格式图象的程序
- 几个代码片段-计算程序运行时间+获得当前目录+生成MD5
- 实战 HTTP 处理程序(HTTP Handler) (5)---不用临时文件,直接打开动态生成的文件
- 用C++写个程序,如何判断一个操作系统是16位还是32位的?不能用sizeof()函数?(不用sizeof()函数求当前主机上的一个int占用几个字节)
- c#根据当前系统时间生成的随机序列数
- windows下为Python脚本生成单独可执行程序的脚本(不用为每个脚本写setup.py了)
- 如何根据当前时间生成唯一编号
- 让程序随机不定时间生成随机种类的图形并生成多个
- java开发一个一GMT(格林威治标准时间)来显示当前时间的程序
- 未能加载文件或程序集“xxx”或它的某一个依赖项。生成此程序集的运行时比当前加载的运行时新,无法加载此程序集
- vc 获取程序版本号,当前程序路径,文件修改时间 等
- C++获取当前时间和计算程序运行时间的方法
- 在java程序中获得当前时间的前一天时间及Calendar与Date的转换
- java中调用System.currentTimeMillis()获取当前时间来求出时间差及程序执行的时间
- <编程>比较两种素数表生成算法+计算程序运行时间+通过CMD重定向测试程序
- 解决Windows 程序界面闪烁问题的一些经验 & 不用双缓冲实现无闪烁图象