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

19.2图像的建立

9/17/2020 9:31:19 PM 人评论

19.2图像的建立

19.2 图像的建立

有了以上处理图像的PHP函数作为基础,本节读者可以尝试通过这些函数创建图像。

19.2.1 生成图像的步骤

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

(1)创建一个背景图像,以后所有操作都是基于此背景。

(2)在图像上绘图轮廓或者输入文本。

(3)输出最终图形。

(4)清除内存中所有资源。

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


resource imagecreatetruecolor ( int x_size, int y_size )

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

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


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

然后需要使用其他函数将颜色绘制到图像中,这些函数的选择取决于要绘制的内容为直线、弧形、多边行或者文本。

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


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

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

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


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

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


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

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

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


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

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


bool imagepng ( resource image [, string filename] )

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


bool imagedestroy ( resource image )

其中,image是由图像创建函数返回的图像标识符。

这样做是为了降低CPU负荷。如果不使用该函数而且在Web端有太多这样的图片产生任务,可能会发现导致性能下降。

19.2.2 用PHP生成图像

如下实例演示了如何使用PHP函数创建一个图像,并将图像输出到页面。

代码19-1 生成一个简单图像19-1.php


     01 <?php
     02 $width = 200;                                                                  //
宽度
     03 $height =200;                                                                  //
