php 图片缩放水印,图片缩放水印PHP类

/**

* 图片缩放水印类

*

*/

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 );

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值