您的位置:首页 > 其它

不用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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