说说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过程中的心得就全部说完了。感谢大家的关注!让我们共同进步!

时间: 2025-01-17 19:16:33

说说PHP作图(四)(完)的相关文章

详解JavaScript对象序列化_javascript技巧

一.什么是对象序列化? 对象序列化是指将对象的状态转换为字符串(来自我这菜鸟的理解,好像有些书上也是这么说的,浅显易懂!): 序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程(来自"百度百科-序列化",学术性强,略显高端): 二.为什么会有对象序列化? 世间万物,都有其存在的原因.为什么会有对象序列化呢?因为程序猿们需要它.既然是对象序列化,那我们就先从一个对象说起: var obj = {x:1, y:2};   当这句代码运行时,对象obj的内

安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)

安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四) 17. 安装 Webmin Webmin 是基于 Web 的 Linux 配置工具.它像一个中央系统,用于配置各种系统设置,比如用户.磁盘分配.服务以及 HTTP 服务器.Apache.MySQL 等的配置. # wget http://prdownloads.sourceforge.net/webadmin/webmin-1.740-1.noarch.rpm # rpm -ivh webmin-*.rpm 安装 Webm

四万亿缩水2000亿元今年没花完

专家分析,根本原因是中国经济迅速好转 记者获悉,国家发改委原定于2009年四季度下发的第五批中心投资,至今仍未下达.这笔总计高达2000亿的资金,有可能会结转到下一年执行. 按照"四万亿"刺激计划,在今年年底前应下发6000亿中心投资.12月18日,记者从国家发改委了解到,第五批中心投资迟迟没有下发的原因,一方面是地方在执行前几批投资计划中,仍然存在配套资金不到位等题目,而更主要的则是中国经济确实已经出现明显好转. 发改委人士估计,随着明年上半年地方项目开工高潮的到来,中国短期内不必担

看完后你就是电脑维修工程师 第十四载

第十一章 兼容或配合性故障 一.定义举例 这类故障主要是由于用户追加第三方软.硬件设备而引起的软.硬件故障. 这类故障,在前面的几类故障中已部分提及,因此有些故障现象可能与前面所介绍的故障判断类似,可参考. 二.可能的故障现象 1.加装用户的设备或应用后,系统运行不稳定,如:死机或重启等: 2.用户所加装的设备不能正常工作: 3.用户开发的应用不能正常工作: 4.用户需要的配置在联想机上不能满足(如需要加装大容量内存.需要多个串口等). 三.可能涉及的部件 所有可能的部件或软件.但影响第三方应用

喝完一盒香满楼牛奶四岁男童发烧急送医

香满楼工作人员表示或是一些其他环节出问题导致温度过高牛奶变质,愿意承担医药费新快报讯 记者苏中阳报道 "想不到让我如此敬服的奶企也会这样?"市民李先生近日向新快报记者投诉称,4月27日晚,他在宝岗大道的一间全家便利店购了3盒香满楼牛奶,第二天早晨他四岁儿子喝了其中一盒,当天就突发高烧急病送医,医院检查其血液白细胞偏高,细菌感染.李先生说,在儿子发烧前,他发现牛奶已经变豆腐花状,"而且已有很大的怪味",这些牛奶尚在保质期内.事发:牛奶尚在保质期内李先生告诉记者,4月2

客户端CGI——结合&amp;#106avascript、dhtml实现bbs的backoffice(四,完)

cgi|dhtml|客户端 //第六步,修改版主 function On_ChangeMaster()    {      //如果没有论坛被选中,则退出      if (frmManager.selForumName .selectedIndex == -1)        {          return 0 ;        }                if (frmManager.btnChangeMaster .value == "修改")        {    

BBS(php &amp; mysql)完整版(四)

//此页面为 top.php <html> <head> <title>Untitled Document</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <script language="JavaScript1.2" src="js/fw_menu.js"

看完后你就是电脑维修工程师 第四载

第二部分 常见故障判断 本部分将计算机从开机一直到关机期间的故障进行分类.每一类的判断.定位过程都是第一部分中"维修判断"一节的有机组成部分,即不论使用什么方法或不论去判断什么内容,这两部分总是相互结合使用的. 以下各故障类型中所列的故障现象只是众多故障现象中的一部分,对于未列出的故障现象,有的可归类到其中,有的无法归类.因此,本手册只针对已列出的及可归类其中的故障现象提供相应的判断的方法和思路,并提供基本的排除的方法.而对不能归类其中的其它故障现象来说,我们会在今后的工作中不断的收集

TIJ阅读笔记(第十四章)

笔记 14: 创建窗口与Applet 设计的宗旨是"能轻松完成简单的任务,有办法完成复杂的任务". 本章只介绍Java 2的Swing类库,并且合理假定Swing是Java GUI类库的发展方向. 本章的开头部分会讲,用Swing创建applet与创建应用程序有什么不同,以及怎样创建一个既能当applet在浏览器里运行,又能当普通的应用程序,在命令行下运行程序. Swing类库的体系庞大,而本章的目的也只是想让你从基础开始理解并且熟悉这些概念.如果你有更高的要求,只要肯花精力研究,Sw