
<?php |
/** |
* |
* 图像处理类 |
* @author FC_LAMP |
* @internal功能包含:水印,缩略图 |
*/ |
class Img |
{ |
//图片格式 |
private $exts = array ('jpg', 'jpeg', 'gif', 'bmp', 'png' ); |
/** |
* |
* |
* @throws Exception |
*/ |
public function __construct() |
{ |
if (! function_exists ( 'gd_info' )) |
{ |
throw new Exception ( '加载GD库失败!' ); |
} |
} |
/** |
* |
* 裁剪压缩 |
* @param $src_img 图片 |
* @param $save_img 生成后的图片 |
* @param $option 参数选项,包括: $maxwidth 宽 $maxheight 高 |
* array('width'=>xx,'height'=>xxx) |
* @internal |
* 我们一般的压缩图片方法,在图片过长或过宽时生成的图片 |
* 都会被“压扁”,针对这个应采用先裁剪后按比例压缩的方法 |
*/ |
public function thumb_img($src_img, $save_img = '', $option) |
{ |
if (empty ( $option ['width'] ) or empty ( $option ['height'] )) |
{ |
return array ('flag' => False, 'msg' => '原图长度与宽度不能小于0' ); |
} |
$org_ext = $this->is_img ( $src_img ); |
if (! $org_ext ['flag']) |
{ |
return $org_ext; |
} |
//如果有保存路径,则确定路径是否正确 |
if (! empty ( $save_img )) |
{ |
$f = $this->check_dir ( $save_img ); |
if (! $f ['flag']) |
{ |
return $f; |
} |
} |
//获取出相应的方法 |
$org_funcs = $this->get_img_funcs ( $org_ext ['msg'] ); |
//获取原大小 |
$source = $org_funcs ['create_func'] ( $src_img ); |
$src_w = imagesx ( $source ); |
$src_h = imagesy ( $source ); |
//调整原始图像(保持图片原形状裁剪图像) |
$dst_scale = $option ['height'] / $option ['width']; //目标图像长宽比 |
$src_scale = $src_h / $src_w; // 原图长宽比 |
if ($src_scale >= $dst_scale) |
{ // 过高 |
$w = intval ( $src_w ); |
$h = intval ( $dst_scale * $w ); |
$x = 0; |
$y = ($src_h - $h) / 3; |
} else |
{ // 过宽 |
$h = intval ( $src_h ); |
$w = intval ( $h / $dst_scale ); |
$x = ($src_w - $w) / 2; |
$y = 0; |
} |
// 剪裁 |
$croped = imagecreatetruecolor ( $w, $h ); |
imagecopy ( $croped, $source, 0, 0, $x, $y, $src_w, $src_h ); |
// 缩放 |
$scale = $option ['width'] / $w; |
$target = imagecreatetruecolor ( $option ['width'], $option ['height'] ); |
$final_w = intval ( $w * $scale ); |
$final_h = intval ( $h * $scale ); |
imagecopyresampled ( $target, $croped, 0, 0, 0, 0, $final_w, $final_h, $w, $h ); |
imagedestroy ( $croped ); |
//输出(保存)图片 |
if (! empty ( $save_img )) |
{ |
$org_funcs ['save_func'] ( $target, $save_img ); |
} else |
{ |
header ( $org_funcs ['header'] ); |
$org_funcs ['save_func'] ( $target ); |
} |
imagedestroy ( $target ); |
return array ('flag' => True, 'msg' => '' ); |
} |
/** |
* |
* 等比例缩放图像 |
* @param $src_img 原图片 |
* @param $save_img 需要保存的地方 |
* @param $option 参数设置 array('width'=>xx,'height'=>xxx) |
* |
*/ |
function resize_image($src_img, $save_img = '', $option) |
{ |
$org_ext = $this->is_img ( $src_img ); |
if (! $org_ext ['flag']) |
{ |
return $org_ext; |
} |
//如果有保存路径,则确定路径是否正确 |
if (! empty ( $save_img )) |
{ |
$f = $this->check_dir ( $save_img ); |
if (! $f ['flag']) |
{ |
return $f; |
} |
} |
//获取出相应的方法 |
$org_funcs = $this->get_img_funcs ( $org_ext ['msg'] ); |
//获取原大小 |
$source = $org_funcs ['create_func'] ( $src_img ); |
$src_w = imagesx ( $source ); |
$src_h = imagesy ( $source ); |
if (($option ['width'] && $src_w > $option ['width']) || ($option ['height'] && $src_h > $option ['height'])) |
{ |
if ($option ['width'] && $src_w > $option ['width']) |
{ |
$widthratio = $option ['width'] / $src_w; |
$resizewidth_tag = true; |
} |
if ($option ['height'] && $src_h > $option ['height']) |
{ |
$heightratio = $option ['height'] / $src_h; |
$resizeheight_tag = true; |
} |
if ($resizewidth_tag && $resizeheight_tag) |
{ |
if ($widthratio < $heightratio) |
$ratio = $widthratio; |
else |
$ratio = $heightratio; |
} |
if ($resizewidth_tag && ! $resizeheight_tag) |
$ratio = $widthratio; |
if ($resizeheight_tag && ! $resizewidth_tag) |
$ratio = $heightratio; |
$newwidth = $src_w * $ratio; |
$newheight = $src_h * $ratio; |
if (function_exists ( "imagecopyresampled" )) |
{ |
$newim = imagecreatetruecolor ( $newwidth, $newheight ); |
imagecopyresampled ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h ); |
} else |
{ |
$newim = imagecreate ( $newwidth, $newheight ); |
imagecopyresized ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h ); |
} |
} |
//输出(保存)图片 |
if (! empty ( $save_img )) |
{ |
$org_funcs ['save_func'] ( $newim, $save_img ); |
} else |
{ |
header ( $org_funcs ['header'] ); |
$org_funcs ['save_func'] ( $newim ); |
} |
imagedestroy ( $newim ); |
return array ('flag' => True, 'msg' => '' ); |
} |
/** |
* |
* 生成水印图片 |
* @param $org_img 原图像 |
* @param $mark_img 水印标记图像 |
* @param $save_img 当其目录不存在时,会试着创建目录 |
* @param array $option 为水印的一些基本设置包含: |
* x:水印的水平位置,默认为减去水印图宽度后的值 |
* y:水印的垂直位置,默认为减去水印图高度后的值 |
* alpha:alpha值(控制透明度),默认为50 |
*/ |
public function water_mark($org_img, $mark_img, $save_img = '', $option = array()) |
{ |
//检查图片 |
$org_ext = $this->is_img ( $org_img ); |
if (! $org_ext ['flag']) |
{ |
return $org_ext; |
} |
$mark_ext = $this->is_img ( $mark_img ); |
if (! $mark_ext ['flag']) |
{ |
return $mark_ext; |
} |
//如果有保存路径,则确定路径是否正确 |
if (! empty ( $save_img )) |
{ |
$f = $this->check_dir ( $save_img ); |
if (! $f ['flag']) |
{ |
return $f; |
} |
} |
//获取相应画布 |
$org_funcs = $this->get_img_funcs ( $org_ext ['msg'] ); |
$org_img_im = $org_funcs ['create_func'] ( $org_img ); |
$mark_funcs = $this->get_img_funcs ( $mark_ext ['msg'] ); |
$mark_img_im = $mark_funcs ['create_func'] ( $mark_img ); |
//拷贝水印图片坐标 |
$mark_img_im_x = 0; |
$mark_img_im_y = 0; |
//拷贝水印图片高宽 |
$mark_img_w = imagesx ( $mark_img_im ); |
$mark_img_h = imagesy ( $mark_img_im ); |
$org_img_w = imagesx ( $org_img_im ); |
$org_img_h = imagesx ( $org_img_im ); |
//合成生成点坐标 |
$x = $org_img_w - $mark_img_w; |
$org_img_im_x = isset ( $option ['x'] ) ? $option ['x'] : $x; |
$org_img_im_x = ($org_img_im_x > $org_img_w or $org_img_im_x < 0) ? $x : $org_img_im_x; |
$y = $org_img_h - $mark_img_h; |
$org_img_im_y = isset ( $option ['y'] ) ? $option ['y'] : $y; |
$org_img_im_y = ($org_img_im_y > $org_img_h or $org_img_im_y < 0) ? $y : $org_img_im_y; |
//alpha |
$alpha = isset ( $option ['alpha'] ) ? $option ['alpha'] : 50; |
$alpha = ($alpha > 100 or $alpha < 0) ? 50 : $alpha; |
//合并图片 |
imagecopymerge ( $org_img_im, $mark_img_im, $org_img_im_x, $org_img_im_y, $mark_img_im_x, $mark_img_im_y, $mark_img_w, $mark_img_h, $alpha ); |
//输出(保存)图片 |
if (! empty ( $save_img )) |
{ |
$org_funcs ['save_func'] ( $org_img_im, $save_img ); |
} else |
{ |
header ( $org_funcs ['header'] ); |
$org_funcs ['save_func'] ( $org_img_im ); |
} |
//销毁画布 |
imagedestroy ( $org_img_im ); |
imagedestroy ( $mark_img_im ); |
return array ('flag' => True, 'msg' => '' ); |
} |
/** |
* |
* 检查图片 |
* @param unknown_type $img_path |
* @return array('flag'=>true/false,'msg'=>ext/错误信息) |
*/ |
private function is_img($img_path) |
{ |
if (! file_exists ( $img_path )) |
{ |
return array ('flag' => False, 'msg' => "加载图片 $img_path 失败!" ); |
} |
$ext = explode ( '.', $img_path ); |
$ext = strtolower ( end ( $ext ) ); |
if (! in_array ( $ext, $this->exts )) |
{ |
return array ('flag' => False, 'msg' => "图片 $img_path 格式不正确!" ); |
} |
return array ('flag' => True, 'msg' => $ext ); |
} |
/** |
* |
* 返回正确的图片函数 |
* @param unknown_type $ext |
*/ |
private function get_img_funcs($ext) |
{ |
//选择 |
switch ($ext) |
{ |
case 'jpg' : |
$header = 'Content-Type:image/jpeg'; |
$createfunc = 'imagecreatefromjpeg'; |
$savefunc = 'imagejpeg'; |
break; |
case 'jpeg' : |
$header = 'Content-Type:image/jpeg'; |
$createfunc = 'imagecreatefromjpeg'; |
$savefunc = 'imagejpeg'; |
break; |
case 'gif' : |
$header = 'Content-Type:image/gif'; |
$createfunc = 'imagecreatefromgif'; |
$savefunc = 'imagegif'; |
break; |
case 'bmp' : |
$header = 'Content-Type:image/bmp'; |
$createfunc = 'imagecreatefrombmp'; |
$savefunc = 'imagebmp'; |
break; |
default : |
$header = 'Content-Type:image/png'; |
$createfunc = 'imagecreatefrompng'; |
$savefunc = 'imagepng'; |
} |
return array ('save_func' => $savefunc, 'create_func' => $createfunc, 'header' => $header ); |
} |
/** |
* |
* 检查并试着创建目录 |
* @param $save_img |
*/ |
private function check_dir($save_img) |
{ |
$dir = dirname ( $save_img ); |
if (! is_dir ( $dir )) |
{ |
if (! mkdir ( $dir, 0777, true )) |
{ |
return array ('flag' => False, 'msg' => "图片保存目录 $dir 无法创建!" ); |
} |
} |
return array ('flag' => True, 'msg' => '' ); |
} |
} |
if (! empty ( $_FILES ['test'] ['tmp_name'] )) |
{ |
//例子 |
$img = new Img (); |
//原图 |
$name = explode ( '.', $_FILES ['test'] ['name'] ); |
$org_img = 'D:/test.' . end ( $name ); |
move_uploaded_file ( $_FILES ['test'] ['tmp_name'], $org_img ); |
$option = array ('width' => $_POST ['width'], 'height' => $_POST ['height'] ); |
if ($_POST ['type'] == 1) |
{ |
$s = $img->resize_image ( $org_img, '', $option ); |
} else |
{ |
$img->thumb_img ( $org_img, '', $option ); |
} |
unlink ( $org_img ); |
} |



