怎样用PHP生成gif动画或WBMP格式的动画?

发布时间:2011年04月12日      浏览次数:705 次
PHP动态图象的生成
写在前面的话:
在我们开始之前,我先给你一个写PHP的建议:避免使用没有定义的变量,否则不
能很明确的看出变量是否为空。在一个比较函数中,如果有一个从未赋值的变量
就会产生错误。但如果已经设置了变量$what,那么可以通过函数isset($what)来
避免这个错误。
让我们看看下面的原代码,如果第一次浏览该页或者用户置表单为空,则默认值
为"Go!";如果用户输入了信息并提交了表单,这段代码将被重新调用且进行
初始化。
<? If (!isset($string)||$string==""){$string="Go!";}?>
<form action=button.phtml>
Button text;
<input type=text name=string value="<? pint $string; ?>">
<input type=submit>
</form>
这个文件的其余的部分就是简单的在表格中输出一些元素和调用其他的文件。
现在,我们开始制作按钮。第一个例子是生成一个黑边儿绿底儿的椭圆文字按钮
。我们通过一个标准的<IMG>标签儿来显示按钮图象;SRC的值是生成按钮图象的
文件。
<img src="green_ellipse.phtml?string=<? print rawurlencode($string);
?>
下面让我们看看生成椭圆的文件"green_ellipse.phtml"
生成椭圆
这里列出了green_ellipse.phtml的原代码,我们以Header()开头,可以向Apach
e服务器发从一个HTTP的头信息,这一步告诉Server使用的什么数据,在这里是G
IF的格式:
<?
Header("Content-Type: image/gif");
我们使用内嵌的五号字体来显示这个字符串。下面的两个函数返回这种字体的字
符高度和宽度(象素值)。这是一个定宽字体,所以我们得到字符串的精确的尺
寸。
$font_height=ImageFontHeight(5);
$font_width=ImageFontWidth(5);
$str_width=$font_width*$chars;
$str_height=$font_width,;
图象的尺寸就北定到了略高于40个象素,略宽于字符串的长度:
$img_width=$str_width+40;
$img_height=$str_height+40;
现在我们将生成一幅空的图象,置于内存,并且将其赋值给变量$id:
$id=ImageCreate($img_width,$img_height);
我们需要对图象加以润色,函数ImageColorAllocate()的最后三个参数被调节为
三部分,也就是从HTML的十六进制颜色代码调节为你常用的十进制代码(FF=255
)。
$black=ImageColorAllocate($id,0,0,0);
$green=ImageColorAllocate($id,0,255,0);
$white=ImageColorAllocate($id,255,255,255);
函数ImageColorTransparent()的作用是把图象中变量$white的值设为透明色。通
过初始化滤掉该颜色,使得我们将背景置为透明。
$trans=ImageColorTransparent($id,$white);
ImageFill($id,0,0,$white);
现在我们将以$img_center_x和$img_center_y为中心画一个弧,该弧应比字符串
略宽于28个象素,同时比字体略高28个象素。它将从0度角开始顺时针方向画过3
60度,作出一个闭合的椭圆。这将作为边缘,所以我们用变量$black定义的颜色
来填充它。
$img_center-x=$img_width/2;
$img_center_y=$img_height/2; ImageArc(
$id,$img_center_x,$img_center_y,$str_width+28,$str_height+28,0,360,$bl
ack);
我们必须再画一个比这两个尺寸小4个象素的椭圆,并用变量$green定义的颜色填
充这个按钮的主要区域。
ImageArc($id,$img_center_x,$img_center_y,$str_width+24,$st
r_height+24,0,360,$green);
ImageFill($id,$img_center_x,$img_center_y,$green);
接下来,我们将使用内嵌的五号字在按钮上写上文字,当然要把字的中心与椭圆
的中心重合了。最后给按钮上的文字设置变量$black的颜色:
ImageString($id
, 5
,($img_center_x-($str_width/2+1), img_center_y-(
$str_height/2))
, $string
, $black
);
最后,把图象从内存中道出到标准输出缓冲——这是Server将得到的图象的内容

ImageGIF($id);
?>
怎么样?很酷吧!!
但这只适合像"Go!"这样短的按钮,像"Submit Secure Order"这样的长字符
串就会不好看。没关系,看看下面这个圆边矩形。
更美观的图样
这个例子将生成一个黑边儿,黄色棱角的图样。你可以看到这种方法比第一个例
子更适合长字符串的按钮。
如果你看了前面的代码,这里的代码你就容易看懂了。我将从生成按钮的形状开
始。
在每一个字符串的结尾处建立20个象素的边缘,并在字符串的上下各建10个象素
的边缘:
$img_width=$str_width+40;
$img_height=$str_height+20;
$id=ImageCreate($img_width,$img_height);
$black=ImageColorAllocate($id,0,0,0);
$yellow=ImageColorAllocate($id,255,255,0);
$white=ImageColorAllocate($id,255,255,255);
$trans=ImageColorTransparent($id,$white);
ImageFill($id,0,0$white);
$img_center_x=$img_width/2;
$img_center_y=$img_height/2;
让我们先画一个"左括号",我们将生成一个圆弧,圆心在字符串开始的地方(
x赋值为20,y赋值为图象的中心。我随意的断定宽度比字符串的高度宽20个象素
,并从90度画到270度(0度开始于3点的地方)
所有这些在图象的左端画了一个半圆,再从六点通过九点画到12点:
ImageArc($id,20,$img_center_y,20,$str_height+20,90,270,$black);
对于右端,是同上面一样的,只是从右端20象素开始画起,并且掠过相反的半圈
儿——从12点通过3点到六点:
ImageArc($id,($img_width-20),$img_center_y,20,$
img_height+20,270,90,$black);
最后,从一端的端顶向另一端画一条直线,同样在底部也画一条直线。这样闭合
了形状的内部。
ImageLine($id,20,0,($img_width-20),0,$black);
ImageLine($id,20,$img_height-1,($img_width-20),$img_hei
ght-1,$black);
在这个区域里填充变量$yellow所定义的颜色,并充满整个区域:
ImageFillToBorder($id,$img_center_x,$img_center_y,$black,$yellow);
再将字符串写入到图象中,之后向标准输出打印图象:
ImageString($id
, 5
, ($img_center_x-($str_width/2)+1,($img_center_y-($str_height/2))
, $string
, $black
);
ImageGIF($id);
?>
好了,现在你知道怎样画了,下面让我们看看怎样用PHP修改一幅已经存在的图象

修改一幅已经存在的图象
我们将修改一幅已经存在的图象,将其存为一幅新的图象文件,同时显示一幅动
态的图象。
(再一次声明,有些浏览器是有保护作用的,所以你看不到源代码)这里我将给
出原程序。
首先,我们把mymonkdy.gif调入内存,并将其赋值给$id。
<?
$id=ImageCreateFromGif("mymonkey.gif");
现在我们设置字体颜色,并将它放到图象上。
$yellow=ImageColorAllocate($id,,255,255,0);
以左上角为(0,0)点,从(10,20)地方开始用内嵌四号字体写上字符串,同
时我将它设为大写,并加了感叹号,以使其显得更加生动。
ImageString($id,4,10,20,strtoupper($string."!"),$yellow);
现在我们将图象从内存存入文件newmonkey.gif。
ImageGIF($id,"newmonkey.gif");
?>
这样就差不多了:newmonkey.gif可以用来显示了,浏览器的设置是这样的:
<td>
<img src="newmonkey.gif" border=0>
</td>
</tr>
</table>
这样就好了
免责声明:本站相关技术文章信息部分来自网络,目的主要是传播更多信息,如果您认为本站的某些信息侵犯了您的版权,请与我们联系,我们会即时妥善的处理,谢谢合作!