1
2
3
4
5
6
7
8
9
10
11

数学函数

发布时间:2017-07-20 08:04   发布人:毛书朋   浏览次数:7052

 

关联课件:8子项目八 - 数学函数(点击在线预览)

 

        8.3.6  图像处理函数

 

            PHP提供了一系列函数来实现在网站编程中对图像进行编辑。虽然使用这些函数能够实现的功能十分有限,无法和功能强大的专业图形图像软件相比,但是在很多需要动态生成图像、自动批量处理图像等方面,能给PHP网站开发者带来巨大帮助。其中最为典型的应用有随机图形验证码、图片水印、数据统计中饼状图、柱状图的生成等。表8-7中给列出了PHP常用的图像处理函数。

 

表8-7  PHP常用图像处理函数

8-7.1.png

 

8-7.2.png

 

8-7.3.png

 

            PHP 5提供的图像处理函数总数超过了100个,表8-7中仅列出了部分常用函数。

            PHP的图像处理函数都封装在一个函数库中,这就是GD库。要使用GD库中的函数来进行图像处理,必须保证安装了GD库。在PHP官方的标准发行版本中,都包含了这个库。如本书介绍的PHP 5版本,这个GD库存放在PHP安装目录下的ext子目录下,名为php_gd2.dll。读者如果担心自己的PHP版本是否包含这个函数库,可以打开PHP安装目录查找一下。

            并不是php_gd2.dll库文件存在,就可以使用这些函数了。在默认的php.ini设置中,这个库并不自动载入。所以,需要首先打开这个库的自动载入功能,这样这个库中的函数就像PHP标准函数一样可以直接在程序中使用了。打开的方法很简单,用记事本打开php.ini配置文件,利用查找功能找到“;extension=php_gd2.dll”这一行,将最前面的分号去掉,然后保存,重新启动IIS(Apache),这时候GD库已经被自动加载了。如图8-20所示。

8-20.png

 

图8-20  开启GD图像函数库

 

            若要确定此函数库是否已经被成功加载,可以打开第2章中讲过的PHP环境信息显示程序,也就是phpinfo()程序,查看列出的信息中是否有GD一项。该项目中详细列出了当前PHP的GD库信息,如图8-21所示。

 

8-21.png

图8-21  GD库信息

            由于本部分函数个数较多,而且具体使用方法较为复杂,要在很有限的篇幅内进行一个较全面的介绍是十分困难的,这里仅给出两个例子,让读者先体会一下PHP图像处理函数的简单使用。对表中列出的其他函数以及未在表中列出的函数,感兴趣的读者可以参考PHP手册进行深入学习。

 

            8.3.6.2  PHP基本绘图

 

            通过下面一个例子来学习有关用PHP进行基本绘图的方法。

            1:  <?php

            2:     //程序8-22.php:图像处理函数使用举例

            3:     header("Content-type: image/png");

            4:     $im = @imagecreate(200, 100) or die("无法创建图像流");

            5:     @imagecolorallocate($im, 240, 150, 255);

            6:     $t_color1 = imagecolorallocate($im, 0, 0, 0);

            7:     $t_color2 = imagecolorallocate($im,100,100,100);

            8:     imagestring($im, 5, 8, 10,  "I like PHP5!", $t_color1);

            9:     imagestringup($im,5,8,90,"Hello!",$t_color2);

            10:    imageellipse($im,65,65,55,55,$t_color1);

            11:    imageellipse($im,65,65,55,55,$t_color1);

            12:    imagefilledrectangle($im,110,95,160,30,$t_color2);

            13:    imagepng($im);

            14:    imagedestroy($im);

            15: ?>

            程序8-22.php创建了一幅PNG图像,并且在图像上面进行绘图操作。程序运行结果如图8-22所示。

 

8-22.jpg

