心血來潮,寫了個圓形印章生成器,字體的弧形旋轉頗費功夫??偹阈Ч€不錯,代碼存檔。
方法一:
?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();html' target='_blank'>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 $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();}
方法二:
?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 $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 $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]); $j=$j-1; for($i=$j;$i $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);?
以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP !
相關推薦:
PHP二維數組按照指定的字段進行排序的實現
php 抓取網頁內容與圖片的方法
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答