22.3.2 在图像上绘图或打印文本

在一个图像上绘图或打印文本需要两个步骤。首先,必须选择希望绘制的颜色。我们知道,在计算机显示器上显示的颜色是由不同数量的红色、绿色和蓝色组成的。图像格式使用一个调色板,它包含所有3种颜色的可能组合的特定子集。要使用一种颜色绘制一个图像,必须将此颜色添加到图像的调色板上。我们必须对每一种要使用的颜色进行相同的处理,即使它是白色或黑色。

也可以通过调用Imagecolorallocate()函数为图像选择颜色。需要为该函数传递图像标识符和希望使用的颜色,而颜色由红、绿和蓝(RGB)值的组合决定。

在程序清单22-1中,我们使用了两种颜色:黑色和白色。通过调用以下函数分配这两种颜色。


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

$blue=imagecolorallocate($im,0,0,64);


以上函数将返回一个可供以后使用的颜色标识符。

其次,要真正将颜色绘制到图像中,还需要使用许多其他不同的函数,对这些函数的使用取决于要绘制的内容——直线、弧、多边形或文本。

通常,绘图函数需要下列参数:

■图像标识符

■需要绘制内容的起始坐标和结束坐标

■图像使用的颜色

■对于文本,需要字体信息

在这个例子中,我们使用了3个绘画函数。下面,我们逐一了解这些函数。

首先,调用ImageFill()函数绘制了一个用以在上面绘画的黑色背景:


imagefill($im,0,0,$blue);


该函数以图像标识符、绘画区域的起始坐标(x和y)以及颜色作为参数。

提示 需要注意的一点是,图像的起始坐标从左上角开始,该点坐标为x=0、y=0。图像右下角的坐标是x=$width、y=$height。这是计算机图形的常识,但是这与常规的作图习惯是相反的。

接下来,我们从左上角(0,0)开始画一条线,直到图像的右下角($width,$height):


imageline($im,0,0,$width,$height,$white);


该函数以图像标识符、直线的起始点的x和y坐标、终点以及颜色作参数。

最后,我们在该图中添加了一个标签:


imagestring($im,4,50,150,'Sales',$white);


Imagestring()函数所需的参数与Imageline()有些不同。其原型是:


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


它以图像标识符、字体、文本的起始坐标x与y以及颜色作为参数。

字体参数值是1~5的数字。它们表示一组以latin2为编码的内置字体,参数值越高,对应的字体越大。也可以选择特殊字体,例如,可以选择TrueType字体,或PostScript Type 1字体。这些字体都有相应的函数设置。在下一个例子中,我们将使用TrueType字体的函数。

22.3.2 在图像上绘图或打印文本 - 图1

图 22-2 常规的文本表现出交错的锯齿,特别是字体很大的时候,而反别名

使用可选的字体函数组的一个原因就是由函数Imagestring()或相关函数如Imagechar()(写一个字符到图像)写出的文本是可用别名的,而TrueType和PostScript函数生成反别名的文本。

如果不能确认它们到底有什么区别,请参阅图22-2。请注意,字母中的曲线或折线的地方,别名文本将表现出交错的锯齿。而曲折和拐弯的地方则是通过使用"staircase"效果而获得的。在反别名的图像中,文本中曲线或折线的地方以及背景色和文本色之间的颜色趋于平滑。