当前位置:首页 > PHP教程 > php应用 > 列表

PHP实现中文圆形印章特效

发布:smiling 来源: PHP粉丝网  添加日期:2021-05-29 14:25:56 浏览: 评论:0 

心血来潮,写了个圆形印章生成器,字体的弧形旋转颇费功夫。总算效果还不错,代码存档。

方法一:

  1. <?php 
  2. /* 
  3.  * 中文圆形印章类 
  4.  * @author lkk/lianq.net 
  5.  * @create on 10:03 2012-5-29 
  6.  * @example: 
  7.  * $seal = new circleSeal('你我他坐站走东西南北中',75,6,24,0,0,16,40); 
  8.  * $seal->doImg(); 
  9.  */ 
  10.    
  11. class circleSeal { 
  12.   private $sealString;  //印章字符 
  13.   private $strMaxLeng;  //最大字符长度 
  14.   private $sealRadius;  //印章半径 
  15.   private $rimWidth;   //边框厚度 
  16.   private $innerRadius;  //内圆半径 
  17.   private $startRadius;  //五角星半径 
  18.   private $startAngle;  //五角星倾斜角度 
  19.   private $backGround;  //印章颜色 
  20.   private $centerDot;   //圆心坐标 
  21.   private $img;      //图形资源句柄 
  22.   private $font;     //指定的字体 
  23.   private $fontSize;   //指定字体大小 
  24.   private $width;     //图片宽度 
  25.   private $height;    //图片高度 
  26.   private $points;    //五角星各点坐标 
  27.   private $charRadius;  //字符串半径 
  28.   private $charAngle;   //字符串倾斜角度 
  29.   private $spacing;    //字符间隔角度 
  30.    
  31.   //构造方法 
  32.   public function __construct($str =''$rad = 75, $rmwidth = 6, $strad = 24, $stang = 0, $crang = 0, $fsize = 16, $inrad =0){ 
  33.     $this->sealString  = emptyempty($str) ? '印章测试字符串' : $str
  34.     $this->strMaxLeng  = 12; 
  35.     $this->sealRadius  = $rad
  36.     $this->rimWidth   = $rmwidth
  37.     $this->startRadius = $strad
  38.     $this->startAngle  = $stang
  39.     $this->charAngle  = $crang
  40.     $this->centerDot  = array('x'=>$rad'y'=>$rad); 
  41.     $this->font     = dirname(__FILE__) .'/simkai.ttf'
  42.     $this->fontSize   = $fsize
  43.     $this->innerRadius = $inrad;  //默认0,没有 
  44.     $this->spacing   = 1; 
  45.   } 
  46.    
  47.   //创建图片资源 
  48.   private function createImg(){ 
  49.     $this->width    = 2 * $this->sealRadius; 
  50.     $this->height    = 2 * $this->sealRadius; 
  51.     $this->img     = imagecreate($this->width, $this->height); 
  52.     imagecolorresolvealpha($this->img,255,255,255,127); 
  53.     $this->backGround  = imagecolorallocate($this->img,255,0,0); 
  54.   } 
  55.    
  56.   //画印章边框 
  57.   private function drawRim(){ 
  58.     for($i=0;$i<$this->rimWidth;$i++){ 
  59.       imagearc($this->img,$this->centerDot['x'],$this->centerDot['y'],$this->width - $i,$this->height - $i,0,360,$this->backGround); 
  60.     } 
  61.   } 
  62.    
  63.   //画内圆 
  64.   private function drawInnerCircle(){ 
  65.     imagearc($this->img,$this->centerDot['x'],$this->centerDot['y'],2*$this->innerRadius,2*$this->innerRadius,0,360,$this->backGround); 
  66.   } 
  67.    
  68.   //画字符串 
  69.   private function drawString(){ 
  70.     //编码处理 
  71.     $charset = mb_detect_encoding($this->sealString); 
  72.     if($charset != 'UTF-8'){ 
  73.       $this->sealString = mb_convert_encoding($this->sealString, 'UTF-8''GBK'); 
  74.     } 
  75.    
  76.     //相关计量 
  77.     $this->charRadius = $this->sealRadius - $this->rimWidth - $this->fontSize; //字符串半径 
  78.     $leng  = mb_strlen($this->sealString,'utf8'); //字符串长度 
  79.     if($leng > $this->strMaxLeng) $leng = $this->strMaxLeng; 
  80.     $avgAngle  = 360 / ($this->strMaxLeng);  //平均字符倾斜度 
  81.    
  82.     //拆分并写入字符串 
  83.     $words = array(); //字符数组 
  84.     for($i=0;$i<$leng;$i++){ 
  85.       $words[] = mb_substr($this->sealString,$i,1,'utf8'); 
  86.       $r = 630 + $this->charAngle + $avgAngle*($i - $leng/2) + $this->spacing*($i-1);   //坐标角度 
  87.       $R = 720 - $this->charAngle + $avgAngle*($leng-2*$i-1)/2 + $this->spacing*(1-$i);  //字符角度 
  88.       $x = $this->centerDot['x'] + $this->charRadius * cos(deg2rad($r)); //字符的x坐标 
  89.       $y = $this->centerDot['y'] + $this->charRadius * sin(deg2rad($r)); //字符的y坐标 
  90.       imagettftext($this->img, $this->fontSize, $R$x$y$this->backGround, $this->font, $words[$i]); 
  91.     } 
  92.   }   
  93.    
  94.   //画五角星 
  95.   private function drawStart(){ 
  96.     $ang_out = 18 + $this->startAngle; 
  97.     $ang_in = 56 + $this->startAngle; 
  98.     $rad_out = $this->startRadius; 
  99.     $rad_in = $rad_out * 0.382; 
  100.     for($i=0;$i<5;$i++){ 
  101.       //五个顶点坐标 
  102.       $this->points[] = $rad_out * cos(2*M_PI/5*$i - deg2rad($ang_out)) + $this->centerDot['x']; 
  103.       $this->points[] = $rad_out * sin(2*M_PI/5*$i - deg2rad($ang_out)) + $this->centerDot['y']; 
  104.    
  105.       //内凹的点坐标 
  106.       $this->points[] = $rad_in * cos(2*M_PI/5*($i+1) - deg2rad($ang_in)) + $this->centerDot['x']; 
  107.       $this->points[] = $rad_in * sin(2*M_PI/5*($i+1) - deg2rad($ang_in)) + $this->centerDot['y']; 
  108.     } 
  109.     imagefilledpolygon($this->img, $this->points, 10, $this->backGround); 
  110.   } 
  111.    
  112.   //输出 
  113.   private function outPut(){ 
  114.     header('Content-type:image/png'); 
  115.     imagepng($this->img); 
  116.     imagedestroy($this->img); 
  117.   } 
  118.    
  119.   //对外生成 
  120.   public function doImg(){ 
  121.     $this->createImg(); 
  122.     $this->drawRim(); 
  123.     $this->drawInnerCircle(); 
  124.     $this->drawString(); 
  125.     $this->drawStart(); 
  126.     $this->outPut(); 
  127.   } 

方法二:

  1. <?php 
  2. @$hos=iconv("GBK""UTF-8"$_GET["hos"]); 
  3. if(!isset($hos)) 
  4. exit
  5.  
  6. $im=ImageCreate(150,150); 
  7. $gray=ImageColorResolveAlpha($im,200,200,200,127); 
  8. $red=ImageColorAllocate($im,230,150,150); 
  9.  
  10. for($i=0;$i<6;$i++) 
  11. ImageArc($im,75,75,148-$i,148-$i,0,360,$red); 
  12.  
  13. $stock='C:\WINDOWS\Fonts\simkai.ttf'
  14. $point="★"
  15. $size=30; 
  16. ImageTTFText($im,$size,0,72-$size/2,72+$size/2,$red,$stock,$point); 
  17.  
  18. $a=75;$b=-75;//中心点坐标 
  19. $r=65;$m=40;//半径,角度 
  20. $size=16;//字体大小 
  21. $r=$r-$size
  22.  
  23. $word=array(); 
  24. $max=18; 
  25. $count=mb_strlen($hos,'utf8'); 
  26. if($count>$max)$count=$max
  27. if($count>12) 
  28. $m=floor(360/$count); 
  29. else if($count>5) 
  30. $m-=$count
  31.  
  32. for($i=0;$i<$count;$i++) 
  33. $word[]=mb_substr($hos,$i,1,'utf8'); 
  34.  
  35. $j=floor($count/2); 
  36. if($j!=$count/2) 
  37.  for($i=$j;$i>=0;$i--) 
  38.  { 
  39.  $arc=$m*($j-$i)+$size/2; 
  40.  $x=round($r*cos((90+$arc)*M_PI/180))+$a
  41.  $y=-1*(round($r*sin((90+$arc)*M_PI/180))+$b); 
  42.  if($arc<10)$arc=0;  
  43.  ImageTTFText($im,$size,$arc,$x,$y,$red,$stock,$word[$i]); 
  44.  $arc=$m*($j-$i)-$size/2; 
  45.  $x=round($r*cos((90-$arc)*M_PI/180))+$a
  46.  $y=-1*(round($r*sin((90-$arc)*M_PI/180))+$b); 
  47.  if($arc<10)$arc=0;  
  48.  ImageTTFText($im,$size,-$arc,$x,$y,$red,$stock,$word[$j+$j-$i]); 
  49.  } 
  50. else 
  51.  $j=$j-1; 
  52.  for($i=$j;$i>=0;$i--) 
  53.  { 
  54.  $arc=$m/2+$m*($j-$i)+$size/2; 
  55.  $x=round($r*cos((90+$arc)*M_PI/180))+$a
  56.  $y=-1*(round($r*sin((90+$arc)*M_PI/180))+$b); 
  57.  ImageTTFText($im,$size,$arc,$x,$y,$red,$stock,$word[$i]);  
  58.  $arc=$m/2+$m*($j-$i)-$size/2; 
  59.  $x=round($r*cos((90-$arc)*M_PI/180))+$a
  60.  $y=-1*(round($r*sin((90-$arc)*M_PI/180))+$b); 
  61.  ImageTTFText($im,$size,-$arc,$x,$y,$red,$stock,$word[$j+$j+1-$i]); 
  62.  } 
  63.  
  64. header('Content-Type:image/png'); 
  65. ImagePNG($im); 
  66. ?> 

以上所述就是本文的全部内容了,希望大家能够喜欢

Tags: PHP中文圆形 PHP印章特效

分享到: