创建并处理图象

 更新时间:2016年11月25日 16:59  点击:1693
在安装了一些第三方函数库之后,结合图形处理技能,你就可以迅速使用PHP创建和处理图像了。事实上,你也不需要很多几何学知识——因为我在中学的时候这门功课曾经不及格而现在却能使用PHP创建图像!


在使用基本的图像创建函数之前,需要安装GD库。要使用JPEG相关的图像创建函数还需要安装jpeg-6b。在图像中使用Type 1字体的时候还必须安装t1lib。
在这里,你还需要对你的系统设置进行进一步地调整。首先安装t1lib并结束,然后是jpeg-6b。第三步安装GD函数库。确保以上三部分按顺序安装,原因是你需要编译GD库才能使用jpeg-6b库。如果首先安装jpeg-6b,编译就会出错,这会让你不知所措够上一段时间。
在三函数库之后,重新配置PHP。这是在轻松安装PHP的DSO版本时的典型方法。然后执行make clean,命令,并在当前配置提示中加入以下代码:
--with-gd=[/path/to/gd]
--with-jpeg-dir=[/path/to/jpeg-6b]
--with-t1lib=[/path/to/t1lib]
最后执行make、make install完成配置。重新启动 Apache,并运行phpinfo()函数以检查新功能是否正常运行,然后就可以开始了。
取决于安装的GD库版本,你可能具有创建GIF或者PNG图像的能力。关键是如果你已经安装了gd-1.6或者早期版本,则可处理GIF文件,但不能处理PNG文件;如果安装了gd-1.6或者以后版本,你可以处理PNG文件却又不能处理GIF文件。
创建一个简单的图像需要几个函数。我将按步骤演示如下。
输出包含你所创建图像MIME类型的文件头,本例中为PNG。
<? header ("Content-type: image/png");
使用ImageCreate()创建一变量存放空白图像。该函数需要一个图片像素尺寸。格式为ImageCreate(x_size, y_size),对250*250像素的图片,如下:
$newImg = ImageCreate(250,250);
由于此时你的图像还是空白,所以需要用某些色彩填满它。但首先需要用ImageColorAllocate()函数按照颜色的RGB值为每种颜色确定名字。函数的格式为ImageColorAllocate([image], [red], [green], [blue])。如是天蓝色,应使用:
$skyblue = ImageColorAllocate($newImg,136,193,255);

接着,用ImageFill()函数为图像填充以上颜色。实际上ImageFill()函数有多个版本,如ImageFillRectangle(), ImageFillPolygon()等等。为简单起见,采用ImageFill()函数进行颜色填充,格式如下:
ImageFill([image], [start x point], [start y point], [color])
    上次说了一种简单的回避GD的作图方法,而后又用GD作了最简单的一幅“图”——直线。
这次我就接着画直线向下说。上次代码中详细解释过的部分,这次不再赘述。
<?
    Header("Content-type: image/png");
    $im = ImageCreate (200, 100);
    $col_black = ImageColorAllocate($im, 0,0,0);
    $col_orn = ImageColorAllocate($im, 255,192,0);
    // 今天用橘色吧。
    // 跟 imageline 函数完全相同的用法,
    ImageDashedLine($im,0,100,199,100,$col_orn);
    // 这样就画了一条虚线。
    
    // 下面我们来做个试验。用以说明一个问题。
    $col_yel = ImageColorAllocate($im, 255,255,0);
    // 黄色。
    ImageLine($im,0,99,199,99,$col_yel);
    // 在图象的最下沿画了一条黄色的线。
    ImageLine($im,200,0,200,100,$col_orn);
    // 试图在图象最右沿画一条澄色的线,结果什么也没有。
    // 这表明,宽200,高100的图象,其坐标的范围是(0,0)到(199,99)。
    
    ImagePNG($im);
    ImageDestroy($im);
    // 这一段先结束吧。
?>
    接下来这个效果就爽了!我也是现学现卖。PHP4.0.6以上增加了这个用法——可以用交替的
颜色画线!示例如下:
<?
    Header("Content-type: image/png");
    $im = ImageCreate (200, 100);
    $col_black = ImageColorAllocate($im, 0,0,0);
    $col_orn = ImageColorAllocate($im, 255,192,0);
    $col_red = ImageColorAllocate($im, 255,0,0);
    $style=array($col_red,$col_red,$col_black,$col_orn,$col_orn,$col_orn,$col_black);
    上次说到用GD作各种几何图形,以及填充颜色。其中故意把这样一个较复杂的情况