图8-22  程序8-22.php的运行结果

 

            程序8-22.php第3行指定了图像的类型,即png图像,这样8-22.php虽然是一个PHP程序,但是其作用是动态生成一张图像,因此几乎等同于一张图像。在本程序中普通的输出语句如echo等都是无效的,这一点读者应当注意。

            第4行用imagecreate()函数创建一幅新图像,两个参数为图像的宽度和高度,单位是像素。此函数返回此图像的数据流,存放于$im变量中。

            第5行用imagecolorallocate()函数设置了图像的背景颜色。4个参数分别为图像流、R色值、G色值、B色值。3个色值合并即产生了RGB色值。这里的240,150,255运行之后显示淡紫色。另外(0,0,0)为黑色,(255,255,255)为白色,(255,0,0)为红色等。关于RGB颜色的有关详细信息请读者自行查阅有关资料。

            第6~7行分别生成了2种颜色,存在的不同的变量中以备后面使用。第一种为黑色,第二种为浅灰色。

            第8行用imagestring()函数在图像上“写入”了一个字符串。6个参数分别表示图像流、所用字体、写入点的x坐标、写入点的y坐标、要写入的字符串、字符串颜色。这里面有两点值得注意:第一点是函数的第二个参数取值范围为1~5,分别代表了不同大小和是否加粗的5种字体,读者可以试着修改此参数来观察程序运行效果。第二点是这里的x,y坐标都是相对于图像的左上角,最左上角坐标为(0,0),向右为x轴,向下为y轴。单位都是像素。

            第9行用imagestringup()函数向图像中竖向写入一个字符串。函数的参数含义与imagestring()函数相同。

            第10行用imageellipse()函数在图像中绘制了一个圆。函数第一个参数为图像流,最后一个为绘图所用颜色,第2、3、4、5个参数分表表示圆心的x坐标、圆心的y坐标、圆的x方向半径长度、圆的y方向半径长度。在本例中,绘制了一个圆心在(65,65)这个点,半径为55的正圆。如果要绘制一个椭圆,只需要确定圆心位置,然后分别设置x方向半径和y轴方向半径即可。当这两个半径相等时是一个圆,不相等时是一个椭圆。

            第11行用imagefilledrectangle()函数绘制了一个矩形,并对矩形进行颜色填充。第一个参数为图像流,最后一个参数为填充颜色。第2、3、4、5个参数的含义分别为矩形左上角x坐标、矩形左上角y坐标、矩形右下角x坐标、矩形右下角y坐标。也就是说只要提供矩形的左上角和右下角坐标,即可绘制此矩形。

            第12行用imagepng()函数将此图像流输出为一张png格式的图片。也就是在浏览器中看到的图片。

            第13行销毁了这个图像流。

            在本例中除了png格式,还可以把图像输出为jpg、gif等常用的格式,只需要更改一下程序中第3行所指定的图像类型即可。

 

            8.3.6.3  网站图形验证码制作     

            

            图像验证码程序是当前Web开发中常用的程序。本章学习了PHP的图像处理函数,结合前面章节学习的session函数以及表单数据提交技术,可以写出一个完整的图像验证码程序。

            验证码在网站中的作用一般是防止恶意“灌水”,也就是恶意发布垃圾信息。如果没有验证码,攻击者可以利用辅助软件实现自动提交、自动注册等。由于软件执行的效率高、速度快且可以连续工作,因此常用来被攻击某个网站,制造大量垃圾数据,严重影响网站正常运行。

            采用了验证码的方式之后,由于验证码每次都不一样,只有验证码输入正确才能提交信息,这样辅助软件就无法随意向服务器提交信息了。因此,验证码的设计也有一些原则,如验证码的生成是随机的,无规律可循。另外,有的辅助软件有文字识别功能,能够从图片中辨析出文字,因此验证码中的数字可以采用随机的颜色,而且七扭八歪不易辨认。总之,最理想的验证码应该是人的肉眼可以很容易地辨认出来,但是用软件识别就极为困难。

            鉴于此,在设计这个验证码程序时,就不是简单的创建一幅图片,然后随机生成几个数字写上去,而是再加入一些干扰。用PHP提供的图像处理函数,可以在图像上加入一些密密麻麻的像素点,然后随机绘制两条虚线,再将几个数字的位置打乱。这样,机器识别就变得十分困难了。

            本实例用到以下3个文件。

            8-23-showimg.php:生成验证码,将验证码写入图片,并输出图片。

            8-23-login.html:调用showimg.php,将用户输入的验证码提交到check.php进行验证。

            8-23-check.php:用来验证用户输入的验证码是否正确。

            下面就来看一下具体的代码。

            1:  <?php

            2:     //文件8-23-shoimg.php:生成验证码图片,并输出

            3:     //随机生成一个4位数的数字验证码

            4:      $num="";

            5:      for($i=0;$i<4;$i  ){

            6:         $num .= rand(0,9);

            7:      }

            8:     //4位验证码也可以用rand(1000,9999)直接生成

            9:     //将生成的验证码写入Session,备验证页面使用

            10:     session_start();

            11:     $_SESSION["Checknum"] = $num;

            12:     //创建图片,定义颜色值

            13:     header("Content-type: image/PNG");

            14:     srand((double)microtime()*1000000);

            15:     $im = imagecreate(60,20);

            16:     $black = ImageColorAllocate($im, 0,0,0);

            17:     $gray = ImageColorAllocate($im, 200,200,200);

            18:     imagefill($im,0,0,$gray);

            19:     //随机绘制两条虚线,起干扰作用

            20:     $style = array($black, $black, $black, $black, $black, $gray, $gray,
 $gray, $gray, $gra y);

            21:    imagesetstyle($im, $style);

            22:    $y1=rand(0,20);

            23:    $y2=rand(0,20);

            24:    $y3=rand(0,20);

            25:    $y4=rand(0,20);

            26:    imageline($im, 0, $y1, 60, $y3, IMG_COLOR_STYLED);

            27:    imageline($im, 0, $y2, 60, $y4, IMG_COLOR_STYLED);

            28:    //在画布上随机生成大量黑点,起干扰作用;

            29:    for($i=0;$i<80;$i  ){

            30:         imagesetpixel($im, rand(0,60), rand(0,20), $black);

            31:    }

            32:    //将四个数字随机显示在画布上,字符的水平间距和位置都按一定波动范围随机生成

            33:     $strx=rand(3,8);

            34:      for($i=0;$i<4;$i  ){

            35:         $strpos=rand(1,6);

            36:         imagestring($im,5,$strx,$strpos, substr($num,$i,1), $black);

            37:         $strx =rand(8,12);

            38:    }

            39:    ImagePNG($im);

            40:    ImageDestroy($im);

            41: ?>

            程序中的重要位置都已经做了注释,再此不再详细讲解。本程序运行后可以在浏览器中生成一张带有验证码的图片。每次刷新程序都会生成一个新验证码。

            1:  <!--文件8-23-login.html:图形验证码程序-->

            2:  <HTML>

            3:      <HEAD>

            4:          <TITLE>图形验证码程序</TITLE>

            5:      </HEAD>

            6:       <BODY>

            7:          <form action="8-23-check.php" method="post">

            8:              <img src="8-23-showimg.php"><br>

            9:              请输入验证码:<input type="text" name="passcode">

            10:             <input type=submit value="确定">

            11:         </form>

            12:      </BODY>

            13: </HTML>

            本程序是一段纯HTML代码,无需多做解释。惟一值得注意的是,在调用这个图片时,采用“<img src=“8-23-showimg.php”>”的方式。因为验证码图片本身是一张图片,所以使用<img>标签来引用。而这张图片又是用PHP程序生成的,因此直接用“src= 8-23-showimg.php”来调用。运行结果如图8-23所示。

            

