PHP实现中文圆形印章特效
方法一:
<?php
/*
*中文圆形印章类
*@authorlkk/lianq.net
*@createon10:032012-5-29
*@example:
*$seal=newcircleSeal('你我他坐站走东西南北中',75,6,24,0,0,16,40);
*$seal->doImg();
*/
classcircleSeal{
private$sealString;//印章字符
private$strMaxLeng;//最大字符长度
private$sealRadius;//印章半径
private$rimWidth;//边框厚度
private$innerRadius;//内圆半径
private$startRadius;//五角星半径
private$startAngle;//五角星倾斜角度
private$backGround;//印章颜色
private$centerDot;//圆心坐标
private$img;//图形资源句柄
private$font;//指定的字体
private$fontSize;//指定字体大小
private$width;//图片宽度
private$height;//图片高度
private$points;//五角星各点坐标
private$charRadius;//字符串半径
private$charAngle;//字符串倾斜角度
private$spacing;//字符间隔角度
//构造方法
publicfunction__construct($str='',$rad=75,$rmwidth=6,$strad=24,$stang=0,$crang=0,$fsize=16,$inrad=0){
$this->sealString=empty($str)?'印章测试字符串':$str;
$this->strMaxLeng=12;
$this->sealRadius=$rad;
$this->rimWidth=$rmwidth;
$this->startRadius=$strad;
$this->startAngle=$stang;
$this->charAngle=$crang;
$this->centerDot=array('x'=>$rad,'y'=>$rad);
$this->font=dirname(__FILE__).'/simkai.ttf';
$this->fontSize=$fsize;
$this->innerRadius=$inrad;//默认0,没有
$this->spacing=1;
}
//创建图片资源
privatefunctioncreateImg(){
$this->width=2*$this->sealRadius;
$this->height=2*$this->sealRadius;
$this->img=imagecreate($this->width,$this->height);
imagecolorresolvealpha($this->img,255,255,255,127);
$this->backGround=imagecolorallocate($this->img,255,0,0);
}
//画印章边框
privatefunctiondrawRim(){
for($i=0;$i<$this->rimWidth;$i++){
imagearc($this->img,$this->centerDot['x'],$this->centerDot['y'],$this->width-$i,$this->height-$i,0,360,$this->backGround);
}
}
//画内圆
privatefunctiondrawInnerCircle(){
imagearc($this->img,$this->centerDot['x'],$this->centerDot['y'],2*$this->innerRadius,2*$this->innerRadius,0,360,$this->backGround);
}
//画字符串
privatefunctiondrawString(){
//编码处理
$charset=mb_detect_encoding($this->sealString);
if($charset!='UTF-8'){
$this->sealString=mb_convert_encoding($this->sealString,'UTF-8','GBK');
}
//相关计量
$this->charRadius=$this->sealRadius-$this->rimWidth-$this->fontSize;//字符串半径
$leng=mb_strlen($this->sealString,'utf8');//字符串长度
if($leng>$this->strMaxLeng)$leng=$this->strMaxLeng;
$avgAngle=360/($this->strMaxLeng);//平均字符倾斜度
//拆分并写入字符串
$words=array();//字符数组
for($i=0;$i<$leng;$i++){
$words[]=mb_substr($this->sealString,$i,1,'utf8');
$r=630+$this->charAngle+$avgAngle*($i-$leng/2)+$this->spacing*($i-1);//坐标角度
$R=720-$this->charAngle+$avgAngle*($leng-2*$i-1)/2+$this->spacing*(1-$i);//字符角度
$x=$this->centerDot['x']+$this->charRadius*cos(deg2rad($r));//字符的x坐标
$y=$this->centerDot['y']+$this->charRadius*sin(deg2rad($r));//字符的y坐标
imagettftext($this->img,$this->fontSize,$R,$x,$y,$this->backGround,$this->font,$words[$i]);
}
}
//画五角星
privatefunctiondrawStart(){
$ang_out=18+$this->startAngle;
$ang_in=56+$this->startAngle;
$rad_out=$this->startRadius;
$rad_in=$rad_out*0.382;
for($i=0;$i<5;$i++){
//五个顶点坐标
$this->points[]=$rad_out*cos(2*M_PI/5*$i-deg2rad($ang_out))+$this->centerDot['x'];
$this->points[]=$rad_out*sin(2*M_PI/5*$i-deg2rad($ang_out))+$this->centerDot['y'];
//内凹的点坐标
$this->points[]=$rad_in*cos(2*M_PI/5*($i+1)-deg2rad($ang_in))+$this->centerDot['x'];
$this->points[]=$rad_in*sin(2*M_PI/5*($i+1)-deg2rad($ang_in))+$this->centerDot['y'];
}
imagefilledpolygon($this->img,$this->points,10,$this->backGround);
}
//输出
privatefunctionoutPut(){
header('Content-type:image/png');
imagepng($this->img);
imagedestroy($this->img);
}
//对外生成
publicfunctiondoImg(){
$this->createImg();
$this->drawRim();
$this->drawInnerCircle();
$this->drawString();
$this->drawStart();
$this->outPut();
}
}
方法二:
<?php
@$hos=iconv("GBK","UTF-8",$_GET["hos"]);
if(!isset($hos))
exit;
$im=ImageCreate(150,150);
$gray=ImageColorResolveAlpha($im,200,200,200,127);
$red=ImageColorAllocate($im,230,150,150);
for($i=0;$i<6;$i++)
ImageArc($im,75,75,148-$i,148-$i,0,360,$red);
$stock='C:\WINDOWS\Fonts\simkai.ttf';
$point="★";
$size=30;
ImageTTFText($im,$size,0,72-$size/2,72+$size/2,$red,$stock,$point);
$a=75;$b=-75;//中心点坐标
$r=65;$m=40;//半径,角度
$size=16;//字体大小
$r=$r-$size;
$word=array();
$max=18;
$count=mb_strlen($hos,'utf8');
if($count>$max)$count=$max;
if($count>12)
$m=floor(360/$count);
elseif($count>5)
$m-=$count;
for($i=0;$i<$count;$i++)
$word[]=mb_substr($hos,$i,1,'utf8');
$j=floor($count/2);
if($j!=$count/2)
{
for($i=$j;$i>=0;$i--)
{
$arc=$m*($j-$i)+$size/2;
$x=round($r*cos((90+$arc)*M_PI/180))+$a;
$y=-1*(round($r*sin((90+$arc)*M_PI/180))+$b);
if($arc<10)$arc=0;
ImageTTFText($im,$size,$arc,$x,$y,$red,$stock,$word[$i]);
$arc=$m*($j-$i)-$size/2;
$x=round($r*cos((90-$arc)*M_PI/180))+$a;
$y=-1*(round($r*sin((90-$arc)*M_PI/180))+$b);
if($arc<10)$arc=0;
ImageTTFText($im,$size,-$arc,$x,$y,$red,$stock,$word[$j+$j-$i]);
}
}
else
{
$j=$j-1;
for($i=$j;$i>=0;$i--)
{
$arc=$m/2+$m*($j-$i)+$size/2;
$x=round($r*cos((90+$arc)*M_PI/180))+$a;
$y=-1*(round($r*sin((90+$arc)*M_PI/180))+$b);
ImageTTFText($im,$size,$arc,$x,$y,$red,$stock,$word[$i]);
$arc=$m/2+$m*($j-$i)-$size/2;
$x=round($r*cos((90-$arc)*M_PI/180))+$a;
$y=-1*(round($r*sin((90-$arc)*M_PI/180))+$b);
ImageTTFText($im,$size,-$arc,$x,$y,$red,$stock,$word[$j+$j+1-$i]);
}
}
header('Content-Type:image/png');
ImagePNG($im);
?>
以上所述就是本文的全部内容了,希望大家能够喜欢