我们来看一个关于创建图像更复杂的例子。如果能够在网站里自动创建一个按钮或其他图像,那将会是很有趣的。可以使用我们已经介绍的技术在基于一个四边形的背景颜色上创建一个简单的按钮。通过编程,还可以实现更加复杂的效果,但是通常使用一个画板程序更容易完成这些操作。这也使得我们让一个艺术家来绘制图形而程序员来完成编程工作。
在这个例子中,我们将使用一个空白按钮模板来创建多个按钮,这样,通过该按钮模板创建的按钮具有相同的特征(如羽化边缘等),这些特征在使用Photoshop、GIMP或其他图形工具创建时容易得多。使用PHP中的图像库,我们可以从一个基本图像开始,在此图像上绘制。
我们也使用TrueType字体以便可以使用反别名的文本。TrueType字体函数有它们自己的特性,关于这些内容,我们将在以后讨论。
基本的处理过程是接收一些文本并产生包含此文本的按钮,该文本位于按钮的中央(水平方向和垂直方向都处于中央),并被赋以适合按钮的最大字体。
我们已经创建了用于测试和试验的按钮生成器的前台,其界面如图22-4所示。(因为这非常简单,我们没有为表单包含进HTML,但是可以在本书附带的文件找到,在design_button.html文件中。)
图 22-4 前台允许用户选择的请求文本中按钮的颜色和类型可以使用这种界面让程序自动创建网站。也可以通过联机的方式调用该脚本来创建网站所有的动态按钮,但是这可能需要缓冲机制,防止其占用太多的处理器时间。
该脚本的输出结果如图22-5所示。
图 22-5 make_button.php脚本生成的按钮该按钮由make_button.php脚本生成。脚本如程序清单22-2所示。
程序清单22-2 make_button.php——该脚本可以从design_button.html的表单或一个HTML图像标签中调用
<?php
//check we have the appropriate variable data
//variables are button-text and color
$button_text=$_REQUEST[/'button_text/'];
$color=$_REQUEST[/'color/'];
if(empty($button_text)||empty($color))
{
echo/'Could not create image-form not filled out correctly/';
exit;
}
//create an image of the right background and check size
$im=imagecreatefrompng($color./'-button.png/');
$width_image=imagesx($im);
$height_image=imagesy($im);
//Our images need an 18 pixel margin in from the edge of the image
$width_image_wo_margins=$width_image-(2*18);
$height_image_wo_margins=$height_image-(2*18);
//Work out if the font size will fit and make it smaller until it does
//Start out with the biggest size that will reasonably fit on our buttons
$font_size=33;
//you need to tell GD2 where your fonts reside
putenv(/'GDFONTPATH=C:WINDOWSFonts/');
$fontname=/'arial/';
do
{
$font_size--;
//find out the size of the text at that font size
$bbox=imagettfbbox($font_size,0,$fontname,$button_text);
$right_text=$bbox[2];//right co-ordinate
$left_text=$bbox[0];//left co-ordinate
$width_text=$right_text-$left_text;//how wide is it?
$height_text=abs($bbox[7]-$bbox[1]);//how tall is it?
}
while($font_size>8&&
($height_text>$height_image_wo_margins||
$width_text>$width_image_wo_margins)
);
if($height_text>$height_image_wo_margins||
$width_text>$width_image_wo_margins)
{
//no readable font size will fit on button
echo/'Text given will not fit on button.<br/>/';
}
else
{
//We have found a font size that will fit
//Now work out where to put it
$text_x=$width_image/2.0-$width_text/2.0;
$text_y=$height_image/2.0-$height_text/2.0;
if($left_text<0)
$text_x+=abs($left_text);//add factor for left overhang
$above_line_text=abs($bbox[7]);//how far above the baseline?
$text_y+=$above_line_text;//add baseline factor
$text_y-=2;//adjustment factor for shape of our template
$white=imagecolorallocate($im,255,255,255);
imagettftext($im,$font_size,0,$text_x,$text_y,$white,$fontname,
$button_text);
Header(/'Content-type:image/png/');
imagepng($im);
}
imagedestroy($im);
?>
这是我们所看到的最长的脚本了。我们将逐步地讨论脚本的各个部分。开始是一些基本的错误检查,然后是创建画布并在此画布上操作。
22.5.1 创建基本画布
在程序清单22-2中,我们并不是从零开始作图,而是以一个已有的按钮图像为开始的。基本按钮的颜色存在3种选择:红(red-button.png)、绿(green-button.png)和蓝(blue-button.png)。
用户选择的颜色将保存在来自表单的变量color中。首先我们将从超级全局变量$_REQUEST中获得颜色,并且创建一个基于适当按钮的新图像标识符:
$color=$_REQUEST[/'color1];
...
$im=imagecreatefrompng($color./'-button.png/');
函数Imagecreatefrompng以一个PNG文件名作为参数,并且返回一个包含该PNG图像拷贝的图像标识符。请注意,这里并没有对基本的PNG进行任何修改。如果已经安装了适当的支持程序,就可以使用Imagecreatefromjpeg和ImageCreateFromGIF函数。
提示 对Imagecreatefrompng函数的调用只是在内存中创建图像。要将该图像保存到一个文件或输出到浏览器,必须调用ImagePNG函数。后面我们将讨论它,此前我们需要先对图像进行一些其他处理。