说说PHP作图(四)(完)
到前面为止,我们已经能够用GD完成作图基本的需要了。但有的时候恐怕就要嫌ImageString
能用的五种字体少而且难看,那就要用到下面的函数了。这个函数允许我们使用TTF字体;但你
必须拥有这些字体的文件。
<?php
Header("Content-type: image/png");
$im = ImageCreate(400,250);
$col_back = ImageColorAllocate($im,136,200,152);
$col_write = ImageColorAllocate($im,255,255,255);
$col_black = ImageColorAllocate($im,0,0,0);
ImageTTFText($im,160,15,40,220,$col_black,"C:/windows/fonts/verdana.ttf","PNG");
// 新的内容只有这一句。参数是这样的:
// $im 不用说了。 160 这个位置,是字号(pt)。15 字串是倾斜角度,水平方向起逆时针。
// 40,220是横纵坐标。注意,跟ImageString不同的是,
// ImageString里指定的坐标是字串的左上角,而ImageTTFText指定的坐标是左下角。
// 接下来 $col_black 是颜色喽,
// "C:/windows/fonts/verdana.ttf"是字体文件路径,在Linux就是"/.../....."。
// 甚至可以是 "http://...."。但是,我没有这样用过,也不推荐这样用。
// 因为不在自己机器上的东西终究是不可靠的,不可以委以重任。
// 最后就是要输出的字符串了。这是尤其要引起注意的,
// 这里的字符串要用UTF-8编码!!!
// ASCII码 0~127的字符,ASCII码等于UTF-8编码,所以我们在输出西文字符串的时候不需要转换。
// 而如果要输出中文,则需要一系列的转换。
// www.phpx.com的sadly写了一个GB2312码到UTF-8码转换的函数。
// 我的另一篇文章专门分析了这个函数的工作原理。
ImagePNG($im);
ImageDestroy($im);
?>
类似于ImageFontWidth()和ImageFontHeight()帮助我们计算ImageString输出字串将要占用的
高度和宽度,ImageTTFBBox可以帮助我们计算ImageTTFText输出字符串的情况。它的返回值是一个
8成员的数组,分别是(注意这个顺序)左下、右下、右上、左上 的横纵坐标。试一下:
<?
$p=ImageTTFBBox(160,0,"C:/windows/fonts/verdana.ttf","PNP");
for($i=0;$i<8;$i+=2)
echo "(".$p[$i].",".$p[$i+1].")"."<br>";
?>
结果是这样的:
(15,-1)
(306,-1)
(306,-117)
(15,-117)
为什么出现负数?我也不知道。这些坐标是相对于什么的?无论它是相对于什么,他们之间的
相对位置是不会改变的。所以,这些都不太重要,我们根据左、右边的横坐标的差和上、下边纵坐标
的差,就足够计算出应该把左下点安排在什么位置了。
好了,讲完了利用TTF字体输出字符串,也顺便解决了前面“要想写汉字还得费一些麻烦”的
遗留话柄。以我来看,GD还剩下最后一部分内容——打开现有图片、处理、重新输出。
首先,取得图片的信息,是基本的需要。看下面的例子:
<?
$im=ImageCreateFromPNG("test.png");
// 这就是打开已经存在的图象。
// 很简单,参数是图片路径,返回值是图象ID。
echo "The image's width is ".ImageSX($im).", and height is ".ImageSY($im).".";
// ImageSX()和ImageSY分别是得到图象的宽和高,他们都只需要一个参数——已经打开的图象ID。
?>
另外,还有一个不属于GD库的获取图象信息的函数:GetImageSize。
<?
$p=GetImageSize("test.png");
for($i=0;$i<4;$i++) echo $p[$i]."<br>";
?>
结果是这样的:
50
100
3
width="50" height="100"
可见,该函数返回了一个关于该图片信息的数组,四个元素分别为:前两个是图象的宽、高;
第三个代表图象的格式:1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP。最后一个
元素是用在HTML里的表示该图象宽、高的字串(真是太方便了!)。比如我们可以这样用:
<?
....
$pic_name="....";
$pic_size=GetImageSize($pic_name);
?>
<img src="<?echo $pic_name;?>" <?echo $pic_size[3];?>>
.....
再重复一遍,这个函数不属于GD库,所以,在没有装GD库的PHP环境中也可以使用!!
缩略图是经常需要的功能。使用GD的“拷贝并调整大小”的函数可以很容易实现缩略图。
<?
// 假设要把任意大小的图片缩小(放大)到宽200象素。
// Header("Content-type: image/jpeg");
$pic_name="test.jpg";
$ims=ImageCreateFromJPEG($pic_name);
// 打开原图。
$owidth=ImageSX($ims);
$oheight=ImageSY($ims);
// 取得原图的宽、高。
$nheight=Round($oheight*200.0/$owidth);
// 计算新图的高度。
$imt=ImageCreate(200,$nheight);
// 建立新图。
ImageCopyResized($imt,$ims,0,0,0,0,200,$nheight,$owidth,$oheight);
// 拷贝到新图并调整大小。
// 这个函数参数比较多,首先,是目的图象和原图象的ID,
// 然后的四个参数是目的图象和原图象的拷贝位置的坐标。
// 如从原图象的 20,30 拷到目的图象的 10,0
// 则这四个参数是 10,0,20,30。
// 再接下来的四个也是最后四个参数是目的图象和原图象的拷贝区域的宽高,
// 如从原图象拷贝 100x50 那么大的区域到目的图象并缩小到 50x25
// 则这四个参数是 50,25,100,50。
// 而这里我使用的参数,是将原图完整地拷贝到新图,(拷贝位置均为 0,0)
// 将原始大小无论放大还是缩小,均调整到宽200象素。
// 200,$nheight 是新图的宽、高,$owidth,$oheight是原图的宽、高。
// 使用这个函数的时候注意每一组参数里,
// 都是与目的图象相关的参数在前,与原图象相关的参数在后。
ImageJPEG($imt);
ImageDestroy($imt);
ImageDestroy($ims);
?>
好了,说到这里,我的在做GD过程中的心得就全部说完了。感谢大家的关注!让我们共同进步!
能用的五种字体少而且难看,那就要用到下面的函数了。这个函数允许我们使用TTF字体;但你
必须拥有这些字体的文件。
<?php
Header("Content-type: image/png");
$im = ImageCreate(400,250);
$col_back = ImageColorAllocate($im,136,200,152);
$col_write = ImageColorAllocate($im,255,255,255);
$col_black = ImageColorAllocate($im,0,0,0);
ImageTTFText($im,160,15,40,220,$col_black,"C:/windows/fonts/verdana.ttf","PNG");
// 新的内容只有这一句。参数是这样的:
// $im 不用说了。 160 这个位置,是字号(pt)。15 字串是倾斜角度,水平方向起逆时针。
// 40,220是横纵坐标。注意,跟ImageString不同的是,
// ImageString里指定的坐标是字串的左上角,而ImageTTFText指定的坐标是左下角。
// 接下来 $col_black 是颜色喽,
// "C:/windows/fonts/verdana.ttf"是字体文件路径,在Linux就是"/.../....."。
// 甚至可以是 "http://...."。但是,我没有这样用过,也不推荐这样用。
// 因为不在自己机器上的东西终究是不可靠的,不可以委以重任。
// 最后就是要输出的字符串了。这是尤其要引起注意的,
// 这里的字符串要用UTF-8编码!!!
// ASCII码 0~127的字符,ASCII码等于UTF-8编码,所以我们在输出西文字符串的时候不需要转换。
// 而如果要输出中文,则需要一系列的转换。
// www.phpx.com的sadly写了一个GB2312码到UTF-8码转换的函数。
// 我的另一篇文章专门分析了这个函数的工作原理。
ImagePNG($im);
ImageDestroy($im);
?>
类似于ImageFontWidth()和ImageFontHeight()帮助我们计算ImageString输出字串将要占用的
高度和宽度,ImageTTFBBox可以帮助我们计算ImageTTFText输出字符串的情况。它的返回值是一个
8成员的数组,分别是(注意这个顺序)左下、右下、右上、左上 的横纵坐标。试一下:
<?
$p=ImageTTFBBox(160,0,"C:/windows/fonts/verdana.ttf","PNP");
for($i=0;$i<8;$i+=2)
echo "(".$p[$i].",".$p[$i+1].")"."<br>";
?>
结果是这样的:
(15,-1)
(306,-1)
(306,-117)
(15,-117)
为什么出现负数?我也不知道。这些坐标是相对于什么的?无论它是相对于什么,他们之间的
相对位置是不会改变的。所以,这些都不太重要,我们根据左、右边的横坐标的差和上、下边纵坐标
的差,就足够计算出应该把左下点安排在什么位置了。
好了,讲完了利用TTF字体输出字符串,也顺便解决了前面“要想写汉字还得费一些麻烦”的
遗留话柄。以我来看,GD还剩下最后一部分内容——打开现有图片、处理、重新输出。
首先,取得图片的信息,是基本的需要。看下面的例子:
<?
$im=ImageCreateFromPNG("test.png");
// 这就是打开已经存在的图象。
// 很简单,参数是图片路径,返回值是图象ID。
echo "The image's width is ".ImageSX($im).", and height is ".ImageSY($im).".";
// ImageSX()和ImageSY分别是得到图象的宽和高,他们都只需要一个参数——已经打开的图象ID。
?>
另外,还有一个不属于GD库的获取图象信息的函数:GetImageSize。
<?
$p=GetImageSize("test.png");
for($i=0;$i<4;$i++) echo $p[$i]."<br>";
?>
结果是这样的:
50
100
3
width="50" height="100"
可见,该函数返回了一个关于该图片信息的数组,四个元素分别为:前两个是图象的宽、高;
第三个代表图象的格式:1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP。最后一个
元素是用在HTML里的表示该图象宽、高的字串(真是太方便了!)。比如我们可以这样用:
<?
....
$pic_name="....";
$pic_size=GetImageSize($pic_name);
?>
<img src="<?echo $pic_name;?>" <?echo $pic_size[3];?>>
.....
再重复一遍,这个函数不属于GD库,所以,在没有装GD库的PHP环境中也可以使用!!
缩略图是经常需要的功能。使用GD的“拷贝并调整大小”的函数可以很容易实现缩略图。
<?
// 假设要把任意大小的图片缩小(放大)到宽200象素。
// Header("Content-type: image/jpeg");
$pic_name="test.jpg";
$ims=ImageCreateFromJPEG($pic_name);
// 打开原图。
$owidth=ImageSX($ims);
$oheight=ImageSY($ims);
// 取得原图的宽、高。
$nheight=Round($oheight*200.0/$owidth);
// 计算新图的高度。
$imt=ImageCreate(200,$nheight);
// 建立新图。
ImageCopyResized($imt,$ims,0,0,0,0,200,$nheight,$owidth,$oheight);
// 拷贝到新图并调整大小。
// 这个函数参数比较多,首先,是目的图象和原图象的ID,
// 然后的四个参数是目的图象和原图象的拷贝位置的坐标。
// 如从原图象的 20,30 拷到目的图象的 10,0
// 则这四个参数是 10,0,20,30。
// 再接下来的四个也是最后四个参数是目的图象和原图象的拷贝区域的宽高,
// 如从原图象拷贝 100x50 那么大的区域到目的图象并缩小到 50x25
// 则这四个参数是 50,25,100,50。
// 而这里我使用的参数,是将原图完整地拷贝到新图,(拷贝位置均为 0,0)
// 将原始大小无论放大还是缩小,均调整到宽200象素。
// 200,$nheight 是新图的宽、高,$owidth,$oheight是原图的宽、高。
// 使用这个函数的时候注意每一组参数里,
// 都是与目的图象相关的参数在前,与原图象相关的参数在后。
ImageJPEG($imt);
ImageDestroy($imt);
ImageDestroy($ims);
?>
好了,说到这里,我的在做GD过程中的心得就全部说完了。感谢大家的关注!让我们共同进步!