本文目录一览:
求PHP图片处理类。
裁剪图片。合并,可以通过相应的函数进行,先确定图片的后缀,再确定使用的函数,具体可查看手册,getimagesize,imagecreatefromgif,imagecreatefromjpeg,imagecopy
thinkphp Image.class.php类的问题
这仅仅是个函数名而已,跟close没什么关系,不像是连接数据库,最后不用的时候关闭连接
php上传图片时有什么常用的类可以做做等比
功能:
1.按比例缩小/放大
2.填充背景色
3.按区域裁剪
4.添加水印,包括水印的位置,透明度等
?php
/** 缩略图生成类,支持imagemagick及gd库两种处理
* Date: 2013-07-15
* Author: fdipzone
* Ver: 1.2
*
* Func:
* public set_config: 设置参数
* public create_thumb: 生成缩略图
* private fit: 缩略图片
* private crop: 裁剪图片
* private gd_fit: GD库缩略图片
* private gd_crop: GD库裁剪图片
* private get_size: 获取要转换的size
* private get_crop_offset: 获取裁图的偏移量
* private add_watermark: 添加水印
* private check_handler: 判断处理程序是否已安装
* private create_dirs: 创建目录
* private exists: 判断参数是否存在
* private to_log: 记录log
* private hex2rgb: hex颜色转rgb颜色
* private get_file_ext: 获取图片类型
*
* ver: 1.1 增加GD库处理
* ver: 1.2 增加width,height错误参数处理
* 增加当图片colorspace不为RGB时作转RGB处理
* 修正使用crop保存为gif时出现透明无效区域问题,使用+repage参数,删除透明无效区域即可
*
* tips:建议使用imagemagick
* GD库不支持透明度水印,如果必须使用透明水印,请将水印图片做成有透明度。
* GD库输出gif如加透明水印,会有问题。
*/
class PicThumb{ // class start
private $_log = null; // log file
private $_handler = null; // 进行图片处理的程序,imagemagick/gd库
private $_type = 'fit'; // fit or crop
private $_source = null; // 原图路径
private $_dest = null; // 缩略图路径
private $_watermark = null; // 水印图片
private $_opacity = 75; // 水印图片透明度,gd库不支持
private $_gravity = 'SouthEast'; // 水印摆放位置 NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast
private $_geometry = '+10+10'; // 水印定位,gd库不支持
private $_croppos = 'TL'; // 截图的位置 TL TM TR ML MM MR BL BM BR
private $_bgcolor = null; // 填充的背景色
private $_quality = 90; // 生成的图片质量
private $_width = null; // 指定区域宽度
private $_height = null; // 指定区域高度
// 初始化
public function __construct($logfile=''){
if($logfile!=''){
$this-_log = $logfile;
}
}
// 设置参数
public function set_config($param=array()){
$this-_handler = $this-exists($param, 'handler')? strtolower($param['handler']) : null;
$this-_type = $this-exists($param, 'type')? strtolower($param['type']) : 'fit';
$this-_watermark = $this-exists($param, 'watermark')? $param['watermark'] : null;
$this-_opacity = $this-exists($param, 'opacity')? $param['opacity'] : 75;
$this-_gravity = $this-exists($param, 'gravity')? $param['gravity'] : 'SouthEast';
$this-_geometry = $this-exists($param, 'geometry')? $param['geometry'] : '+10+10';
$this-_croppos = $this-exists($param, 'croppos')? $param['croppos'] : 'TL';
$this-_bgcolor = $this-exists($param, 'bgcolor')? $param['bgcolor'] : null;
$this-_quality = $this-exists($param, 'quality')? $param['quality'] : 90;
$this-_width = $this-exists($param, 'width')? $param['width'] : null;
$this-_height = $this-exists($param, 'height')? $param['height'] : null;
}
/** 创建缩略图
* @param String $source 原图
* @param String $dest 目标图
* @return boolean
*/
public function create_thumb($source, $dest){
// 检查使用的handler是否已安装
if(!$this-check_handler()){
$this-to_log('handler not installed');
return false;
}
// 判断区域宽高是否正确
if(!is_numeric($this-_width) || !is_numeric($this-_height) || $this-_width=0 || $this-_height=0){
$this-to_log('width or height invalid');
return false;
}
// 判断源文件是否存在
if(!file_exists($source)){
$this-to_log($source.' not exists');
return false;
}
// 创建目标文件路径
if(!$this-create_dirs($dest)){
$this-to_log(dirname($dest).' create fail');
return false;
}
$this-_source = $source; // 源文件
$this-_dest = $dest; // 目标文件
// 处理图片
switch($this-_type){
case 'fit':
if($this-_handler=='imagemagick'){
return $this-fit();
}else{
return $this-gd_fit();
}
break;
case 'crop':
if($this-_handler=='imagemagick'){
return $this-crop();
}else{
return $this-gd_crop();
}
break;
default:
$this-to_log($this-_type.' not fit and crop');
return false;
}
}
/** 按比例压缩或拉伸图片
* @return boolean
*/
private function fit(){
// 判断是否填充背景
$bgcolor = ($this-_bgcolor!=null)?
sprintf(" -background '%s' -gravity center -extent '%sx%s' ", $this-_bgcolor, $this-_width, $this-_height) : "";
// 判断是否要转为RGB
$source_info = getimagesize($this-_source);
$colorspace = (!isset($source_info['channels']) || $source_info['channels']!=3)? ' -colorspace RGB ' : '';
// 命令行
$cmd = sprintf("convert -resize '%sx%s' '%s' %s -quality %s %s '%s'", $this-_width, $this-_height, $this-_source, $bgcolor, $this-_quality, $colorspace, $this-_dest);
// 记录执行的命令
$this-to_log($cmd);
// 执行命令
exec($cmd);
// 添加水印
$this-add_watermark($this-_dest);
return is_file($this-_dest)? true : false;
}
/** 裁剪图片
* @return boolean
*/
private function crop(){
// 获取生成的图片尺寸
list($pic_w, $pic_h) = $this-get_size();
// 获取截图的偏移量
list($offset_w, $offset_h) = $this-get_crop_offset($pic_w, $pic_h);
// 判断是否要转为RGB
$source_info = getimagesize($this-_source);
$colorspace = (!isset($source_info['channels']) || $source_info['channels']!=3)? ' -colorspace RGB ' : '';
// 命令行
$cmd = sprintf("convert -resize '%sx%s' '%s' -quality %s %s -crop %sx%s+%s+%s +repage '%s'", $pic_w, $pic_h, $this-_source, $this-_quality, $colorspace, $this-_width, $this-_height, $offset_w, $offset_h, $this-_dest);
// 记录执行的命令
$this-to_log($cmd);
// 执行命令
exec($cmd);
// 添加水印
$this-add_watermark($this-_dest);
return is_file($this-_dest)? true : false;
}
/** GD库按比例压缩或拉伸图片
* @return boolean
*/
private function gd_fit(){
// 获取生成的图片尺寸
list($pic_w, $pic_h) = $this-get_size();
list($owidth, $oheight, $otype) = getimagesize($this-_source);
switch($otype){
case 1: $source_img = imagecreatefromgif($this-_source); break;
case 2: $source_img = imagecreatefromjpeg($this-_source); break;
case 3: $source_img = imagecreatefrompng($this-_source); break;
default: return false;
}
// 按比例缩略/拉伸图片
$new_img = imagecreatetruecolor($pic_w, $pic_h);
imagecopyresampled($new_img, $source_img, 0, 0, 0, 0, $pic_w, $pic_h, $owidth, $oheight);
// 判断是否填充背景
if($this-_bgcolor!=null){
$bg_img = imagecreatetruecolor($this-_width, $this-_height);
$rgb = $this-hex2rgb($this-_bgcolor);
$bgcolor =imagecolorallocate($bg_img, $rgb['r'], $rgb['g'], $rgb['b']);
imagefill($bg_img, 0, 0, $bgcolor);
imagecopy($bg_img, $new_img, (int)(($this-_width-$pic_w)/2), (int)(($this-_height-$pic_h)/2), 0, 0, $pic_w, $pic_h);
$new_img = $bg_img;
}
// 获取目标图片的类型
$dest_ext = $this-get_file_ext($this-_dest);
// 生成图片
switch($dest_ext){
case 1: imagegif($new_img, $this-_dest, $this-_quality); break;
case 2: imagejpeg($new_img, $this-_dest, $this-_quality); break;
case 3: imagepng($new_img, $this-_dest, (int)(($this-_quality-1)/10)); break;
}
if(isset($source_img)){
imagedestroy($source_img);
}
if(isset($new_img)){
imagedestroy($new_img);
}
// 添加水印
$this-add_watermark($this-_dest);
return is_file($this-_dest)? true : false;
}
/** GD库裁剪图片
* @return boolean
*/
private function gd_crop(){
// 获取生成的图片尺寸
list($pic_w, $pic_h) = $this-get_size();
// 获取截图的偏移量
list($offset_w, $offset_h) = $this-get_crop_offset($pic_w, $pic_h);
list($owidth, $oheight, $otype) = getimagesize($this-_source);
switch($otype){
case 1: $source_img = imagecreatefromgif($this-_source); break;
case 2: $source_img = imagecreatefromjpeg($this-_source); break;
case 3: $source_img = imagecreatefrompng($this-_source); break;
default: return false;
}
// 按比例缩略/拉伸图片
$tmp_img = imagecreatetruecolor($pic_w, $pic_h);
imagecopyresampled($tmp_img, $source_img, 0, 0, 0, 0, $pic_w, $pic_h, $owidth, $oheight);
// 裁剪图片
$new_img = imagecreatetruecolor($this-_width, $this-_height);
imagecopyresampled($new_img, $tmp_img, 0, 0, $offset_w, $offset_h, $this-_width, $this-_height, $this-_width, $this-_height);
// 获取目标图片的类型
$dest_ext = $this-get_file_ext($this-_dest);
// 生成图片
switch($dest_ext){
case 1: imagegif($new_img, $this-_dest, $this-_quality); break;
case 2: imagejpeg($new_img, $this-_dest, $this-_quality); break;
case 3: imagepng($new_img, $this-_dest, (int)(($this-_quality-1)/10)); break;
}
if(isset($source_img)){
imagedestroy($source_img);
}
if(isset($tmp_img)){
imagedestroy($tmp_img);
}
if(isset($new_img)){
imagedestroy($new_img);
}
// 添加水印
$this-add_watermark($this-_dest);
return is_file($this-_dest)? true : false;
}
/** 获取目标图生成的size
* @return Array $width, $height
*/
private function get_size(){
list($owidth, $oheight) = getimagesize($this-_source);
$width = (int)($this-_width);
$height = (int)($this-_height);
switch($this-_type){
case 'fit':
$pic_w = $width;
$pic_h = (int)($pic_w*$oheight/$owidth);
if($pic_h$height){
$pic_h = $height;
$pic_w = (int)($pic_h*$owidth/$oheight);
}
break;
case 'crop':
$pic_w = $width;
$pic_h = (int)($pic_w*$oheight/$owidth);
if($pic_h$height){
$pic_h = $height;
$pic_w = (int)($pic_h*$owidth/$oheight);
}
break;
}
return array($pic_w, $pic_h);
}
/** 获取截图的偏移量
* @param int $pic_w 图宽度
* @param int $pic_h 图高度
* @return Array $offset_w, $offset_h
*/
private function get_crop_offset($pic_w, $pic_h){
$offset_w = 0;
$offset_h = 0;
switch(strtoupper($this-_croppos)){
case 'TL':
$offset_w = 0;
$offset_h = 0;
break;
case 'TM':
$offset_w = (int)(($pic_w-$this-_width)/2);
$offset_h = 0;
break;
case 'TR':
$offset_w = (int)($pic_w-$this-_width);
$offset_h = 0;
break;
case 'ML':
$offset_w = 0;
$offset_h = (int)(($pic_h-$this-_height)/2);
break;
case 'MM':
$offset_w = (int)(($pic_w-$this-_width)/2);
$offset_h = (int)(($pic_h-$this-_height)/2);
break;
case 'MR':
$offset_w = (int)($pic_w-$this-_width);
$offset_h = (int)(($pic_h-$this-_height)/2);
break;
case 'BL':
$offset_w = 0;
$offset_h = (int)($pic_h-$this-_height);
break;
case 'BM':
$offset_w = (int)(($pic_w-$this-_width)/2);
$offset_h = (int)($pic_h-$this-_height);
break;
case 'BR':
$offset_w = (int)($pic_w-$this-_width);
$offset_h = (int)($pic_h-$this-_height);
break;
}
return array($offset_w, $offset_h);
}