php 方便水印和缩略图的图形类

复制代码 代码如下:

  <?php

  /*

  *@author    夜无眠    [email protected]

  *copyright    http://www.gowake.cn

  */

  class img {

  function __construct($arg = null) {

  $args = func_get_args();

  if($arg == null) {

  return null;

  }

  $this->im = call_user_func_array(array($this,'create'),$args);

  }

  function __call($func,$arg) {

  if(function_exists('image'.$func)) {

  $funcstr = 'image'.$func;

  }elseif (function_exists($func)){

  $funcstr = $func;

  }else {

  error("没有这个类方法或函数");

  }

  return call_user_func_array($funcstr,$arg);

  }

  /*

  *创建图像

  *@param string/int 图片文件路径或者宽度

  *@param int 高度,可省略

  *@param string 6位16进制整数

  */

  function create($arg = null) {

  $args = func_get_args();

  if(is_file($args[0])) {

  $this->file = $args[0];

  $size = getimagesize($this->file) or error('图片类型错误');

  $this->size = $this->size ? $this->size : $size;

  $type = image_type_to_extension($size[2],false);

  $this->type = $this->type ? $this->type : $type;

  $createfunc = 'imagecreatefrom'.$type;

  $im = $createfunc($this->file);

  }elseif((int)$args[0]>0 and (int)$args[1]>0) {

  $im = imagecreatetruecolor((int)$args[0],(int)$args[1]) or error("对不起,参数错误!");

  if(!$args[2]) {

  $color = hexdec('7fffffff');

  imagecolortransparent($im,$color);

  }else {

  $color = hexdec(str_replace('#','',$args[2]));

  }

  $this->size = $this->size ? $this->size : array((int)$args[0] ,(int)$args[1]);

  imagefill($im, 1, 1, $color);

  }else {

  error("对不起,参数错误!");

  }

  //imagealphablending($im,false);//这两行用来记录透明通道

  imagesavealpha($im,true);

  imageinterlace($im,true);//开启隔行扫描

  return $im;

  }

  /*

  *生成缩略图

  *@param int $w 新图片的宽度

  *@param int $h 新图片的宽度

  *@param string/bool $color 可选,新图片的背景色,false或空为透明

  *@param bool $lashen 可选,是否拉伸,默认不拉伸

  */

  function suolue($w = null,$h = null,$color = false,$lashen = false) {

  $w_o = imagesx($this->im);

  $h_o = imagesy($this->im);

  if($w == null and $h != null) {

  $w = $h * $w_o/$h_o;

  }elseif ($w != null and $h == null){

  $h = $w * $h_o/$w_o;

  }

  $this->size = null;

  $im = $this->create($w,$h,$color);

  $w_n = $w;

  $h_n = $h;

  if($w_o/$h_o > $w/$h) {

  $h_n = $w*$h_o/$w_o;

  $y = ($h-$h_n)/2;

  }elseif ($w_o/$h_o < $w/$h){

  $w_n = $h*$w_o/$h_o;

  $x = ($w-$w_n)/2;

  }

  if($lashen) {

  $w_n = $w;

  $h_n = $h;

  $x = 0;

  $y = 0;

  }

  imagecopyresampled($im,$this->im,$x,$y,0,0,$w_n,$h_n,$w_o,$h_o);

  //imagedestroy($this->im);

  $this->im = $im;

  return $im;

  }

  /*

  *在图片上写字

  *@param string $str 要写的字符串

  *@param array $arg 字符串相关的参数,为一个关联数组,left 为距左边距离,right为距右边距离,left优先,top为距顶部距离,bottom为距底部距离,top优先;angle为角度,color为6位数16进制颜色,touming为文字透明度,font为字体文件

  */

  function write($str = '' , $arg = array()) {

  $size = $arg['size'] ? $arg['size'] : 20;

  $angle = $arg['angle'] ? $arg['angle'] : 0 ;

  $color = $arg['color'] ? $arg['color'] : '000000';

  $touming = $arg['touming'] ? $arg['touming'] : 100;

  $touming = dechex((100-$touming)*127/100);

  $color = hexdec($touming.str_replace("#","",$color));

  $font = $arg['font'] ? $arg['font'] : 'arial.ttf';

  $boxarr = imagettfbbox($size,$angle,$font,$str);

  $w = imagesx($this->im);

  $h = imagesy($this->im);

  $x_l = $x_r = $boxarr[0];

  $y_t = $y_b = $boxarr[1];

  for($i=0;$i<7;$i = $i+2) {

  $x_l = $boxarr[$i] < $x_l ? $boxarr[$i] : $x_l;

  $x_r = $boxarr[$i] > $x_r ? $boxarr[$i] : $x_r;

  $y_t = $boxarr[$i+1] < $y_t ? $boxarr[$i+1] : $y_t;

  $y_b = $boxarr[$i+1] > $y_b ? $boxarr[$i+1] : $y_b;

  }

  $width = $x_r - $x_l;

  $height = $y_b - $y_t;

  /*获取精确偏移量*/

  $im = $this->create($width*4,$height*4);

  $tm = hexdec('7fffffff');

  imagettftext($im,$size,$angle,$width*2,$height*2,$color,$font,$str);

  for($i=0;$i<$width*4;$i++) {

  for($ii=0;$ii<$height*4;$ii++) {

  if(imagecolorat($im,$i,$ii) != $tm) {

  $x_l = $i;

  break(2);

  }

  }

  }

  for($i=0;$i<$height*4;$i++) {

  for($ii=$x_l;$ii<$width*4;$ii++) {

  if(imagecolorat($im,$ii,$i) != $tm) {

  $y_t = $i;

  break(2);

  }

  }

  }

  for($i=$width*4-1;$i>0;$i--) {

  for($ii=$y_t;$ii<$height*4;$ii++) {

  if(imagecolorat($im,$i,$ii) != $tm) {

  $x_r = $i;

  break(2);

  }

  }

  }

  for($i=$height*4-1;$i>0;$i--) {

  for($ii=$x_l;$ii<=$x_r;$ii++) {

  if(imagecolorat($im,$ii,$i) != $tm) {

  $y_b = $i;

  break(2);

  }

  }

  }

  $x_off = $x_l - $width*2;

  $y_off = $y_b - $height*2;

  $width = $x_r - $x_l; //精确宽度

  $height = $y_b - $y_t; //精确高度

  imagedestroy($im);

  if(isset($arg['left'])) {

  $x = (int)$arg['left'] - $x_off;

  }elseif (isset($arg['right'])){

  $x = $w - (int)$arg['right'] - $width - $x_off;

  }else {

  $x = ($w - $width)/2 - $x_off;

  }

  if(isset($arg['top'])) {

  $y = (int)$arg['top'] - $y_off + $height;

  }elseif (isset($arg['bottom'])){

  $y = $h - (int)$arg['bottom'] - $y_off;

  }else {

  $y = ($h + $height)/2 - $y_off;

  }

  imagettftext($this->im,$size,$angle,$x,$y,$color,$font,$str);

  return $this->im;

  }

  /*

  *合并图片(如图片水影)

  *@param string/resource $file 图片文件路径或这图片标识符

  *@param array $arg 字符串相关的参数,为一个关联数组,left 为距左边距离,right为距右边距离,left优先,top为距顶部距离,bottom为距底部距离,top优先;touming为文字透明度

  */

  function merge($file,$arg = array()) {

  if(is_file($file)) {

  $imc = $this->create($file);

  }elseif(gettype($file)=='resource') {

  $imc = $file;

  }else {

  error("没有图片");

  }

  $touming = $arg['touming'] ? (int)$arg['touming'] : 100 ;

  $w = imagesx($this->im);

  $h = imagesy($this->im);

  $width = imagesx($imc);

  $height = imagesy($imc);

  if(isset($arg['left'])) {

  $x = (int)$arg['left'];

  }elseif (isset($arg['right'])){

  $x = $w - (int)$arg['right'] - $width;

  }else {

  $x = ($w - $width)/2;

  }

  if(isset($arg['top'])) {

  $y = (int)$arg['top'];

  }elseif (isset($arg['bottom'])){

  $y = $h - $height - $arg['bottom'];

  }else {

  $y = ($h - $height)/2;

  }

  imagecopymergegray($this->im,$imc,$x,$y,0,0,$width,$height,$touming);

  }

  /*

  *输出图片

  *@param string $type

  *@param string $filename 要转存的文件路径

  *@param int $zhiliang jpeg图片特有的,图像清晰度

  */

  function display($type = null,$filename = null,$zhiliang = null) {

  if($type == null) {

  $type = $this->type ? $this->type : 'jpg';

  }

  if(($type == 'jpeg' or $type == 'jpg') and $zhiliang == null) {

  $type = 'jpeg';

  $zhiliang = 100;

  }

  if($filename == null) {

  header('Content-type: image/'.$type);

  }

  $displayfunc = 'image'.$type;

  $displayfunc($this->im,$filename,$zhiliang);

  imagedestroy($this->im);

  }

  function randcolor($a,$b) {

  $a = $a>255 ? 255 : (int)$a;

  $a = $a<0 ? 0 : (int)$a;

  $b = $b>255 ? 255 : (int)$b;

  $b = $b<0 ? 0 : (int)$b;

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

  $color .= str_pad(dechex(mt_rand($a,$b)), 2, "0", STR_PAD_LEFT);

  }

  return $color;

  }

  }

  /*

  function error($msg,$debug = false) {

  $err = new Exception($msg);

  $str = "<pre>\n<span style="color:red" style="color:red">错误:</span>\n".print_r($err->getTrace(),1)."\n</pre>";

  if($debug == true) {

  file_put_contents(date('Y-m-d').".log",$str);

  return $str;

  }else{

  die($str);

  }

  }

  */

  ?>

  这是简单的用法实例

  

复制代码 代码如下:

  $img = new img('a.png');

  $m = $img->im;

  $im = $img->suolue(100);

  $img->im = $m;

  $img->suolue(300);

  $img->merge($m,array('left'=>0,'top'=>0,'touming'=>60));

  $img->merge($im,array('right'=>0,'top'=>0,'touming'=>60));

  $img->merge($im,array('left'=>0,'bottom'=>0,'touming'=>60));

  $img->merge($im,array('right'=>0,'bottom'=>0,'touming'=>60));

  $img->write("春天来了",array('left'=>0,'top'=>0,'size'=>30,'color'=>$img->randcolor(0,180),'angle'=>-45,'font'=>'simfang.ttf','touming'=>80));

  $img->write("春天来了",array('left'=>0,'bottom'=>0,'size'=>30,'color'=>$img->randcolor(0,180),'angle'=>45,'font'=>'simfang.ttf','touming'=>80));

  $img->write("春天来了",array('right'=>0,'bottom'=>0,'size'=>30,'color'=>$img->randcolor(0,180),'angle'=>-45,'font'=>'simfang.ttf','touming'=>80));

  $img->write("春天来了",array('right'=>0,'top'=>0,'size'=>30,'color'=>$img->randcolor(0,180),'angle'=>45,'font'=>'simfang.ttf','touming'=>80));

  $img->display("gif");