8-23.jpg

图8-23  程序8-23-login.html的运行结果

 

            1:  <?php

            2:     //验证用户输入的验证码是否正确

            3:      session_start();

            4:      $passcode=$_SESSION["Checknum"];

            5:      $usercode=$_POST["passcode"];

            6:       if($passcode == $usercode){

            7:         echo "验证码正确!验证通过!";

            8:      }else{

            9:         echo "验证码输入错误!验证失败!";

            10:     }

            11: ?>

            程序第3行是将session中存储的正确的验证码读取出来。第4行将用户输入的验证码接收过来。然后进行比较,如果相等,则说明用户输入的验证码正确,否则不正确。

 

            8.3.6.4  图片水印制作  

                                                   

            不仅可以直接创建一个图像流来绘制图形,还可以将一张已有的图片作为图像流读入,然后在此基础上对图像进行处理。这一功能常用来制作图像水印。所谓图像水印,就是在图像上标上一些特殊的图形或符号,用来作为图像所有者的标志或者防止图片被盗用。下面我们就看一个这样的例子。

            本例使用了一张原始图片pic.jpg,现在用PHP将此图片进行处理,在图片表面按一定规律加上文字标签,产生水印效果,使之不能被直接盗用。

            1:  <?php

            2:      //文件8-24.php:为图片加水印

            3:       header("Content-type: image/jpeg");

            4:       $im = imagecreatefromjpeg("pic.jpg");

            5:       $white = imagecolorallocate($im,255,255,255);

            6:       $width=imagesx($im);

            7:      $height=imagesy($im);

            8:      $x=0;

            9:      $y=0;

            10:     while($x<$width && $y<$height){

            11:             imagestring($im,2, $x,$y,"https://www.xxx.com", $white);

            12:             $x =20;

            13:             $y =20;

            14:     }

            15:     imagejpeg($im);

            16:     imagedestroy($im);

            17: ?>

            本程序第3行设定本页面输出类型为jpeg图像。

            第4行用imagecreateformjpeg()函数打开了一张图片pic.jpg,并返回此图片的数据流。

            第5行定义了一个颜色(白色)。

            第6~7行用imagesx()和imagesy()函数取得图片pic.jpg的原始尺寸。

            第8~9行定义了用于控制文字添加位置的两个变量。

            第10~14行用循环向图片中添加多行文字,用$x和$y两个变量控制位置和循环次数。

            第15行输出此图片,第16行销毁数据流。

            程序运行前和运行后的图像分别如图8-24和图8-25所示。

8-24.jpg

图8-24  原始图片

8-225.jpg

图8-25  程序8-24.php的运行结果

 

            可以看到,处理的后的图片上加入了文字标记,这就基本达到了处理意图。但是同时也可以看出,处理后的图片由于文字的加入影响了图像的观赏性。因此水印如何加,加在什么位置,即能起到水印的作用,又不严重影响美观,才是在处理中最应考虑的。

            PHP的图像处理函数就介绍这些,希望读者对此有一个基本的了解,为以后深入学习打下基础。

 


  • 甄丹丹 2018-01-09 16:13:46
    图像验证码程序是当前Web开发中常用的程序