首页 > 开发 > PHP > 正文

PHP实现中文圆形印章特效

2024-05-04 23:36:34
字体:
来源:转载
供稿:网友

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

方法一:

 

 
  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 = empty($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. private function createImg(){ 
  48. $this->width = 2 * $this->sealRadius; 
  49. $this->height = 2 * $this->sealRadius; 
  50. $this->img = imagecreate($this->width, $this->height); 
  51. imagecolorresolvealpha($this->img,255,255,255,127); 
  52. $this->backGround = imagecolorallocate($this->img,255,0,0); 
  53.  
  54. //画印章边框 
  55. private function drawRim(){ 
  56. for($i=0;$i<$this->rimWidth;$i++){ 
  57. imagearc($this->img,$this->centerDot['x'],$this->centerDot['y'],$this->width - $i,$this->height - $i,0,360,$this->backGround); 
  58.  
  59. //画内圆 
  60. private function drawInnerCircle(){ 
  61. imagearc($this->img,$this->centerDot['x'],$this->centerDot['y'],2*$this->innerRadius,2*$this->innerRadius,0,360,$this->backGround); 
  62.  
  63. //画字符串 
  64. private function drawString(){ 
  65. //编码处理 
  66. $charset = mb_detect_encoding($this->sealString); 
  67. if($charset != 'UTF-8'){ 
  68. $this->sealString = mb_convert_encoding($this->sealString, 'UTF-8''GBK'); 
  69.  
  70. //相关计量 
  71. $this->charRadius = $this->sealRadius - $this->rimWidth - $this->fontSize; //字符串半径 
  72. $leng = mb_strlen($this->sealString,'utf8'); //字符串长度 
  73. if($leng > $this->strMaxLeng) $leng = $this->strMaxLeng; 
  74. $avgAngle = 360 / ($this->strMaxLeng); //平均字符倾斜度 
  75.  
  76. //拆分并写入字符串 
  77. $words = array(); //字符数组 
  78. for($i=0;$i<$leng;$i++){ 
  79. $words[] = mb_substr($this->sealString,$i,1,'utf8'); 
  80. $r = 630 + $this->charAngle + $avgAngle*($i - $leng/2) + $this->spacing*($i-1); //坐标角度 
  81. $R = 720 - $this->charAngle + $avgAngle*($leng-2*$i-1)/2 + $this->spacing*(1-$i); //字符角度 
  82. $x = $this->centerDot['x'] + $this->charRadius * cos(deg2rad($r)); //字符的x坐标 
  83. $y = $this->centerDot['y'] + $this->charRadius * sin(deg2rad($r)); //字符的y坐标 
  84. imagettftext($this->img, $this->fontSize, $R, $x, $y, $this->backGround, $this->font, $words[$i]); 
  85. }  
  86.  
  87. //画五角星 
  88. private function drawStart(){ 
  89. $ang_out = 18 + $this->startAngle; 
  90. $ang_in = 56 + $this->startAngle; 
  91. $rad_out = $this->startRadius; 
  92. $rad_in = $rad_out * 0.382; 
  93. for($i=0;$i<5;$i++){ 
  94. //五个顶点坐标 
  95. $this->points[] = $rad_out * cos(2*M_PI/5*$i - deg2rad($ang_out)) + $this->centerDot['x']; 
  96. $this->points[] = $rad_out * sin(2*M_PI/5*$i - deg2rad($ang_out)) + $this->centerDot['y']; 
  97.  
  98. //内凹的点坐标 
  99. $this->points[] = $rad_in * cos(2*M_PI/5*($i+1) - deg2rad($ang_in)) + $this->centerDot['x']; 
  100. $this->points[] = $rad_in * sin(2*M_PI/5*($i+1) - deg2rad($ang_in)) + $this->centerDot['y']; 
  101. imagefilledpolygon($this->img, $this->points, 10, $this->backGround); 
  102.  
  103. //输出 
  104. private function outPut(){ 
  105. header('Content-type:image/png'); 
  106. imagepng($this->img); 
  107. imagedestroy($this->img); 
  108.  
  109. //对外生成 
  110. public function doImg(){ 
  111. $this->createImg(); 
  112. $this->drawRim(); 
  113. $this->drawInnerCircle(); 
  114. $this->drawString(); 
  115. $this->drawStart(); 
  116. $this->outPut(); 

方法二:

 

 
  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. $arc=$m*($j-$i)+$size/2; 
  39. $x=round($r*cos((90+$arc)*M_PI/180))+$a; 
  40. $y=-1*(round($r*sin((90+$arc)*M_PI/180))+$b); 
  41. if($arc<10)$arc=0;  
  42. ImageTTFText($im,$size,$arc,$x,$y,$red,$stock,$word[$i]); 
  43. $arc=$m*($j-$i)-$size/2; 
  44. $x=round($r*cos((90-$arc)*M_PI/180))+$a; 
  45. $y=-1*(round($r*sin((90-$arc)*M_PI/180))+$b); 
  46. if($arc<10)$arc=0;  
  47. ImageTTFText($im,$size,-$arc,$x,$y,$red,$stock,$word[$j+$j-$i]); 
  48. else 
  49. $j=$j-1; 
  50. for($i=$j;$i>=0;$i--) 
  51. $arc=$m/2+$m*($j-$i)+$size/2; 
  52. $x=round($r*cos((90+$arc)*M_PI/180))+$a; 
  53. $y=-1*(round($r*sin((90+$arc)*M_PI/180))+$b); 
  54. ImageTTFText($im,$size,$arc,$x,$y,$red,$stock,$word[$i]);  
  55. $arc=$m/2+$m*($j-$i)-$size/2; 
  56. $x=round($r*cos((90-$arc)*M_PI/180))+$a; 
  57. $y=-1*(round($r*sin((90-$arc)*M_PI/180))+$b); 
  58. ImageTTFText($im,$size,-$arc,$x,$y,$red,$stock,$word[$j+$j+1-$i]); 
  59.  
  60. header('Content-Type:image/png'); 
  61. ImagePNG($im); 
  62. ?> 

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表