Home >Backend Development >PHP Tutorial >PHP class to implement Chinese circular seal

PHP class to implement Chinese circular seal

WBOY
WBOYOriginal
2016-07-25 08:43:121152browse
  1. /*
  2. * Chinese round seal category
  3. * @author lkk/lianq.net
  4. * @create on 10:03 2012-5-29
  5. * @example:
  6. * $seal = new circleSeal('You and I sit and walk east, west, north, south, center',75,6,24,0,0,16,40);
  7. * $seal->doImg();
  8. */
  9. class circleSeal {
  10. private $sealString; //Seal characters
  11. private $strMaxLeng; //Maximum character length
  12. private $sealRadius; //Seal radius
  13. private $rimWidth; //Border thickness
  14. private $innerRadius; //Inner circle radius
  15. private $startRadius ; //Pentagram radius
  16. private $startAngle; //Pentagram tilt angle
  17. private $backGround; //Seal color
  18. private $centerDot; //Circle center coordinates
  19. private $img; //Graphic resource handle
  20. private $font; //Specified font
  21. private $fontSize; //Specified font size
  22. private $width; //Picture width
  23. private $height; //Picture height
  24. private $points; //Coordinates of each point of the five-pointed star
  25. private $charRadius; //String radius
  26. private $charAngle; //String tilt angle
  27. private $spacing; //Character spacing angle
  28. //Construction method
  29. public function __construct($str ='', $rad = 75, $rmwidth = 6, $strad = 24, $stang = 0, $crang = 0, $fsize = 16, $inrad =0){
  30. $this->sealString = empty($str) ? 'Seal test string' : $str;
  31. $this->strMaxLeng = 12;
  32. $this->sealRadius = $rad;
  33. $this->rimWidth = $rmwidth;
  34. $this->startRadius = $strad;
  35. $this- >startAngle = $stang;
  36. $this->charAngle = $crang;
  37. $this->centerDot = array('x'=>$rad, 'y'=>$rad);
  38. $this ->font = dirname(__FILE__) .'/simkai.ttf';
  39. $this->fontSize = $fsize;
  40. $this->innerRadius = $inrad; //Default 0, no
  41. $this-> ;spacing = 1;
  42. }
  43. //Create image resources
  44. private function createImg(){
  45. $this->width = 2 * $this->sealRadius;
  46. $this->height = 2 * $this ->sealRadius;
  47. $this->img = imagecreate($this->width, $this->height);
  48. imagecolorresolvealpha($this->img,255,255,255,127);
  49. $this->backGround = imagecolorallocate($this->img,255,0,0);
  50. }
  51. //Draw the seal border
  52. private function drawRim(){
  53. for($i=0;$i<$this->rimWidth ;$i++){
  54. imagearc($this->img,$this->centerDot['x'],$this->centerDot['y'],$this->width - $i,$ this->height - $i,0,360,$this->backGround);
  55. }
  56. }
  57. //Draw an inner circle
  58. private function drawInnerCircle(){
  59. imagearc($this->img,$this- >centerDot['x'],$this->centerDot['y'],2*$this->innerRadius,2*$this->innerRadius,0,360,$this->backGround);
  60. }
  61. //Draw a string
  62. private function drawString(){
  63. //Encoding processing
  64. $charset = mb_detect_encoding($this->sealString);
  65. if($charset != 'UTF-8'){
  66. $ this->sealString = mb_convert_encoding($this->sealString, 'UTF-8', 'GBK');
  67. }
  68. //Related measurement
  69. $this->charRadius = $this->sealRadius - $ this->rimWidth - $this->fontSize; //String radius
  70. $leng = mb_strlen($this->sealString,'utf8'); //String length
  71. if($leng > $this ->strMaxLeng) $leng = $this->strMaxLeng;
  72. $avgAngle = 360 / ($this->strMaxLeng); //Average character tilt
  73. //Split and write string
  74. $words = array(); //Character array
  75. for($i=0;$i<$leng;$i++){
  76. $words[] = mb_substr($this->sealString,$i,1,'utf8' );
  77. $r = 630 + $this->charAngle + $avgAngle*($i - $leng/2) + $this->spacing*($i-1); //Coordinate angle
  78. $R = 720 - $this->charAngle + $avgAngle*($leng-2*$i-1)/2 + $this->spacing*(1-$i); //Character angle
  79. $x = $this ->centerDot['x'] + $this->charRadius * cos(deg2rad($r)); //The x coordinate of the character
  80. $y = $this->centerDot['y'] + $this ->charRadius * sin(deg2rad($r)); //The y coordinate of the character
  81. imagettftext($this->img, $this->fontSize, $R, $x, $y, $this-> ;backGround, $this->font, $words[$i]);
  82. }
  83. }
  84. //画五角星
  85. private function drawStart(){
  86. $ang_out = 18 + $this->startAngle;
  87. $ang_in = 56 + $this->startAngle;
  88. $rad_out = $this->startRadius;
  89. $rad_in = $rad_out * 0.382;
  90. for($i=0;$i<5;$i++){
  91. //五个顶点坐标
  92. $this->points[] = $rad_out * cos(2*M_PI/5*$i - deg2rad($ang_out)) + $this->centerDot['x'];
  93. $this->points[] = $rad_out * sin(2*M_PI/5*$i - deg2rad($ang_out)) + $this->centerDot['y'];
  94. //内凹的点坐标
  95. $this->points[] = $rad_in * cos(2*M_PI/5*($i+1) - deg2rad($ang_in)) + $this->centerDot['x'];
  96. $this->points[] = $rad_in * sin(2*M_PI/5*($i+1) - deg2rad($ang_in)) + $this->centerDot['y'];
  97. }
  98. imagefilledpolygon($this->img, $this->points, 10, $this->backGround);
  99. }
  100. //输出
  101. private function outPut(){
  102. header('Content-type:image/png');
  103. imagepng($this->img);
  104. imagedestroy($this->img);
  105. }
  106. //对外生成
  107. public function doImg(){
  108. $this->createImg();
  109. $this->drawRim();
  110. $this->drawInnerCircle();
  111. $this->drawString();
  112. $this->drawStart();
  113. $this->outPut();
  114. }
  115. }
复制代码

PHP


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn