当前位置: 首页 > 文章教程  > 计算机与互联网 > 网络编程

第12章图形图表类

9/17/2020 9:34:15 PM 人评论

第12章图形图表类

第12章 图形图表类

PHP不仅限于只产生HTML的输出,还可以创建及操作多种不同图像格式的图像文件,包括GIF、PNG、JPEG、WBMP和XBM等多种图像格式。更方便的是,PHP可以直接将图像流输出到浏览器。要处理图像,需要在编译PHP时加上图像函数的GD库。

12.1 使用GD创建图像

在PHP中使用GD库来对图像进行操作,GD表示Graphics Draw,但业界一般更习惯将其缩写为GD。它是一个开放的动态创建图像的源代码公开的函数库,可以从官方网站“http://www. boutell.com/gd”处下载。

GD库是被默认安装的,但是要想激活GD库,必须修改php.ini文件。将该文件中的“;extension=php_gd2.dll”选项前的分号删除,保存修改后的文件,并重启Apache服务器即可生效。在成功加载GD2函数库后,可以通过phpinfo()函数来获取GD2函数库的安装信息,验证GD库是否安装成功。

在PHP中创建一个图像通常需要以下4个步骤。

  • 创建一个背景图像,以后所以操作都是基于此背景。
  • 在图像上绘图轮廓或者输入文本。
  • 输出最终图形。
  • 清除内存中所有资源。

要在PHP中建立或者修改一个图像,必须首先建立一个图像标识符号。这里提供调用函数来实现,如下所示:

resource imagecreatetruecolor ( int x_size, int y_size )

imagecreatetruecolor()函数返回一个图像标识符,代表了一幅大小为x_size和y_size的黑色图像。

在一个图像上绘图和打印文本需要两个步骤:首先需要的是选择颜色。这里通过调用PHP提供的函数ImageCreateTrueColor()为图像选择颜色。颜色由红、绿、蓝(RGB)值的组合决定。该函数使用语法如下:

int imagecolorallocate ( resource image, int red, int green, int blue )

然后需要使用其他函数将颜色绘制到图像中。这些函数的选择取决于要绘制的内容:直线、弧形、多边形或者文本。下面就示例代码中将会使用到的3个函数做一下介绍:

bool imagefill ( resource image, int x, int y, int color )

imagefill()函数在image图像的坐标x,y(图像左上角为0,0)处用color颜色执行区域填充(即与x,y点颜色相同且相邻的点都会被填充)。

注意 PHP中图像的起始坐标从左上角开始,该点坐标为x=0,y=0图像右下角的坐标x=$width,y=$height。这与常规作图习惯是相反的。

bool imageline ( resource image, int x1, int y1, int x2, int y2, int color )

imageline()函数用color颜色在图像image中从坐标x1,y1到x2,y2(图像左上角为0,0)画一条线段。

bool imagestring ( resource image, int font, int x, int y, string s, int col )

imagestring()用col颜色将字符串s画到image所代表的图像的x,y坐标处(这是字符串左上角坐标,整幅图像的左上角为0,0)。如果font是1,2,3,4或5,则使用内置字体。

注意 如果font字体不是内置的,则需要导入字体库以后该函数才可正常使用。

创建图像以后就可以输出图形或者保存到文件中,如果需要直接输出可以使用Header()函数来发送一个图形头来欺骗浏览器,使它认为运行中的PHP页面是一幅真正的图像。

Header("Content-type: image/png");

发送标题数据后,就可以使用imagepng()函数来输出图像数据。该函数的使用语法如下:

bool imagepng ( resource image [, string filename] )

最后需要清除创建该图像所占用的内存资源。可以调用PHP提供的imagedestroy()函数,使用语法如下:

bool imagedestroy ( resource image )

imagedestroy()释放与image关联的内存。其中image是由图像创建函数返回的图像标识符。这样做是为了降低CPU负荷。如果不使用该函数而且在Web端有太多这样的图片产生任务,可能会导致性能下降。

代码12-1是使用GD创建图像的一个例子。

代码12-1 使用GD创建图像

<?php 
$height = 300;                                              //图像高度 
$width = 300;                                               //图像宽度 
$im = ImageCreateTrueColor($width, $height);                //创建一个真彩色的图像 
$white = ImageColorAllocate ($im, 255, 255, 255);           //白色 
$blue = ImageColorAllocate ($im, 0, 0, 64);                 //蓝色 
ImageFill($im, 0, 0, $blue);                                //将背景设置为蓝色 
ImageLine($im, 0, 0, $width, $height, $white);              //在图像上画一条白色的直线 
ImageString($im, 4, 80, 150, "PHP", $white);                //在图像上显示白色的“PHP”文字
Header("Content-type: image/png");                          //输出图像的MIME类型 
ImagePng($im);                                              //输出一个PNG图像数据 
ImageDestroy($im);                                          //清空内存 
?>

以上代码的思路已经很清晰,首先创建一个画布,然后在画布上画图形,输出图像并取消所占的内存。运行该代码后,得到的图像如图12.1所示。

016-01

图12.1 使用GD创建图像

12.2 创建缩略图

当然,如果用户需要仔细查看图像,就应显示完整尺寸的图像。但是如果一个图片文件很大,那么它在被浏览的时候载入就会很慢,或者需要使用指定大小的图片时,那么就会使用到缩略图。本节将讨论如何自动创建图片的缩略图,便于更好更快地展示图片。

使用PHP创建一个图片的缩略图也是很方便的,这里需要使用到一个系统提供的图像拷贝函数imagecopyresampled(),该函数的使用语法如下:

bool imagecopyresampled ( resource dst_image, resource src_image, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h )

imagecopyresampled()将一幅图像中的一块正方形区域复制到另一个图像中,平滑地插入像素值,因此,既缩小了图像又仍然保持了极大的清晰度。如果成功则返回TRUE,失败则返回FALSE。很多人不会使用这个函数,常常是因为对它的参数要求不了解。其中的10个参数代表的意义如下。

  • dst_image:新建的图片。
  • src_image:需要载入的图片。
  • dst_x:设定需要载入的图片在新图中的x坐标。
  • dst_y:设定需要载入的图片在新图中的y坐标。
  • src_x:设定载入图片要载入的区域x坐标。
  • src_y:设定载入图片要载入的区域y坐标。
  • dst_w:设定载入的原图的宽度(在此设置缩放)。
  • dst_h:设定载入的原图的高度(在此设置缩放)。
  • src_w:原图要载入的宽度。
  • src_h:原图要载入的高度。

当然除了要图像拷贝函数外,在开始时需要用到图片载入函数来创建图片,就是原图。因为下面的例子中需要用到的图片是JPG格式的,所以这里就介绍一下imagecreatefromjpeg()函数。使用该函数的语法如下:

resource imagecreatefromjpeg ( string filename )

imagecreatefrompng()返回一个图像标识符,代表了从给定的文件名取得的图像。如果使用的是其他格式的图片,同样PHP也提供相应的函数,使用方法也是基本相同的。代码12-2是一个使用PHP创建缩略图的例子。

代码12-2 创建缩略图

<?php 
$image = imagecreatefromjpeg("images/cat.jpg");                    //从 JPEG 文件或 URL 新建一图像 
$width = imagesx($image);                                          //得到图像的宽度 
$height = imagesy($image);                                         //得到图像的高度 
$thumb_width = $width * 0.5;                                       //设置缩略图宽度为原图的一半 
$thumb_height = $height * 0.5;                                     //设置缩略图高度为原图的一半 
$thumb = imagecreatetruecolor($thumb_width, $thumb_height);        //创建一个原图一半大小的画布 
//将原图按指定大小复制到画布上,得到缩略图 
imagecopyresampled($thumb, $image, 0, 0, 0, 0, $thumb_width, $thumb_height, $width, $height);
 imagejpeg($thumb, "images/cat_thumb.jpg", 100);                  //将缩略图保存到文件夹里 
imagedestroy($thumb);                                             //清除占用的内存 
?> 
<span class="kindle-cn-bold">使用PHP创建缩略图</span><hr /> 
<table> 
    <tr> 
        <td>原图:</td> 
        <td>缩略图:</td> 
    </tr> 
    <tr> 
        <td><img src="images/cat.jpg" /></td> 
        <td valign="top"><img src="images/cat_thumb.jpg" /></td> 
    </tr> 
</table>

