PHP实现中文圆形印章特效


Posted in PHP onJune 19, 2015

方法一:

<?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();
  }
}

方法二:

<?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);
?>

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

PHP 相关文章推荐
基于文本的搜索
Oct 09 PHP
PHP脚本的10个技巧(7)
Oct 09 PHP
模板引擎Smarty深入浅出介绍
Dec 06 PHP
Discuz 模板语句分析及知识技巧
Aug 21 PHP
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
Sep 05 PHP
thinkPHP的Html模板标签使用方法
Nov 13 PHP
php遍历所有文件及文件夹的方法深入解析
Jun 08 PHP
php中将一段数据存到一个txt文件中并显示其内容
Aug 15 PHP
smarty的section嵌套循环用法示例
May 28 PHP
php版微信公众号自定义分享内容实现方法
Sep 22 PHP
redis查看连接数及php模拟并发创建redis连接的方法
Dec 15 PHP
php源码的使用方法讲解
Sep 26 PHP
PHP 常用的header头部定义汇总
Jun 19 #PHP
PHP实现获取中英文首字母
Jun 19 #PHP
常用的php图片处理类(水印、等比缩放、固定高宽)分享
Jun 19 #PHP
php打造智能化的柱状图程序,用于报表等
Jun 19 #PHP
php实现通过ftp上传文件
Jun 19 #PHP
php结合正则获取字符串中数字
Jun 19 #PHP
php中文验证码实现方法
Jun 18 #PHP
You might like
Netflix将与CLAMP、乙一以及冲方丁等6名知名制作人合伙展开原创动画计划!
2020/03/06 日漫
vs中通过剪切板循环来循环粘贴不同内容
2011/04/30 PHP
php中的字符编码转换函数用法示例
2014/10/20 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
javascript 自定义事件初探
2009/08/21 Javascript
指定位置如果有图片显示图片,无图片显示广告的JS
2010/06/05 Javascript
JavaScript实现网页图片等比例缩放实现代码及调用方式
2013/02/25 Javascript
js如何实现设计模式中的模板方法
2013/07/23 Javascript
js如何取消事件冒泡
2013/09/23 Javascript
原生JS实现网络彩票投注效果
2016/09/25 Javascript
概述jQuery的元素筛选
2016/11/23 Javascript
JavaScript中return用法示例
2016/11/29 Javascript
微信小程序 页面传值详解
2017/03/10 Javascript
Centos6.8下Node.js安装教程
2017/05/12 Javascript
Vue.js数据绑定之data属性
2017/07/07 Javascript
Angular CLI 安装和使用教程
2017/09/13 Javascript
js实现数组和对象的深浅拷贝
2017/09/30 Javascript
基于vue2实现左滑删除功能
2017/11/28 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
2018/01/20 Javascript
js实现简单页面全屏
2019/09/17 Javascript
layui-table获得当前行的上/下一行数据的例子
2019/09/24 Javascript
vue实现一个6个输入框的验证码输入组件功能的实例代码
2020/06/29 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
python中reduce()函数的使用方法示例
2017/09/29 Python
深入分析python中整型不会溢出问题
2018/06/18 Python
香港礼品网站:GiftU eshop
2017/09/01 全球购物
美国林业供应商:Forestry Suppliers
2019/05/01 全球购物
C/C++程序员常见面试题二
2015/11/19 面试题
JAVA和C++区别都有哪些
2015/03/30 面试题
商务英语大学生职业生涯规划书范文
2014/01/01 职场文书
大学毕业感言一句话
2014/02/06 职场文书
八一建军节活动方案
2014/02/10 职场文书
建筑安全员岗位职责
2014/03/13 职场文书
酒店管理求职信
2014/06/09 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
2016大一新生军训心得体会
2016/01/11 职场文书