留到后面,这就是任意多边形和任意多边形的填充颜色。
<?
    Header("Content-type: image/png");
    $im = ImageCreate (200, 100);
    $col_blk = ImageColorAllocate($im, 0,0,0);
    $col_grn = ImageColorAllocate($im, 0,255,0);
    
    $parray = array(40,10,60,10,70,20,60,50,40,50,30,20);
    // 定义一个数组,12个成员是6个点的横纵坐标。
    ImagePolygon($im,$parray,6,$col_grn);
    // 这就是绘制任意多边形的函数,$parray是刚才定义的数组,
    // 6表示六个点。注意六个点连成的是六边形。
    // 不必人为地为了闭合图形而在最后增加一个与第一点相同的点。
    
    ImagePNG($im);
    ImageDestroy($im);    
?>
    你应该已经想到了,任意多边形填充颜色的函数:
    
<?
    Header("Content-type: image/png");
    $im = ImageCreate (200, 100);
    $col_blk = ImageColorAllocate($im, 0,0,0);
    $col_orn = ImageColorAllocate($im, 255,192,0);
    $col_yel = ImageColorAllocate($im, 255,255,0);
    $col_red = ImageColorAllocate($im, 255,0,0);
    $col_grn = ImageColorAllocate($im, 0,255,0);
    $col_blu = ImageColorAllocate($im, 0,0,255);
    $parray = array(40,10,60,10,70,20,60,50,40,50,30,20);
    ImageFilledPolygon($im,$parray,6,$col_grn);
    
    ImagePNG($im);
客户端上载的页面:
--------------------       upload.htm        ---------------------
<form enctype="multipart/form-data"
method="post" action="upload.php">
<input type="hidden" name="MAX_FILE_SIZE" value="10240000000">请选择或输入上传文件名:<input name="upfile" type="file">
<input type="submit" value="开始上传">
---------------------    upload.php        -------------------
<?
if(empty($upfile)){
print("No file was transfered! 无文件上传!");
    exit;
}
$image_path=$upfile;
@$image_info=getimagesize($image_path);
if($image_info[2]==2)
{@$image2=imagecreatefromjpeg($image_path);
}
else if($image_info[2]==1){
@$image2=imagecreatefromgif($image_path);
}
else{print("不接受的图片!");exit;}
if(empty($image2)){print("系统错误,请重试");exit;}
$image2_x=imagesx($image2);
$image2_y=imagesy($image2);
if($image2_x==$image2_y){
$x=150;
$y=0;
}
else if($image2_x>$image2_y){
$x=150;
$y=intval(150*$image2_y/$image2_x);
}
else{
$y=150;
$x=intval(150*$image2_x/$image2_y);
}
$image1=imagecreate($x,$y);
imagecopyresized($image1,$image2,0,0,0,0,$x,$y,$image2_x,$image2_y);
imagegif($image1,"new.gif");
?>
-------------------------     说明    ----------------------
本代码特点在于将所有难看的warning转换为可以自已设计输出的出错提示,@作用在于抑制出借信息。此代码默认的是将图片转换为长宽不超过150像素的缩略图,并保存为new.gif    。使用时可以随意修改。
本代码由turtlevan( turtlevan@263.net )制作,您可以任意使用与修改,也可在网络上任意传播,但不得剽窃为已有。
很多人不了解    PHP 可以产生非HTML的资料.这是对产生影像图非常有用的.可以从 database 产生一个简单的广告横图或更简单只产生一个图形按钮 .
我用 TTF 字型在以下的范例中    
我通常取名作 'button.php3':
#######################################################
-----button.php3------
<?
    Header("Content-type: image/gif");
    if(!isset($s)) $s=11;
    $size = imagettfbbox($s,0,"fonts/TIMES.TTF",$text);
    $dx = abs($size[2]-$size[0]);
    $dy = abs($size[5]-$size[3]);
    $xpad=9;
    $ypad=9;
    $im = imagecreate($dx+$xpad,$dy+$ypad);
    $blue = ImageColorAllocate($im, 0x2c,0x6D,0xAF);
    $black = ImageColorAllocate($im, 0,0,0);
    $white = ImageColorAllocate($im, 255,255,255);
    ImageRectangle($im,0,0,$dx+$xpad-1,$dy+$ypad-1,$black);
    ImageRectangle($im,0,0,$dx+$xpad,$dy+$ypad,$white);
    ImageTTFText($im, $s, 0, (int)($xpad/2)+1, $dy+(int)($ypad/2), $black, "fonts/TIMES.TTF", $text);
    ImageTTFText($im, $s, 0, (int)($xpad/2), $dy+(int)($ypad/2)-1, $white, "fonts/TIMES.TTF", $text);
    ImageGif($im);
    ImageDestroy($im);
?>
#######################################################
很重要一点是你不能在这档案中放任何HTML tags.也不能有空白行在 <?和 ?> tag 之前或之後. 如果你用这段Script後看到一个不完整的影像, 表示你可能在PHP标签以外误打了字元.
以上的 script 可以由此语法在网页中叫出来: <IMG SRC="button.php3?s=36&text=PHP+is+Cool">    
#######################################################
[!--infotagslink--]

