- /*
- * 中国の丸印カテゴリ
- * @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 $sealRadius; // 境界線の太さ
- private $innerRadius; radius
- private $startRadius ; // 五芒星の半径
- private $startAngle; // シールの色
- private $centerDot; private $img; private $font; // 指定されたフォント
- private $fontSize; // 指定されたフォント サイズ
- private $width; // 画像の高さ
- private $points; -尖った星
- private $charRadius; //文字列の半径
- private $charAngle; //文字間隔の角度
-
- //構築方法
- 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 functiondrawRim(){
- 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 functiondrawInnerCircle(){
- imagearc($this- >img,$this- >centerDot['x'],$this->centerDot['y'],2*$this->innerRadius,2*$this->innerRadius,0,360,$this ->backGround);
- }
-
- //文字列を描画
- プライベート関数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 $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]);
- }
- }
-
- //画五角星
- プライベート関数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 );
- }
-
- //出出
- プライベート関数outPut(){
- header('Content-type:image/png');
- imagepng($this->img);
- imagedestroy($this->gt;img );
- }
-
- //对外生成
- public function doImg(){
- $this->createImg();
- $this->drawRim();
- $this->drawInnerCircle();
- $this ->drawString();
- $this->drawStart();
- $this->outPut();
- }
- }
-
复制代
|