php生成印章 代码片段

方法一:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<?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();
  */
  
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 <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);
  }
  
   //输出
   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();
  }
}

方法二:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?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 );
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 >=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 );
?>


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值