用php开发图形
使用GD库可以生成各种图形,比如:GIF、PNG、GPEG、WBMP和XPM等格式的图形。
需要开启 GD2 DLL php_gd2.dll 扩展库。
先来看一个示例:
例23-1 一个简单的图形。
<?php
// 加载生成图片的页面,须做相应的页面头设置,否则会出现乱码header("Content-type: image/png");
$string="WHOSAX.COM";
// 读取当前上当下的一个PNG格式的图片并生成一个图片资源
$im=imagecreatefrompng("test_17_1.png");
// 在该图片中生成一个调色板
$color=imagecolorallocate($im, 0, 0, 0);
// 在图片内插入文字
imagestring($im, 6, 5, 9, $string, $color);
// 显示图片
imagepng($im);
// 销毁图片,释放内存空间
imagedestroy($im);
?>
通过上例,可以简单概括如下:
- 一个图形页面,页面header须设置,否则会出现乱码。上例中的图形是生成的,它不是在页面中插入的;
- 在图形使用结束后,要立即销毁图形,以释放内存空间;
- 上例使用到了5个图形函数,分别介绍如下:
resource imagecreatefrompng ( string $filename )
该函数读取某个PNG格式的图形并生成一个新的图形;
函数参数为string 类形,值为所读取图形的URL
函数返回图形资源,如果读取失败,返回一个FALSE 值。
int imagecolorallocate ( resource $image , int $red , int $green , int $blue )
该函数在图形资源内生成一个调色板;
函数第一个参数为图形资源句柄,其余三个分别为红色、绿色和蓝色值;
函数返回一个int类型的色调值。
bool imagestring ( resource $image , int $font , int $x , int $y , string $string , int $color )
该函数在图形资源里生成一个字符串
函数的参数分别为:图形资源句柄、字体大小(从1至6)、字符串的横坐标、纵坐标(以左上角为原点)、色调值。
bool imagepng ( resource $image [, string $filename [, int $quality [, int $filters ]]] )
该函数输入图形
函数参数分别为:图形资源句柄、生成文件名或URL、压缩程度(1-9)、过滤程度;
函数返回一个布尔值。
bool imagedestroy ( resource $image )
该函数释入图形所占的内存资源
函数参数为:图形资源
函数返回一个布尔值。
例23-2
<?php
// 读取当前目录下的stamp.png和photo.jpeg图片
$stamp = imagecreatefrompng('test_17_2.1.png');
$im = imagecreatefromjpeg('test_17_2.2.jpeg');
// 设置stamp.png图片的底边距和右边距
$marge_right = 10;
$marge_bottom = 10;
// 求出stamp.png的长、宽
$sx = imagesx($stamp);
$sy = imagesy($stamp);
// 将stamp.png图片复制至photo.png中。stamp.png图片底边距,右边距按照上述的设置
imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));
// 输出图片,销毁图片
header('Content-type: image/png');
imagepng($im);
imagedestroy($stamp);
imagedestroy($im);
?>
在上例中介绍了图形的复制函数
bool imagecopy ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h )
该函数将某一图形复制到另一图形之中;
函数的参数分别为:粘图句柄、容图句柄、粘图横坐标、纵坐标(以浏览器左上角为原点)、容图横坐标、纵坐标、粘图宽度、粘图高度;
该函数返回一个布尔值。
例23-3
<?php
header ('Content-type: image/png');
// 生成一个55*30的图形
$im = imagecreatetruecolor(355, 230);
$bg = imagecolorallocate($im, 30, 85, 91);
// 画一个矩形。
imagefilledrectangle($im, 140, 80, 10, 20, $bg);
// 输出图形
imagepng($im);
imagedestroy($im);
?>
上例中涉及到的新函数:
resource imagecreatetruecolor ( int $width , int $height )
该函数生成一个图形
函数的两个参数分别为:图形长和宽
函数返回值为图形资源或FALSE
bool imagefilledrectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color )
该函数在图形资源内嵌一个方形;
函数的参数分别为:图形资源句柄、方形长度、方形宽度、方形X坐标,方形Y坐标,颜色值;
函数返回布尔值。
例23-4 生成一个图片验证码。
图形页面与文字页面的header设置是不同的,后者能读取前者URL来获得图形。
新建一个exam_17_4.1php
<?php
header("Content-type: image/png");
session_start();
$_SESSION['img']=rand(100000,999999);
$im=imagecreatetruecolor(65,25);
$color=imagecolorallocate($im,255,255,255);
imagestring($im,7,5,5,$_SESSION['img'],$color);
for($i=0;$i<100;$i++){
$rx=rand(0,65);
$ry=rand(0,25);
$r=rand(0,255);
$g=rand(0,255);
$b=rand(0,255);
$rc=imagecolorallocate($im,$r,$g,$b);
imagesetpixel($im,$rx,$ry,$rc);
}
imagepng($im);
imagedestroy($im);
?>
再新建exam_17_4.2.php
<img src="exam_17_4.1.php" /><br />
<form method="POST">
<input name="img" size="10" />
<input type="submit" value="验证" />
</form>
<?php
session_start();
if(!array_key_exists('img',$_POST))exit;
if($_POST['img']==$_SESSION['img']){
print "<font color='green'>正确</font>";
}else {
print "<font color='red'>失败</font>";
}
?>