php 图像函数大举例(非原创)

如下方式是一种方法:

  if(!function_exists('imagecreate')) {

  die('本服务器不支持GD模块');

  }

  如果不支持的话,如何配置 ? 下载gd模块的dll文件,修改php.ini,重启服务器即可.

  以下简称PHP作图为PS.

  当您打算 PS的话,应该完成如下如下步骤,这是必经的.

  1:创建基本PS对象(我假设为$image),填充背景(默认黑),以后的全部ps操作都是基于这个背景图像的.

  2:在$image上作图.

  3:输出这个图像.

  4:销毁对象,清除使用内存.

  首先,我们来认识几个常用的函数,这些函数在php手册里面都有详细介绍,此处大体引用下.

  resource imagecreate ( int x_size, int y_size )

  imagecreate() 返回一个图像标识符,代表了一幅大小为 x_size 和 y_size 的空白图像。

  此函数基本同imagetruecolor($width,$height).

  ---------------------------------------------------------

  int imagecolorallocate ( resource image, int red, int green, int blue )

  imagecolorallocate() 返回一个标识符,代表了由给定的 RGB 成分组成的颜色。image 参数是 imagecreatetruecolor() 函数的返回值。red,green 和 blue 分别是所需要的颜色的红,绿,蓝成分。这些参数是 0 到 255 的整数或者十六进制的 0x00 到 0xFF。imagecolorallocate() 必须被调用以创建每一种用在 image 所代表的图像中的颜色。

  ---------------------------------------------------------

  bool imagefill ( resource image, int x, int y, int color )

  imagefill() 在 image 图像的坐标 x,y(图像左上角为 0, 0)处用 color 颜色执行区域填充(即与 x, y 点颜色相同且相邻的点都会被填充)。

  ---------------------------------------------------------

  bool imageline ( resource image, int x1, int y1, int x2, int y2, int color )

  imageline() 用 color 颜色在图像 image 中从坐标 x1,y1 到 x2,y2(图像左上角为 0, 0)画一条线段。

  ---------------------------------------------------------

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

  imagestring() 用 col 颜色将字符串 s 画到 image 所代表的图像的 x,y 坐标处(这是字符串左上角坐标,整幅图像的左上角为 0,0)。如果 font 是 1,2,3,4 或 5,则使用内置字体。

  ---------------------------------------------------------

  array imagettftext ( resource image, float size, float angle, int x, int y, int color, string fontfile, string text )

  本函数比较重要,参数较多,此处不再列出,它主要是写字到图像上,和上面的函数类似,但必前者强大.

  ---------------------------------------------------------

  bool imagefilltoborder ( resource image, int x, int y, int border, int color )

  imagefilltoborder() 从 x,y(图像左上角为 0, 0)点开始用 color 颜色执行区域填充,直到碰到颜色为 border 的边界为止。【注:边界内的所有颜色都会被填充。如果指定的边界色和该点颜色相同,则没有填充。如果图像中没有该边界色,则整幅图像都会被填充。】

  ------------------------------------------------

  bool imagefilledellipse ( resource image, int cx, int cy, int w, int h, int color )

  imagefilledellipse() 在 image 所代表的图像中以 cx,cy(图像左上角为 0, 0)为中心画一个椭圆。w 和 h 分别指定了椭圆的宽和高。椭圆用 color 颜色填充。如果成功则返回 TRUE,失败则返回 FALSE。

  =================================================

  输出图像数据:imagepng($image[,$filename])

  ======================================================

  例一:输出蓝色背景和交叉白线的图形

  <?php

  $width=35;

  $height=35;

  //创建对象

  $image=imagecreate($width,$height);

  //提取颜色

  $color_white=imagecolorallocate($image,255,255,255);//白色

  $color_blue=imagecolorallocate($image,0,0,108);//蓝色

  imagefill($image,0,0,$color_blue);

  //作图

  //线宽

  imagesetthickness($image,3);

  imageline($image,0,0,$width,$height ,$color_white);

  imageline($image,$width,0,0,$height ,$color_white);

  //发送对象至头

  header('content-type:image/png');

  imagepng($image);

  /*

  //发送对象至文件

  $filename="ex1.png";

  imagepng($image,$filename);

  */

  //销毁对象

  imagedestroy($image);

  ?>

  输出图像:

  在线演示:http://www.phzzy.org/temp/5do8/ex1.php

  例二: 阴阳图

  <?php

  $width=400;

  $height=400;

  $image=imagecreatetruecolor($width,$height);

  //提取颜色

  $color_black=imagecolorallocate($image,0,2,0);//

  $color_white=imagecolorallocate($image,255,255,255);//白色

  $color_blue=imagecolorallocate($image,0,0,108);//蓝色

  $color_red=imagecolorallocate($image,151,0,4);//红色

  $color_my=imagecolorallocate($image,192,192,255);//背景

  $color_temp=imagecolorallocate($image,199,199,199);//背景

  //作图

  imagefill($image,0,0,$color_white);

  //第一个是大圆

  imagefilledarc ($image,$width/2,$height/2,$height,$height,0,360,$color_blue,IMG_ARC_PIE);

  //两个小圆

  imagefilledellipse ($image,$width/2,$height/4 ,$height/2,$height/2,$color_red);

  imagefilledellipse ($image,$width/2,$height/4 * 3,$height/2,$height/2,$color_blue);

  /*imagefilledellipse -- 画一椭圆并填充*/

  imagefilledarc ($image,$width/2,$height/2,$height,$height,-90,90,$color_red,IMG_ARC_PIE);

  imagefilledellipse ($image,$width/2,$height/4 * 3,$height/2,$height/2,$color_blue);

  //发送对象至头

  header('content-type:image/png');

  imagepng($image);

  /*

  //发送对象至文件

  $filename="ex1.png";

  imagepng($image,$filename);

  */

  //销毁对象

  imagedestroy($image);

  ?>

  演示:

  http://www.phzzy.org/temp/5do8/ex2.php

  例三:3D图像--cool

  <?php

  $width=400;

  $height=400;

  $image = imagecreatetruecolor($width, $height);

  $white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF);

  $gray = imagecolorallocate($image, 0xC0, 0xC0, 0xC0);

  $darkgray = imagecolorallocate($image, 0x90, 0x90, 0x90);

  $navy = imagecolorallocate($image, 0x00, 0x00, 0x80);

  $darknavy = imagecolorallocate($image, 0x00, 0x00, 0x50);

  $red = imagecolorallocate($image, 0xFF, 0x00, 0x00);

  $darkred = imagecolorallocate($image, 0x90, 0x00, 0x00);

  imagefill($image,0,0,$white);

  // make the 3D effect

  for ($i = $height /2 +20; $i > $height /2; $i--) {

  imagefilledarc($image, $width/2, $i, $width/2, $height /2, 0, 45, $darknavy, IMG_ARC_PIE);

  imagefilledarc($image, $width/2, $i, $width/2, $height /2, 45, 75 , $darkgray, IMG_ARC_PIE);

  imagefilledarc($image, $width/2, $i, $width/2, $height /2, 75, 360 , $darkred, IMG_ARC_PIE);

  }

  imagefilledarc($image, $width/2, $height /2, $width/2, $height /2, 0, 45, $navy, IMG_ARC_PIE);

  imagefilledarc($image, $width/2, $height /2, $width/2, $height /2, 45, 75 , $gray, IMG_ARC_PIE);

  imagefilledarc($image, $width/2, $height /2, $width/2, $height /2, 75, 360 , $red, IMG_ARC_PIE);

  // flush image

  header('Content-type: image/png');

  imagepng($image);

  imagedestroy($image);

  /*

  //发送对象至文件

  $filename="ex1.png";

  imagepng($image,$filename);

  */

  ?>

  输出:

  演示:http://www.phzzy.org/temp/5do8/ex3.php

  例四:简单的验证码

  PHP创建验证码非常容易,容易的要死,简单的思路是这样的:

  随机种子生成,提取随机字符,相连打印到图形,输出.,为了防止色盲,可以随机提取颜色,也可以自定义颜色,下面看看:

  <?php

  session_start();

  $width=65;

  $height=20;

  $sourcestrings="0123456789aqwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";

  $image=imagecreate($width,$height);

  $colorarrs=array(

  imagecolorallocate($image,255,255,255),//white

  imagecolorallocate($image,0 ,0 , 0)//black

  );

  unset($sessionval);

  imagesetthickness($image,3);

  //随机得到字符串个数

  $strsize=rand(3,5);

  imagefill($image,0,0,$colorarrs[0]);

  //一个个的写字符串到图片

  for($i=0;$i<$strsize;$i++){

  $i_temp=rand(1,62);

  $sessionval .=$sourcestrings[$i_temp];

  $fontcolor=imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));

  $y_i = $height/2 + $font_size /3 ;

  imagechar($image,5, 1+ $i * $width /$strsize,5,$sourcestrings[$i_temp],$fontcolor);

  }

  //写入session,以后验证用

  unset($_SESSION['cjjer']);

  $_SESSION['cjjer'] = $sessionval;

  //添加杂点

  for($i=0;$i<$width /$height *2;$i++)

  { $i_x=rand(0,$width);

  $i_y=rand(0,$height);

  $pixelcolor=imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));

  imagesetpixel($image,$i_x,$i_y,$pixelcolor);

  }

  header('content-type:image/png');

  imagepng($image);

  imagedestroy($image);

  ?>

  生成的样式演示:

  在线演示:http://www.phzzy.org/temp/5do8/ex4_login.php

  有个很明显的问题就是生成的图片不够艳丽,从而很多的用户看起来不清楚,这样吧,我们自己设定几个比较艳丽的颜色然后输出,扩展colorarrs数组:

  $colorarrs=array(

  imagecolorallocate($image,255,255,255),

  imagecolorallocate($image,0,0,0),

  imagecolorallocate($image,0,70,0),

  imagecolorallocate($image,92,0,12),

  imagecolorallocate($image,0,0,128),

  imagecolorallocate($image,233,10,216)

  );

  然后把23行变为(17行):

  $fontcolor=$colorarrs[rand(1,count($colorarrs)-1)];

  输出:

  在线演示:http://www.phzzy.org/temp/5do8/ex5_login.php

  例五:大点的比较cool的验证码

  PS 的图像还是比较小的,有时候为了某些原因(个人站点为了玩cool,just我,商业站点玩风格,吸引用户,just google,后话),验证码不是局限于十几个px的限制,有时候完全可以整个2百多,没啥问题,这时候,一种方案是把前面生成的小图强制大点,可以不? 可以,但是,看起来不够光滑,这是事实,明显,宽带不再是最重要的问题,不说其他的,下面演示几个比较好看的生成方式:

  <?php

  session_start();

  $width=600;

  $height=100;

  if($height < $width /6)

  $height=$width / 4;

  $sourcestrings="0123456789aqwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";

  //创建对象

  $image=imagecreate($width,$height);

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

  imagefill($image,0,0,$white);

  //加载字体库

  $fonts= dirname(__FILE__);

  putenv('"gdfontpath=".$fonts=.""');

  $fontname='arial';

  $font_size=floor($height / 2);

  //得到字符串

  unset($sessionval);

  $strsize=rand(5,8);

  for($i=0;$i<$strsize;$i++){

  $i_temp=rand(1,62);

  $sessionval .=$sourcestrings[$i_temp];

  $x_i =$font_size + $i *$width / ($strsize+1);

  $y_i = $height / 2;

  $angle_i=rand(-120,120);

  $fontcolor_a=imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));

  imageTTFText($image,$font_size,$angle_i,$x_i,$y_i,$fontcolor_a,$fontname,$sourcestrings[$i_temp]);

  }

  unset($_SESSION['cjjer']);

  $_SESSION['cjjer'] = $sessionval;

  //杂点数目

  for($i=0;$i<$width * $height / 100;$i++)

  {

  $i_x=rand(0,$width);

  $i_y=rand(0,$height);

  imagesetpixel($image,$i_x,$i_y,imagecolorallocate($image,rand(0,255),rand(0,2550),rand(0,255)));

  }

  //发送对象

  header('content-type:image/png');

  imagepng($image);

  imagedestroy($image);

  ?>

  在线测试: http://www.phzzy.org/temp/5do8/ex6_login.php

  解释性说明:

  首先是宽和高,高太小字都看不清楚.随机提取的字符还是那么几个:

  $sourcestrings="0123456789aqwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";

  创建对象,填充成白色:

  $image=imagecreate($width,$height);

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

  imagefill($image,0,0,$white);

  然后加载您要验证码的字体:

  $fonts= dirname(__FILE__);//返回当前根目录,字体文件复制到这里,字体文件是*.ttf文件

  putenv('"gdfontpath=".$fonts=.""');

  $fontname='arial';

  定义字符的高度,这里我设置成高度的一半:

  $font_size=floor($height / 2);

  清除变量,随机设置要生成字符的个数:

  unset($sessionval);

  $strsize=rand(5,8);

  循环,一个个的把字符打上去:

  得到本次循环的字符串.,并加在变量后面一会儿写入session

  $i_temp=rand(1,62);

  $sessionval .=$sourcestrings[$i_temp];

  得到写入图像的字符串的位置(x和y坐标)

  $x_i =$font_size + $i *$width / ($strsize+1);

  $y_i = $height / 2;

  设置倾斜度,是从正面看的,.

  $angle_i=rand(-120,120);

  随机生成颜色,

  $fontcolor_a=imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));

  写入到图像;

  imageTTFText($image,$font_size,$angle_i,$x_i,$y_i,$fontcolor_a,$fontname,$sourcestrings[$i_temp]);

  如果对此函数存在疑问,请查阅相关资料.非常容易.

  写入到session,一边注册码使用:

  unset($_SESSION['cjjer']);

  $_SESSION['cjjer'] = $sessionval;

  添加杂点:

  //杂点数目

  for($i=0;$i<$width * $height / 100;$i++)

  {

  $i_x=rand(0,$width);

  $i_y=rand(0,$height);

  imagesetpixel($image,$i_x,$i_y,imagecolorallocate($image,rand(0,255),rand(0,2550),rand(0,255)));

  }

  输出到头:

  header('content-type:image/png');//这行表明是png图像,可不要,默认可以输出的.但不是图像的头格式

  imagepng($image);

  imagedestroy($image);

  你可以加载你自己的字体库,设置旋转角度$angle_i=rand(-120,120);设置字体高度$font_size=floor($height / 2);字体颜色$fontcolor_a和随机数的个数:$strsize=rand(5,8);

  例六:给图片打上水印,生成缩列图

  传统的ASP页子打水印和生成缩列图都是比较繁琐的,一般使用到的是其他组件什么的,但是,PHP可以轻松的干这些事情,正如您预料,不到30行的程序搞定这一切,请看这个源程序:

  <?php

  $source="my.jpg";

  $zoom=0.5;

  $str='我是帅哥,你是MM么?';

  $image=imagecreatefromjpeg($source);

  $width=imagesx($image);

  $height=imagesy($image);

  $color_red=imagecolorallocate($image,111,0,0);//红色

  $font=dirname(__FILE__). "//simsun.ttc";

  $str=iconv('GB2312','UTF-8',$str);

  $fontsize=30;

  $angle=25;

  $fromx=$width/5;

  $fromy=$height/2;

  imagettftext($image,$fontsize,$angle,$fromx,$fromy,$color_red,$font,$str);

  $width_temp=imagesx($image) * $zoom;

  $height_temp=imagesy($image) * $zoom;

  $img=imagecreatetruecolor($width_temp,$height_temp);

  imagecopyresized ($img,$image,0,0,0,0,$width_temp, $height_temp,$width,$height);

  imagedestroy($image);

  $file_zoomname="my_zoom_jpeg.jpg";

  imagejpeg($img,$file_zoomname);

  imagedestroy($img);

  ?>

  原始图片:

  生成的jpg图片:

  原始图片70K, 这里说下,如果生成gif,文件18k多,而png要用去76k,so我们生成缩列图用jpeg格式.

  代码分析:

  这里我先设置了几个参数:

  $source="my.jpg"; //源图片

  $zoom=0.5; //缩放百分比

  $str='我是帅哥,你是MM么?'; //水印的文字

  装载源图(不打水印不装载):

  $image=imagecreatefromjpeg($source);

  获取长,宽的大小:

  $width=imagesx($image);

  $height=imagesy($image);

  设置水印字体,因为我们用的是中文,必须导入中文字体库,否则写不上或乱码,然后必须转换字符串编码

  $font=dirname(__FILE__). "//simsun.ttc";

  $str=iconv('GB2312','UTF-8',$str);

  设置开始点,字体大小,视角:,写上字符串:

  $fontsize=30;

  $angle=25;

  $fromx=$width/5;

  $fromy=$height/2;

  imagettftext($image,$fontsize,$angle,$fromx,$fromy,$color_red,$font,$str);

  按照缩放的大小要求生成新大小的对象:

  $width_temp=imagesx($image) * $zoom;

  $height_temp=imagesy($image) * $zoom;

  $img=imagecreatetruecolor($width_temp,$height_temp);

  把源图copy到新图,gd库的imagecopyresized自动缩放大小的

  imagecopyresized ($img,$image,0,0,0,0,$width_temp, $height_temp,$width,$height);

  生成小图片,清除对象:

  imagedestroy($image);

  $file_zoomname="my_zoom_jpeg.jpg";

  imagejpeg($img,$file_zoomname);

  imagedestroy($img);

  生成缩洌图,水印大体核心技术就这么点.