GD
上一篇 / 下一篇 2007-04-19 01:16:56 / 个人分类:GD
Tz"`-xYW&?0PHP动态图象的生成
`j${B}W;}0By Brad Buylger 译者:sunnydogyPHPChina 开源社区门户#w~ mmvay9l
写在前面的话:PHPChina 开源社区门户-r{a.v^/H/`
在我们开始之前,我先给你一个写PHP的建议:避免使用没有定义的变量,否则不PHPChina 开源社区门户
Q6v-b$a#H$r`/Ul
能很明确的看出变量是否为空。在一个比较函数中,如果有一个从未赋值的变量
*s
ZC
l'gaS5Ae1l0就会产生错误。但如果已经设置了变量$what,那么可以通过函数isset($what)来
MtE;@
rt"j0避免这个错误。
5v&J!~._
~0让我们看看下面的原代码,如果第一次浏览该页或者用户置表单为空,则默认值PHPChina 开源社区门户*ZnqF~5y._
为“Go!”;如果用户输入了信息并提交了表单,这段代码将被重新调用且进行
'D)C!j$C3v#sP DA0初始化。
'^z!se6sZ0<? If (!isset($string)||$string==””){$string=”Go!”;}?>PHPChina 开源社区门户w2X;t&w,E$KqCGu
<form action=button.phtml>
G B d?*h)Otq_0Button text;
3b q;[g:\l$u^0<input type=text name=string value=”<? pint $string; ?>”>
I/Wm(M5l9E"_0<input type=submit>
^
w-I Vs*P8|:a-g\8II0</form>
-@z.A_7Xf0这个文件的其余的部分就是简单的在表格中输出一些元素和调用其他的文件。
#NW H!bG EOP|-K0现在,我们开始制作按钮。第一个例子是生成一个黑边儿绿底儿的椭圆文字按钮PHPChina 开源社区门户f| ?@/o%W3D*Q3cC
。我们通过一个标准的<IMG>标签儿来显示按钮图象;SRC的值是生成按钮图象的
7N1J1N D%r"Z0文件。PHPChina 开源社区门户:J0Y&?iX*])jj
<img src=”green_ellipse.phtml?string=<? print rawurlencode($string);PHPChina 开源社区门户AJ!| X9pDq_
?>PHPChina 开源社区门户 dO"n e;zl1pN
下面让我们看看生成椭圆的文件“green_ellipse.phtml”PHPChina 开源社区门户$Xv,o:@
c?,S
生成椭圆PHPChina 开源社区门户%Gm
Dr/K%Ce
这里列出了green_ellipse.phtml的原代码,我们以Header()开头,可以向ApachPHPChina 开源社区门户/eg;{ EQmXU$\_H
e服务器发从一个HTTP的头信息,这一步告诉Server使用的什么数据,在这里是GPHPChina 开源社区门户3yIHf
V,e:pw)D
IF的格式:
(_G!l*yw`0<?PHPChina 开源社区门户V&P~!B-O4}7H1a/b
Header(“Content-Type: image/gif”);
KU&C6N4fpLd0我们使用内嵌的五号字体来显示这个字符串。下面的两个函数返回这种字体的字
5z8u Y|6S9I6v/[0符高度和宽度(象素值)。这是一个定宽字体,所以我们得到字符串的精确的尺
IjJ+k
i+F(`0寸。
_4l3F4l9P6nB
@0$font_height=ImageFontHeight(5);PHPChina 开源社区门户,peP+Z aXK
$font_width=ImageFontWidth(5);
/Cdsyzj?0$str_width=$font_width*$chars;PHPChina 开源社区门户P fag*^w5XpG
$str_height=$font_width,;PHPChina 开源社区门户JD2P#|5cl]
图象的尺寸就北定到了略高于40个象素,略宽于字符串的长度:
pm!`+A%\}0$img_width=$str_width+40;PHPChina 开源社区门户]$v)n&nh Wk
$img_height=$str_height+40;
5j'UCkgvF
T)d0现在我们将生成一幅空的图象,置于内存,并且将其赋值给变量$id:PHPChina 开源社区门户:s7z
I&E6^S
$id=ImageCreate($img_width,$img_height);PHPChina 开源社区门户y!H~ z0Pix
我们需要对图象加以润色,函数ImageColorAllocate()的最后三个参数被调节为PHPChina 开源社区门户"rn6~V)kB
三部分,也就是从HTML的十六进制颜色代码调节为你常用的十进制代码(FF=255
.y7k2\"T*r.?/ykQI0)。PHPChina 开源社区门户'~
x1h@N
$black=ImageColorAllocate($id,0,0,0);PHPChina 开源社区门户!vvZ/w3Q!g C)L"R
$green=ImageColorAllocate($id,0,255,0);PHPChina 开源社区门户#_J8eQ:|-Q6Bm.A
$white=ImageColorAllocate($id,255,255,255);PHPChina 开源社区门户:K4[S(}}8xE.ZO9?
函数ImageColorTransparent()的作用是把图象中变量$white的值设为透明色。通
4V9w a6i;O\)]'h0过初始化滤掉该颜色,使得我们将背景置为透明。
q3s9t;f4s@0$trans=ImageColorTransparent($id,$white);PHPChina 开源社区门户^/C9~,J2p F?y{
ImageFill($id,0,0,$white);PHPChina 开源社区门户QEY+],ed&C @*@
现在我们将以$img_center_x和$img_center_y为中心画一个弧,该弧应比字符串
LIq&e1guxQ JF0略宽于28个象素,同时比字体略高28个象素。它将从0度角开始顺时针方向画过3PHPChina 开源社区门户5w:W4JsX*v,A _
60度,作出一个闭合的椭圆。这将作为边缘,所以我们用变量$black定义的颜色PHPChina 开源社区门户}$gY@UAo
来填充它。
L.[tM
VG0$img_center-x=$img_width/2;PHPChina 开源社区门户[F2MQq?
$img_center_y=$img_height/2; ImageArc(
@kF|n(Z9w:q0$id,$img_center_x,$img_center_y,$str_width+28,$str_height+28,0,360,$blPHPChina 开源社区门户2d#jpuaI^9`
ack);PHPChina 开源社区门户;wv6z%lU&l+h
我们必须再画一个比这两个尺寸小4个象素的椭圆,并用变量$green定义的颜色填PHPChina 开源社区门户y8^5N3p"W
I0] o[e
充这个按钮的主要区域。
SI7Mq7z0ImageArc($id,$img_center_x,$img_center_y,$str_width+24,$stPHPChina 开源社区门户(XF*EC'^'Mnk8tU
r_height+24,0,360,$green);
XY {oM$u0ImageFill($id,$img_center_x,$img_center_y,$green);PHPChina 开源社区门户7i'cedwQP
{
接下来,我们将使用内嵌的五号字在按钮上写上文字,当然要把字的中心与椭圆PHPChina 开源社区门户h
w+{DW.f\/K
的中心重合了。最后给按钮上的文字设置变量$black的颜色:
0C!pH;LD4Oa0}0ImageString($id
"W5X%T B$d5@g0, 5
j"vS@zfo0,($img_center_x-($str_width/2+1), img_center_y-(PHPChina 开源社区门户o%~'ttl
$str_height/2))PHPChina 开源社区门户EU5|,D yD*@8F
, $stringPHPChina 开源社区门户d,x,lpG*}`O
, $black
YL[ l Bzq%X0);PHPChina 开源社区门户'fr
L*f6[R
最后,把图象从内存中道出到标准输出缓冲——这是Server将得到的图象的内容
4g7Mka-EO%R:ee0:
iNA;R
_hML0ImageGIF($id);PHPChina 开源社区门户sL7p%?rg.iS&h
?>
4c;PT
V9nC]8yk+i0怎么样?很酷吧!!
1l1^)?7{r.t'CE0但这只适合像”Go!”这样短的按钮,像”Submit Secure Order”这样的长字符PHPChina 开源社区门户8a!_ht&q8|
串就会不好看。没关系,看看下面这个圆边矩形。PHPChina 开源社区门户C'LM+L^hv_.X
更美观的图样PHPChina 开源社区门户XT(?l{RyS.Pz.C
这个例子将生成一个黑边儿,黄色棱角的图样。你可以看到这种方法比第一个例PHPChina 开源社区门户,B2l0iY]UmO0W#g
子更适合长字符串的按钮。PHPChina 开源社区门户+VSv/\"GT+m/Y&U
如果你看了前面的代码,这里的代码你就容易看懂了。我将从生成按钮的形状开PHPChina 开源社区门户n?
X
ctyHh9d
始。
Ft_E6r~8zt0在每一个字符串的结尾处建立20个象素的边缘,并在字符串的上下各建10个象素
.T&p3Px/X#]$aDi5E V0的边缘:PHPChina 开源社区门户Ev+v1~~dN|
$img_width=$str_width+40;
4H5\Y(I7E
l&lp0$img_height=$str_height+20;
/g5Hgswo.k9@Y-A
YT0$id=ImageCreate($img_width,$img_height);
T4gkJw%b5u0$black=ImageColorAllocate($id,0,0,0);
1D&md\RUI6dZ0$yellow=ImageColorAllocate($id,255,255,0);
L
tBH-|6c0$white=ImageColorAllocate($id,255,255,255);
3xI.|
FJyTAX0$trans=ImageColorTransparent($id,$white);PHPChina 开源社区门户rs#l2Vo
ImageFill($id,0,0$white);
/o!b;NOR#d0$img_center_x=$img_width/2;
[#D/^7W,J0$img_center_y=$img_height/2;PHPChina 开源社区门户9QMR^P7D0z
让我们先画一个“左括号”,我们将生成一个圆弧,圆心在字符串开始的地方(
!F7bC9`(k0x赋值为20,y赋值为图象的中心。我随意的断定宽度比字符串的高度宽20个象素PHPChina 开源社区门户:Ob$m^7Q*p
,并从90度画到270度(0度开始于3点的地方)
~-wA5B+h0所有这些在图象的左端画了一个半圆,再从六点通过九点画到12点:PHPChina 开源社区门户^.O5at}U
ImageArc($id,20,$img_center_y,20,$str_height+20,90,270,$black);PHPChina 开源社区门户+~R oQV}N4U(R*X'x
对于右端,是同上面一样的,只是从右端20象素开始画起,并且掠过相反的半圈PHPChina 开源社区门户C;A7E*G_%Eu
儿——从12点通过3点到六点:
,lJqp(cLQ$a0ImageArc($id,($img_width-20),$img_center_y,20,$PHPChina 开源社区门户)S
T_&j'a/?n
img_height+20,270,90,$black);