高度
     04 
     05 $img = imagecreatetruecolor($width,$height) or die("
不支持GD
图像处理");        //
创建图像
     06 imagepng($img);
     07 imagedestroy($img);
     08 ?>

【代码解析】在PHP中处理图像,首先需要建立图像标识符。代码19-1的第05行就通过函数imagecreatetruecolor()建立了一个图像标识符$img,它代表了一个黑色图像,这个黑色图像的大小,由变量$width和$height指定。这是在PHP中创建图像的第一步。

图19-2 使用PHP的GD函数生成简单图像

代码第06行使用函数imagepng()以PNG格式生成该图像,该函数的参数正是代码第5行创建的图像标识符,该函数会将图像输出到标准输出,这里的标准输出就是指浏览器,最终在浏览器上看到的图像即由该函数生成。这是本节开始讲述的创建图像步骤中的第3步,本例跳过了本节开头所描述创建图片步骤中的第2步。

代码第07行使用函数imagedestroy()清除绘制图像时所占用的系统资源。该函数的参数$img即图像标识符。

通过IE浏览器,可以看到这段代码的执行结果如图19-2所示。

19.2.3 设定图像颜色

函数imagecreatetruecolor()所返回的图像标识符默认情况下代表一个黑色图像。通过函数imagecolorallocate()可以改变该标识符所代表图像的颜色,如代码19-2所示。

代码19-2 设定图像的颜色19-2.php


     01 <?php
     02 $width = 200;
     03 $height =200;
     04 
     05 $img =  imagecreatetruecolor($width,$height) or die("
不支持GD
图像处理");       //
创建图像
     06 
     07 $bg_color = imagecolorallocate($img, 255, 0, 0);        //
设置图像标识符所描述图像
     08 imagefill($img, 0, 0, $bg_color);                       //
改变图像的颜色
     09 
     10 imagepng($img);
     11 imagedestroy($img);
     12 ?>

【代码解析】代码第07行使用函数imagecolorallocate()设置图像标识符所描述图像的颜色为红色,其第1个参数标识图像标识符,第2个参数255是设定红色的数值,第3、4个参数为0,表示绿色蓝色未取其设定值,所以图像颜色设定为红色。

代码第08行使用函数imagefill()为图像$img填充颜色,即把标识符$img所表示图像的背景色填充为红色。代码19-2的执行效果如图19-3所示,因为本书是单色印刷,从书中看不出红色效果,读者需要亲自实践一下这个程序。

19.2.4 在图像上绘制直线

本节将向读者介绍如何在图像上绘制形状或书写文字,也就是本节开头所述PHP图像处理的第2个步骤。通过函数imageline()可以实现在图像中绘制直线,如代码19-3所示。

代码19-3 在图像上绘制直线19-3.php


     01 <?php
     02 $width = 200;
     03 $height =300;
     04 
     05 $img =  imagecreatetruecolor($width,$height) or die("
不支持GD
图像处理");  //
创建图像
     06 
     07 $line_color = imagecolorallocate($img, 255, 255, 255);
     08 imageline($img, 0, 40, 200, 40, $line_color);           //
绘制直线
     09 imageline($img, 0, 260, 200, 260, $line_color);         //
绘制直线
     10 
     11 imagepng($img);
     12 imagedestroy($img);
     13 ?>

【代码解析】 代码第08行使用函数imageline()绘制出第1条直线,其中参数$img是第05行生成的图像标识符,其第2、3个参数表示所绘制直线的起点坐标为0、140,第4、第5个参数表示所绘直线的终点坐标为200、140,该函数最后一个参数是,所要绘制图线的颜色,该参数值在代码第07行获得。这里需要注意的是,图像的(0、0)点坐标在最左上角。第09行是绘制第2条直线的代码。然后,通过函数imagepng()以PNG格式输出图像,最后使用函数imagedestroy()清除所占系统资源。

这段代码在图像上绘制出两条白色的直线,执行结果如图19-4所示。

图19-3 设置图像颜色

图19-4 在图像上绘制直线

19.2.5 在图像上输出文字

通过函数imagestring()可以在图像上书写一段文本,代码19-4在代码19-3的基础上进行修改,在图像上显示了一段文字。

代码19-4 在图像上显示文字19-4.php


     01 <?php
     02 $width = 200;
     03 $height =300;
     04 
     05 $img =  imagecreatetruecolor($width,$height) or die("
不支持GD
图像处理");  //
创建图像
     06 $line_color = imagecolorallocate($img, 255, 255, 255);
     07 
     08 imageline($img, 0, 40, 200, 40, $line_color);   
     //
绘制直线
     09 imageline($img, 0, 260, 200, 260, $line_color); 
     //
绘制直线
     10 imagestring($img, 5, 0, 60, "It's time to learn PHP!", $line_color); 
     //
显示文字
     11 
     12 imagepng($img);
     13 imagedestroy($img);
     14 ?>

【代码解析】这段代码使用函数imagestring()向图像书写一段文字,如代码第10行所示。该函数第1个参数是图像标识符,第2个参数是字体大小,第3、第4个参数是表示文字书写的起始坐标。第5个参数就是要向图像书写的文本字符串,第6个参数是文字的颜色。这段代码的执行结果如图19-5所示。

代码19-4在图像上输出了一串英文文字,如果要输出中文字符,就不是那么容易了。如果将函数imagestring()的第4个参数传入中文字符串,执行程序后会显示乱码,读者可以亲自实践一下。

如果在图像上显示中文,需要将中文字符做转换,转换成16进制的字符。这里介绍一种比较简捷的方法来获取汉字的16进制字符。首先在Windows记事本中键入中文字符,保存时按UTF-8编码保存。之后通过UltraEdit打开该文件,在工具栏中单击“切换Hex模式”按钮,即按16进制格式查看文件内容,就可以看到中文字符的16进制编码。例如,在UltraEdit的Hex模式下可以看到“西游记”3字的16进制编码,代码如下。


E8 A5 BF E6 B8 B8 E8 AE B0

在程序中,还需要使用函数chr()返回这些16进制编码所表示的单个字符。在图像上显示中文使用的函数是imagettftext(),该函数输出中文时需要用TrueType字体向图像写入文本。代码19-5演示了在图像中显示中文字符。

代码19-5 在图像中显示中文字符19-5.php


     01 <?php
     02 $width = 200;
     03 $height =300;
     04 
     05 $img =  imagecreatetruecolor($width,$height) or die("
不支持GD
图像处理");       //
创建图像
     06 $line_color = imagecolorallocate($img, 255, 255, 255);
     07 $font_type ="C://WINDOWS//Fonts//SIMLI.TTF";    //
获取TrueType
字体,采用隶书字体
     08 
     09 //
“西游记”3
个字的16
进制字符
     10 $cn_char1 = chr(0xE8).chr(0xA5).chr(0xBF);
     11 $cn_char2 = chr(0xE6).chr(0xB8).chr(0xB8);
     12 $cn_char3 = chr(0xE8).chr(0xAE).chr(0xB0);
     13 
     14 //
“吴承恩著”4
个字的16
进制字符
     15 $cn_str chr(0xE5).chr(0x90).chr(0xB4).chr(0xE6).chr(0x89).chr(0xBF).chr(0xE6).          chr(0x81).chr(0xA9);
     16 $cn_str .= " ".chr(0xE8).chr(0x91).chr(0x97);
     17 
     18 imageline($img, 0, 40, 200, 40, $line_color);                   //
绘制直线
     19 imageline($img, 0, 260, 200, 260, $line_color);                 //
绘制直线
     20 
     21 //
竖排显示“西游记”3
字
     22 imagettftext($img, 30, 0, 10, 80, $line_color, $font_type, $cn_char1);
     23 imagettftext($img, 30, 0, 10, 120, $line_color, $font_type, $cn_char2);
     24 imagettftext($img, 30, 0, 10, 160, $line_color, $font_type, $cn_char3);
     25 
     26 //
横排显示“吴承恩著”4
字
     27 imagettftext($img, 15, 0, 90, 254, $line_color, $font_type, $cn_str);
     28 
     29 imagepng($img);
     30 imagedestroy($img);
     31 ?>

【代码解析】代码第07行获取TrueType字体,在Windows XP操作系统中,其所在目录为C:\WINDOWS\Fonts,这行代码指定图像中显示中文所采用的字体为隶书。代码第10~12行分别指定了3个中文字符,这里使用函数chr()获取16进制编码(这里也是ASCII编码)所代表的单个字符,同样的道理,代码15~16行指定了其他几个中文字符。代码第22行使用函数imagettftext()向图像写入文本,该函数的语法如下。


imagettftext ( resource $mage, float $size, float $angle, int $x, int $y, int $color,  string $fontfile, string $text )

函数imagettftext()的第1个参数是图像标识符;第2个参数是字体大小;第3个参数是文本显示角度,如果该参数为0,表示从左向右读的文本;第4、第5个参数表示的第一个字符字体基线的坐标;第6个参数表示字体颜色;第7个参数表示显示图像文字时所采用的TrueType字体;最后一个参数是要显示的文本内容。

代码19-5的执行结果如图19-6所示。

图19-5 在图像上显示文字

图19-6 在图像中显示中文

相关教程

共有条评论 网友评论

验证码: 看不清楚?