PHP implements Chinese circular seal special effects_PHP tutorial

WBOY
Release: 2016-07-13 09:49:58
Original
1243 people have browsed it

PHP implements Chinese circular seal special effects

On a whim, I wrote a circular seal generator. The arc rotation of the font took a lot of effort. Finally the effect is pretty good, the code is archived.

Method 1:

 ?

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

/*

* Chinese round seal type

* @author lkk/lianq.net

* @create on 10:03 2012-5-29

* @example:

* $seal = new circleSeal('You and I sit and walk east, west, north, south, center',75,6,24,0,0,16,40);

* $seal->doImg();

*/

class circleSeal {

private $sealString; //Seal character

private $strMaxLeng; //Maximum character length

private $sealRadius; //seal radius

private $rimWidth; //border thickness

private $innerRadius; //Inner circle radius

private $startRadius; //Pentagram radius

private $startAngle; //The tilt angle of the five-pointed star

private $backGround; //seal color

private $centerDot; //Circle center coordinates

private $img; //Graphic resource handle

private $font; //Specified font

private $fontSize; //Specify font size

private $width; //image width

private $height; //image height

private $points; //Coordinates of each point of the five-pointed star

private $charRadius; //String radius

private $charAngle; //String tilt angle

private $spacing; //Character spacing angle

//Construction method

public function __construct($str ='', $rad = 75, $rmwidth = 6, $strad = 24, $stang = 0, $crang = 0, $fsize = 16, $inrad =0){

$this->sealString = empty($str) ? 'Seal test string' : $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

@$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:WINDOWSFontssimkai.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);

?>

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
<🎜>@$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:WINDOWSFontssimkai.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); ?>

The above is the entire content of this article, I hope you all like it

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/1018929.htmlTechArticlePHP Realizes Chinese Circular Seal Special Effects On a whim, I wrote a circular seal generator, and the arc of the font is rotated quite a bit. Take effort. Finally the effect is pretty good, the code is archived. Method one: ? 1 2 3 4...
source:php.cn
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template