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 在图像中显示中文
共有条评论 网友评论