清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
/**
* 图片缩放水印类
*
* @version 1.0 ;
*
*/
class cls_photo
{
protected $waterrate = 0.2; //水印图标在图片上的比例
protected $width = 300; //缩略图默认宽度
protected $height = 200; //缩略图默认高度
protected $padding = 5; //水印图到边的距离
protected $water_mark = "./water.png";
protected $water_mark_pos = 5;//水印图片位置(1=左上角,2=右上角,3=左下角,4=右下角,5中央)
protected $watermode = 0;// 0缩略图时不打水印 1缩略图时打水印
protected $magick_handle;//图片操作句柄
protected $format = array('jpg','gif','png','jpeg'); // 图片文件格式限定
protected $smallpic_mode = 2;//默认模式 0为不生成缩略图, 1为裁切缩放 ,2为比例缩放 3为缩放填充模式
/**
* 设置图片类参数
*
* @param $arg 图片参数 多次可放入数组里 如下
* @param $protected 参数值
* array(
* 'waterrate'=>0.2,
* 'water_mark'=>'./water.png',
* 'water_mark_pos'=>4,
* 'smallpic_mode'=>1
* );
* @return ture/false
*/
public function set_args($arg,$val="")
{
$params = array('waterrate','water_mark','water_mark_pos','smallpic_mode','watermode','width','height');
if(is_array($arg))
{
foreach ($arg as $k =>$v)
{
if(in_array($k,$params))
{
$this->$k = $v;
}
}
}
else
{
if(empty($val))
{
return false;
}
else
{
if(in_array($arg,$params))
{
$this->$arg = $val;
}
}
}
return true;
}
/**
* 图片缩放
*
* @param $src_file 源文件路径
* @param $dst_file 目标文件路径
* @return 缩略图片路径/false
*/
public function scale($src_file,$dst_file="")
{
$dst_width = $this->width;
$dst_height = $this->height;
$mode = $this->smallpic_mode;
$magic_water_handle = NewMagickWand();
if (!MagickReadImage($magic_water_handle, $src_file))return false;
//类型
$srcext = strtolower(MagickGetImageFormat($magic_water_handle));
if($srcext=='bmp')
{
$srcext = 'jpeg';
}
if(!in_array($srcext,$this->format))return false;
//尺寸
$src_width = MagickGetImageWidth($magic_water_handle);
$src_height = MagickGetImageHeight($magic_water_handle);
//裁切缩放模式
if($mode == 1)
{
$pos_x=$pos_y = 0;//裁切临时位置
$src_widthc = $src_width;//裁切临时宽度
$src_heightc = $src_height;//裁切临时高度
if($src_width/$src_height>$dst_width/$dst_height)
{
$src_widthc = $src_height*$dst_width/$dst_height;
$pos_x = ($src_width-$src_widthc)/2;
}
else
{
$src_heightc = $src_width*$dst_height/$dst_width;
$pos_y = ($src_height-$src_heightc)/2;
}
MagickCropImage($magic_water_handle,$src_widthc,$src_heightc,$pos_x,$pos_y);//裁切
//因为MagickCropImage函数后,Gif 图像改,但画布不变
$this->magick_handle = NewMagickWand();
MagickNewImage($this->magick_handle,$src_widthc,$src_heightc,'#ffffff');
MagickSetFormat($this->magick_handle,$srcext);
MagickCompositeImage($this->magick_handle,$magic_water_handle,MW_OverCompositeOp,0,0);
//缩放
MagickScaleImage($this->magick_handle, $dst_width, $dst_height);
}
//比例缩放模式
if($mode == 2)
{
if($src_width/$src_height>$dst_width/$dst_height)
{
$dst_height=$dst_width*$src_height/$src_width;
}
else
{
$dst_width=$dst_height*$src_width/$src_height;
}
$this->magick_handle=$magic_water_handle;//替换
MagickScaleImage($this->magick_handle, $dst_width, $dst_height);//缩放
}
//缩放填充模式
if($mode == 3)
{
if($src_width/$src_height>$dst_width/$dst_height)
{
$dst_heightc=$dst_width*$src_height/$src_width;
$dst_widthc=$dst_width;
}
else
{
$dst_widthc=$dst_height*$src_width/$src_height;
$dst_heightc=$dst_height;
}
MagickScaleImage($magic_water_handle, $dst_widthc, $dst_heightc);//缩放
$this->magick_handle = NewMagickWand();
MagickNewImage($this->magick_handle,$dst_width,$dst_height,$this->smallpic_bgcolor);
MagickSetFormat($this->magick_handle,$srcext);
MagickCompositeImage($this->magick_handle,$magic_water_handle,MW_OverCompositeOp,($dst_width-$dst_widthc)/2,($dst_height-$dst_heightc)/2);
}
//打水印
if($this->watermode == 1)
{
$this->set_mark();
}
if(empty($dst_file))
{
//建立临时文件
$dst_file = tempnam($_SERVER["SINASRV_CACHE_DIR"],"TMP_IMG");
}
MagickWriteImage($this->magick_handle, $dst_file);
return $dst_file;
}
/**
* 打水印
*
* @param $src_file 要打水印的图片路径
* @param $dst_file 生产水印的文件保存路径,为空则生产随机临时文件
* @return 水印文件路径/false
*/
public function water_mark($src_file,$dst_file="")
{
$this->magick_handle = NewMagickWand();
if (!MagickReadImage($this->magick_handle, $src_file))
return false;
$this->set_mark();
if(empty($dst_file))
{
//建立临时文件
$dst_file = tempnam($_SERVER["SINASRV_CACHE_DIR"],"TMP_IMG");
}
MagickWriteImage($this->magick_handle, $dst_file);
return $dst_file;
}
/**
* 对内接口
* 给图片打水印
*
*/
protected function set_mark()
{
//尺寸
$dst_width = MagickGetImageWidth($this->magick_handle);
$dst_height = MagickGetImageHeight($this->magick_handle);
//处理水印图
if ($this->water_mark && is_file($this->water_mark))
{
$magic_water_handle = NewMagickWand();
MagickRemoveImage($magic_water_handle);
if (MagickReadImage($magic_water_handle, $this->water_mark))
{
MagickScaleImage($magic_water_handle, $dst_width*$this->waterrate, $dst_width*$this->waterrate*MagickGetImageHeight($magic_water_handle)/MagickGetImageWidth($magic_water_handle));//缩放水印到图片的1/5
if ($this->water_mark_pos == 1)
{
$left = $this->padding;
$top = $this->padding;
}
elseif ($this->water_mark_pos == 2)
{
$left = $dst_width-$this->padding-MagickGetImageWidth($magic_water_handle);
$top = $this->padding;
}
elseif ($this->water_mark_pos == 3)
{
$left = $this->padding;
$top = $dst_height -$this->padding-MagickGetImageHeight($magic_water_handle);
}
elseif ($this->water_mark_pos == 4)
{
$left = $dst_width-$this->padding-MagickGetImageWidth($magic_water_handle);
$top =$dst_height -$this->padding-MagickGetImageHeight($magic_water_handle);
}
elseif ($this->water_mark_pos == 5)
{
$left = ($dst_width-MagickGetImageWidth($magic_water_handle))/2;
$top =($dst_height -MagickGetImageHeight($magic_water_handle))/2;
}
MagickCompositeImage($this->magick_handle,$magic_water_handle,MW_OverCompositeOp,$left,$top);
}
}
}
}