以上代码,首先通过imagecreatefromjpeg()函数创建一个原图,然后用imagecopyresampled()函数将原图按指定的大小复制,最后使用imagejpeg()函数将生成的缩略图保存成相应的文件。其中原图的宽度和高度是分别使用imagesx()和imagesy()这两个函数得到的。

运行上述代码后得到的效果如图12.2所示。

015-01

图12.2 使用PHP创建缩略图

12.3 给图片加水印

给图片加水印是一个常用的功能。可以加商标的水印,用这种方式保护已获得版权的图像。或者加网站的网址,以此来达到宣传网站的目的等。本节就来讲解如何使用PHP给图片加水印。

其实给图片加水印与创建图片缩略图的思想是差不多的。首先需要载入一个原图,然后在原图的基础上加上相应的图片。

通常所加的水印都是有透明度的,所以选择的是一个PNG格式的图片作为需要添加的水印。载入时需要另外一个创建图像的函数imagecreatefrompng(),其语法使用如下:

resource imagecreatefrompng ( string filename ) 

该函数接受一个参数,指向一个PNG图片的路径。如果所指的图片不是PNG格式的,就会报错。

同样和创建缩略图时一样,也需要用到imagecopyresampled()函数,来对图像进行一个复制操作。关于这个函数的具体用法在前一节中已做详细介绍。这里需要说明一下的是,PHP还提供imagecopy()函数来对图像进行复制操作。但是使用这个函数对图像进行操作时,没有使用imagecopyresampled()函数处理得平滑,所以如果没有特殊要求,一般都可以使用imagecopyre sampled()函数。

代码12-3是给图片加水印的例子。

代码12-3 给图片加水印

<?php 
$image = imagecreatefromjpeg("images/dog.jpg");                //从JPEG文件新建一个图像 
$watermark = imagecreatefrompng("images/xing.png");            //从PNG文件新建一个图像 
$width = imagesx($watermark);                                  //得到水印的宽度 
$height = imagesy($watermark);                                 //得到水印的高度 
//将水印加载到图像上 
imagecopyresampled($image, $watermark, 0, 0, 0, 0, $width, $height, $width, $height); 
imagejpeg($image, "images/dog_water.jpg", 100);                //将带有水印的图像保存到文件 
imagedestroy($image);                                          //清除占用的内存 
?> 
<span class="kindle-cn-bold">使用PHP给图片加水印</span><hr /> 
<table> 
    <tr> 
        <td>原图:</td> 
        <td>加水印后的图片:</td> 
    </tr> 
    <tr> 
        <td><img src="images/dog.jpg" /></td> 
        <td><img src="images/dog_water.jpg" /></td> 
    </tr> 
</table>

以上代码中,首先使用imagecreatefromjpeg()和imagecreatefrompng()函数分别载入需要加水印的底图和水印图片。得到水印图片的宽度和高度后,使用imagecopyresampled()函数将水印图片复制到底图上,这样就完成对一个图片加水印的过程。最后输出到页面上的效果如图12.3所示。

015-01

图12.3 给图片加水印

12.4 给图片加文字

除了给图片加水印外,给图片加文字也是很常用到的功能。给图片加文字也就是在图片上设计自己的个性签名,这节就教您设计自己的个性签名。

对图片添加文字,需要特别介绍imagettftext()这个函数,该函数的使用语法如下:

array imagettftext ( resource image, float size, float angle, int x, int y, int color, string fontfile, string text )

imagettftext()使用TrueType字体向图像写入文本。需要对其提供8个输入参数,它们分别代表的意义如下。

  • image:图像资源。
  • size:字体大小。根据GD版本不同,应该以像素大小(GD1)或点大小(GD2)指定。
  • angle:角度制表示的角度,0°为从左向右读的文本。更高数值表示逆时针旋转。例如90度表示从下向上读的文本。
  • x:由x,y所表示的坐标定义了第一个字符的基本点(大概是字符的左下角)。这和imagestring()不同,其x,y定义了第一个字符的左上角。例如"top left"为0,0。
  • y:y坐标。它设定了字体基线的位置,不是字符的最底端。
  • color:颜色索引。使用负的颜色索引值具有关闭防锯齿的效果。
  • fontfile:是想要使用的TrueType字体的路径。
  • text:文本字符串。

因为有时候需要使用中文文字,而这个函数接受的文本字符串需要是UTF-8格式编码的。所以如果输入的字符串不是UTF-8,需要对其先进行编码转换。这里介绍一个在编码转换时常用的函数mb_convert_encoding()函数,使用语法如下:

string mb_convert_encoding ( string str, string to_encoding [, mixed from_encoding] )

mb_convert_encoding()函数接受3个参数,把输入的str字符从from_encoding编码转换到to_encoding编码。当第3个参数省略时,会被自动设定为PHP文件的编码。

Tips 当不确定需要转换的字符串是什么格式的时候,可以设定from_encoding为多个字符集,使用逗号隔开,如“UTF8, GBK, GB2312”。

代码12-4是给图片加文字的一个例子,如下所示。

代码12-4 给图片加文字

<?php 
$image = imagecreatefromjpeg("images/green.jpg");                   //从JPEG文件新建一个图像 
$pink = ImageColorAllocate($image, 255, 255, 255); 
// $fontfile 字体的路径,视操作系统而定,可以是 simhei.ttf(黑体) , SIMKAI.TTF(楷体), SIMFANG.TTF(仿宋) ,SIMSUN.TTC(宋体&新宋体)等 GD 支持的中文字体 
$font_file = "C:\WINDOWS\Fonts\msyhbd.ttf";  
$str = "我喜欢PHP!^^"; 
$str =  mb_convert_encoding($str, "UTF-8", "GBK");                  //字符转码 
imagettftext($image, 25, 10, 140, 240, $pink, $font_file, $str);    //设置文字颜色 
imagejpeg($image, "images/green_ttf.jpg", 100);                     //将带有水印的图像保存到文件 
imagedestroy($image);                                               //清除占用的内存 
?> 
<span class="kindle-cn-bold">使用PHP给图片加文字</span><hr /> 
<table> 
    <tr> 
        <td>原图:</td> 
        <td>加文字后的图片:</td> 
    </tr> 
    <tr> 
        <td><img src="images/green.jpg" /></td> 
        <td><img src="images/green_ttf.jpg" /></td> 
    </tr> 
</table>

以上代码首先使用imagecreatefromjpeg()函数将图片载入,然后使用imagettftext()函数将需要写入的字符串画到底图上。图12.4是代码运行后的效果。

015-01

图12.4 给图片加文字

12.5 典型实例

【实例12-1】图形不仅可以用于展示数据,还可以用于安全认证。常见的就是在用户注册、登录或重要操作之前的认证码功能。

本实例主要使用到的是imagesetpixel()和imagestring()函数。

imagesetpixel()函数用于在画布上绘制点,生成一些干扰元素,以防止非法用户破解认证码的内容。

imagestring()函数,负责把单个字符,按顺序写入到画布中,为了加强安全性,这些写入的字符除了顺序相同外,角度和位置都不会相同。

代码12-5 imagesetpixel()和imagestring()函数的使用

<?php 
session_start(); 
//设置验证码可取的字符,去掉不易辨认的字符 
$chars="23456789ABCDEFGHJKLMNPRSTWXY"; 
$string=""; 
//随机从字符串中取得字符,并组成字符串 
for($i=0;$i<5;$i++){ 
    $rand    =rand(0,strlen($chars)-1);        //取得随机数 
    $string .= substr($chars,$rand,1);          //根据随机数,取得字符 
} 
//注册一个Session变量,用于下一页读取认证码 
$_SESSION["string"]=$string; 
$imageWidth = 120;                          //设置图形宽与高 
$imageHeight = 30;                          //使用imagecreate()函数创建图形 
$im = imagecreate($imageWidth,$imageHeight); 
$backColor = ImageColorAllocate($im, rand(220,255),rand(220,255),rand(220,255)); //背景色 
imagefilledrectangle($im, 0, 0, $imageWidth, $imageHeight, $backColor);       //填充图形颜色 
//随机在画布上画100个颜色点 
for($i=0;$i<100;$i++){    //画斑点 
    $dotColor = ImageColorAllocate($im, rand(0,255),rand(0,255),rand(0,255)); //设置点的颜色 
    $x = rand(0,$imageWidth); $y = rand(0,$imageHeight); 
    imagesetpixel($im, $x, $y, $dotColor);     //使用imagesetpixel()画点 
} 
for($i=0;$i<strlen($string);$i++){ 
    //设置字的颜色 
    $frontColor = ImageColorAllocate($im, rand(0,120),rand(0,120),rand(0,120)); 
    //把字符写入图形中 
    imagestring($im,10, rand(20*$i+1,20*$i+10), rand(0,5), substr($string,$i,1),$frontColor); 
} 
header( "Content-type: image/x-png ");             //输出图形格式 
imagepng($im);                              //输出PNG格式图形 
imagedestroy($im);                           //释放资料 
exit(); 
?>

运行该程序后,运行结果如图12.5所示。

015-01

图12.5 程序运行结果

【实例12-2】PHP图形处理的函数很丰富,包括了图形处理的信息、颜色、格式、字体、通道等操作。使用PHP图形函数,可以构建几何图形来展示数据。

在很多情况下,通过图形展示数据,往往比数据本身更加直观。而饼形图在展示数据分配比例时,是再好不过的选择了。

本实例主要使用到的函数是imagefilledarc()函数。其作用是绘制椭圆弧,并使用指定的颜色进行区域填充。

代码12-6 imagefilledarc()函数的使用

<?php 
//定义一个用于生成饼状图的函数 
function showData($array){ 
    $image = imagecreate(400,400);                      //创建一个图形句柄 
    $bgColor = imagecolorallocate($image,255,255,255);    //设置背景颜色 
    //定义饼状图的中心点 
    $x = 200;                                           //中心点X坐标 
    $y = 200;                                           //中心点Y坐标 
    //定义椭圆弧的宽度和高度 
    $w = 380;                                           //宽度 
    $h = 380;                                           //高度 
    //定义一个计数器,用于指定存储临时数据 
    $i = 0; 
    //画出椭圆弧,并填充颜色 
    foreach($array as $point){ 
     $rc = imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255)); //随机取得颜色 
        //根据指字参数,画出椭圆弧并使用颜色填充 
        imagefilledarc($image, $x, $y, $w, $h,$i,$point,$rc, IMG_ARC_PIE); 
        $i = $point; 
    } 
    header('Content-type: image/png');                     //输出头文件信息 
    imagepng($image);                                  //输出PNG图形 
    imagedestroy($image);                               //释放资源 
} 
//定义一个用于存储调查数据的数组 
$array = array(0,20,160,220,360); 
//根据数组中的数据,画出饼状图 
showData($array); 
?>

运行该程序后,运行结果如图12.6所示。

016-01

图12.6 程序运行结果

12.6 小结

尽管本章介绍了许多内容,但也仅涉及到了使用GD扩展程序处理图像的皮毛。这里介绍了如何上传图像,重置图像的大小,改变图像的颜色,自动创建小图标,创建新图像,合并两幅图像等知识。

12.7 习题

一、填空题

1. 在PHP中要测试GD库是否加载通过需调用_____函数实现。

2. 按下列要求填空(其中$im为一个图像标识符)。

header("               "); 
imagepng($im);                       //输出PNG图像到浏览器

3. 按下列要求填空(其中$im为一个图像标识符)。

$red = imagecolorallocate($im,    ,    ,    );            //分配红色
$green = imagecolorallocate($im,    ,    ,    );               //分配绿色
$blue = imagecolorallocate($im,    ,    ,    );                //分配蓝色

4. 在图像中画一个填充的多边形的函数是_____,在图像中画一个填充的椭圆的函数是_____,在图像中画一个矩形的函数是_____,在图像中画一条虚线的函数是_____。

二、选择题

1. 以下扩展名中,不是属于图片的是( )。

A. jpg
B. gif
C. png
D. pdf

2. 下列GD图像函数中,用来创建图像标识的是( )。

A. imagecreatetruecolor()
B. imagecolorallocate()
C. imagefill()
D. imageline()

3. 可以用来指定生成图片质量高低的函数是( )。

A. imagepng()
B. imagegif()
C. imagewbmp()
D. imagejpeg()

三、简答题

1. 在PHP中创建图像有哪两种方式?

2. 若要向图像中写入中文,需要注意什么?

相关教程

共有条评论 网友评论

验证码: 看不清楚?