心血来潮,写了个圆形印章生成器,字体的弧形旋转颇费功夫。总算效果还不错,代码存档。
方法一:
?php * 中文圆形印章类 * @author lkk/lianq.net * @create on 10:03 2012-5-29 * @example: * $seal = new circleSeal( 你我他坐站走东西南北中 ,75,6,24,0,0,16,40); * $seal- doImg();html' target='_blank'>class circleSeal { 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; //字符间隔角度 //构造方法 public function __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; //创建图片资源 private function createImg(){ $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); //画印章边框 private function drawRim(){ 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); //画内圆 private function drawInnerCircle(){ imagearc($this- img,$this- centerDot[ x ],$this- centerDot[ y ],2*$this- innerRadius,2*$this- innerRadius,0,360,$this- backGround); //画字符串 private function drawString(){ //编码处理 $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]); //画五角星 private function drawStart(){ $ang_out = 18 + $this- startAngle; $ang_in = 56 + $this- startAngle; $rad_out = $this- startRadius; $rad_in = $rad_out * 0.382; for($i=0;$i $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); //输出 private function outPut(){ header( Content-type:image/png imagepng($this- img); imagedestroy($this- img); //对外生成 public function doImg(){ $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 $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);else if($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 $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]); $j=$j-1; for($i=$j;$i $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);?
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP !
相关推荐:
PHP二维数组按照指定的字段进行排序的实现
php 抓取网页内容与图片的方法
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
新闻热点
疑难解答