相关文章

  • Windows批量搜索并复制/剪切文件的批处理程序实例

    这篇文章主要介绍了Windows批量搜索并复制/剪切文件的批处理程序实例,需要的朋友可以参考下...2020-06-30
  • BAT批处理判断服务是否正常运行的方法(批处理命令综合应用)

    批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。这篇文章主要介绍了BAT批处理判断服务是否正常运行(批处理命令综合应用),需要的朋友可以参考下...2020-06-30
  • JS创建Tag标签的方法详解

    这篇文章主要介绍了JS创建Tag标签的方法,结合具体实例形式分析了javascript动态操作页面HTML元素实现tag标签功能的步骤与相关操作技巧,需要的朋友可以参考下...2017-06-15
  • JavaScript动态创建div属性和样式示例代码

    1.创建div元素: Javascript代码 复制代码 代码如下: <scripttypescripttype="text/javascript"> functioncreateElement(){ varcreateDiv=document.createElement("div"); createDiv.innerHTML="Testcreateadiveleme...2013-10-13
  • PHP file_get_contents设置超时处理方法

    file_get_contents的超时处理话说,从PHP5开始,file_get_content已经支持context了(手册上写着:5.0.0 Added the context support. ),也就是说,从5.0开始,file_get_contents其实也可以POST数据。今天说的这篇是讲超时的,确实在...2013-10-04
  • C#多线程中的异常处理操作示例

    这篇文章主要介绍了C#多线程中的异常处理操作,涉及C#多线程及异常的捕获、处理等相关操作技巧,需要的朋友可以参考下...2020-06-25
  • postgresql 中的时间处理小技巧(推荐)

    这篇文章主要介绍了postgresql 中的时间处理小技巧(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
  • Python同时处理多个异常的方法

    这篇文章主要介绍了Python同时处理多个异常的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-29
  • C#异常处理中try和catch语句及finally语句的用法示例

    这篇文章主要介绍了C#异常处理中try和catch语句及finally语句的用法示例,finally语句的使用涉及到了C#的垃圾回收特性,需要的朋友可以参考下...2020-06-25
  • python用moviepy对视频进行简单的处理

    这篇文章主要介绍了python如何用moviepy对视频进行简单的处理,帮助大家更好的利用python处理视频,感兴趣的朋友可以了解下...2021-03-11
  • PS如何创建变形文字 ps给文字变形的方法

    PS怎么创建变形文字?ps中想要给输入的文字变形,该怎么调整文字的显示形态呢?下面我们就来看看ps给文字变形的方法,需要的朋友可以参考下 我们在图层上输入文字后,可以...2017-07-06
  • 什么是cookie?js手动创建和存储cookie

    什么是cookie? cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。你可以使用 JavaScript 来创建和取回 cookie 的值。 有关cookie的例子: 名字 cookie 当访...2014-05-31
  • C#异常处理详解

    这篇文章介绍了C#异常处理,有需要的朋友可以参考一下...2020-06-25
  • javascript创建对象的几种模式介绍

    下面小编就为大家带来一篇javascript创建对象的几种模式介绍。小编觉得挺不错的,现在分享给大家,也给大家做个参考...2016-05-09
  • idea 无法创建Scala class 选项的原因分析及解决办法汇总

    这篇文章主要介绍了idea 无法创建Scala class 选项的解决办法汇总,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-02
  • php创建无限级树型菜单

    写递归函数,可考虑缓存,定义一些静态变量来存上一次运行的结果,多程序运行效率很有帮助.。 大概步骤如下: step1:到数据库取数据,放到一个数组, step2:把数据转化为一个树型状的数组, step3:把这个树型状的数组转为html代码。...2015-11-08
  • Drupal模块开发之创建自己的钩子

    Drupal可以让第三方模块创建自己的钩子。在通常的实践中,有两种类型的钩子你可能想要创建,一种是内容修改类的钩子,一种是拦截类的钩子。 Drupal的钩子系统允许和模...2016-11-25
  • sql server日志处理不当造成的隐患详解

    这篇文章主要给大家介绍了关于sql server日志处理不当造成的隐患的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用sql server具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-07-11
  • JavaScript 事件流、事件处理程序及事件对象总结

    JS与HTML之间的交互通过事件实现。事件就是文档或浏览器窗口中发生的一些特定的交互瞬间。可以使用监听器(或处理程序)来预定事件,以便事件发生时执行相应的代码。本文将介绍JS事件相关的基础知识。...2017-04-03
  • C#创建Windows服务的实现方法

    这篇文章主要介绍了C#创建Windows服务的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25