PHP Imagick完美实现图片裁切、生成缩略图、添加水印
本文实例讲解了PHP使用Imagick裁切、生成缩略图、添加水印自动检测和处理,支持gif,分享给大家供大家参考,具体内容如下
调用方式:
include'imagick.class.php';
$image=newlib_image_imagick();
$image->open('a.gif');
$image->resize_to(100,100,'scale_fill');
$image->add_text('1024i.com',10,20);
$image->add_watermark('1024i.gif',10,50);
$image->save_to('x.gif');
imagick.class.php
<?php
/*
@版本日期:版本日期:2012年1月18日
@著作权所有:1024intelligence(<ahref="http://www.1024i.com"target="_blank">http://www.1024i.com</a>)
获得使用本类库的许可,您必须保留著作权声明信息.
报告漏洞,意见或建议,请联系LouBarnes(iua1024@gmail.com)
*/
classlib_image_imagick
{
private$image=null;
private$type=null;
//构造函数
publicfunction__construct(){}
//析构函数
publicfunction__destruct()
{
if($this->image!==null)$this->image->destroy();
}
//载入图像
publicfunctionopen($path)
{
$this->image=newImagick($path);
if($this->image)
{
$this->type=strtolower($this->image->getImageFormat());
}
return$this->image;
}
publicfunctioncrop($x=0,$y=0,$width=null,$height=null)
{
if($width==null)$width=$this->image->getImageWidth()-$x;
if($height==null)$height=$this->image->getImageHeight()-$y;
if($width<=0||$height<=0)return;
if($this->type=='gif')
{
$image=$this->image;
$canvas=newImagick();
$images=$image->coalesceImages();
foreach($imagesas$frame){
$img=newImagick();
$img->readImageBlob($frame);
$img->cropImage($width,$height,$x,$y);
$canvas->addImage($img);
$canvas->setImageDelay($img->getImageDelay());
$canvas->setImagePage($width,$height,0,0);
}
$image->destroy();
$this->image=$canvas;
}
else
{
$this->image->cropImage($width,$height,$x,$y);
}
}
/*
*更改图像大小
$fit:适应大小方式
'force':把图片强制变形成$widthX$height大小
'scale':按比例在安全框$widthX$height内缩放图片,输出缩放后图像大小不完全等于$widthX$height
'scale_fill':按比例在安全框$widthX$height内缩放图片,安全框内没有像素的地方填充色,使用此参数时可设置背景填充色$bg_color=array(255,255,255)(红,绿,蓝,透明度)透明度(0不透明-127完全透明))
其它:智能模能缩放图像并载取图像的中间部分$widthX$height像素大小
$fit='force','scale','scale_fill'时:输出完整图像
$fit=图像方位值时,输出指定位置部分图像
字母与图像的对应关系如下:
north_westnorthnorth_east
westcentereast
south_westsouthsouth_east
*/
publicfunctionresize_to($width=100,$height=100,$fit='center',$fill_color=array(255,255,255,0))
{
switch($fit)
{
case'force':
if($this->type=='gif')
{
$image=$this->image;
$canvas=newImagick();
$images=$image->coalesceImages();
foreach($imagesas$frame){
$img=newImagick();
$img->readImageBlob($frame);
$img->thumbnailImage($width,$height,false);
$canvas->addImage($img);
$canvas->setImageDelay($img->getImageDelay());
}
$image->destroy();
$this->image=$canvas;
}
else
{
$this->image->thumbnailImage($width,$height,false);
}
break;
case'scale':
if($this->type=='gif')
{
$image=$this->image;
$images=$image->coalesceImages();
$canvas=newImagick();
foreach($imagesas$frame){
$img=newImagick();
$img->readImageBlob($frame);
$img->thumbnailImage($width,$height,true);
$canvas->addImage($img);
$canvas->setImageDelay($img->getImageDelay());
}
$image->destroy();
$this->image=$canvas;
}
else
{
$this->image->thumbnailImage($width,$height,true);
}
break;
case'scale_fill':
$size=$this->image->getImagePage();
$src_width=$size['width'];
$src_height=$size['height'];
$x=0;
$y=0;
$dst_width=$width;
$dst_height=$height;
if($src_width*$height>$src_height*$width)
{
$dst_height=intval($width*$src_height/$src_width);
$y=intval(($height-$dst_height)/2);
}
else
{
$dst_width=intval($height*$src_width/$src_height);
$x=intval(($width-$dst_width)/2);
}
$image=$this->image;
$canvas=newImagick();
$color='rgba('.$fill_color[0].','.$fill_color[1].','.$fill_color[2].','.$fill_color[3].')';
if($this->type=='gif')
{
$images=$image->coalesceImages();
foreach($imagesas$frame)
{
$frame->thumbnailImage($width,$height,true);
$draw=newImagickDraw();
$draw->composite($frame->getImageCompose(),$x,$y,$dst_width,$dst_height,$frame);
$img=newImagick();
$img->newImage($width,$height,$color,'gif');
$img->drawImage($draw);
$canvas->addImage($img);
$canvas->setImageDelay($img->getImageDelay());
$canvas->setImagePage($width,$height,0,0);
}
}
else
{
$image->thumbnailImage($width,$height,true);
$draw=newImagickDraw();
$draw->composite($image->getImageCompose(),$x,$y,$dst_width,$dst_height,$image);
$canvas->newImage($width,$height,$color,$this->get_type());
$canvas->drawImage($draw);
$canvas->setImagePage($width,$height,0,0);
}
$image->destroy();
$this->image=$canvas;
break;
default:
$size=$this->image->getImagePage();
$src_width=$size['width'];
$src_height=$size['height'];
$crop_x=0;
$crop_y=0;
$crop_w=$src_width;
$crop_h=$src_height;
if($src_width*$height>$src_height*$width)
{
$crop_w=intval($src_height*$width/$height);
}
else
{
$crop_h=intval($src_width*$height/$width);
}
switch($fit)
{
case'north_west':
$crop_x=0;
$crop_y=0;
break;
case'north':
$crop_x=intval(($src_width-$crop_w)/2);
$crop_y=0;
break;
case'north_east':
$crop_x=$src_width-$crop_w;
$crop_y=0;
break;
case'west':
$crop_x=0;
$crop_y=intval(($src_height-$crop_h)/2);
break;
case'center':
$crop_x=intval(($src_width-$crop_w)/2);
$crop_y=intval(($src_height-$crop_h)/2);
break;
case'east':
$crop_x=$src_width-$crop_w;
$crop_y=intval(($src_height-$crop_h)/2);
break;
case'south_west':
$crop_x=0;
$crop_y=$src_height-$crop_h;
break;
case'south':
$crop_x=intval(($src_width-$crop_w)/2);
$crop_y=$src_height-$crop_h;
break;
case'south_east':
$crop_x=$src_width-$crop_w;
$crop_y=$src_height-$crop_h;
break;
default:
$crop_x=intval(($src_width-$crop_w)/2);
$crop_y=intval(($src_height-$crop_h)/2);
}
$image=$this->image;
$canvas=newImagick();
if($this->type=='gif')
{
$images=$image->coalesceImages();
foreach($imagesas$frame){
$img=newImagick();
$img->readImageBlob($frame);
$img->cropImage($crop_w,$crop_h,$crop_x,$crop_y);
$img->thumbnailImage($width,$height,true);
$canvas->addImage($img);
$canvas->setImageDelay($img->getImageDelay());
$canvas->setImagePage($width,$height,0,0);
}
}
else
{
$image->cropImage($crop_w,$crop_h,$crop_x,$crop_y);
$image->thumbnailImage($width,$height,true);
$canvas->addImage($image);
$canvas->setImagePage($width,$height,0,0);
}
$image->destroy();
$this->image=$canvas;
}
}
//添加水印图片
publicfunctionadd_watermark($path,$x=0,$y=0)
{
$watermark=newImagick($path);
$draw=newImagickDraw();
$draw->composite($watermark->getImageCompose(),$x,$y,$watermark->getImageWidth(),$watermark->getimageheight(),$watermark);
if($this->type=='gif')
{
$image=$this->image;
$canvas=newImagick();
$images=$image->coalesceImages();
foreach($imageas$frame)
{
$img=newImagick();
$img->readImageBlob($frame);
$img->drawImage($draw);
$canvas->addImage($img);
$canvas->setImageDelay($img->getImageDelay());
}
$image->destroy();
$this->image=$canvas;
}
else
{
$this->image->drawImage($draw);
}
}
//添加水印文字
publicfunctionadd_text($text,$x=0,$y=0,$angle=0,$style=array())
{
$draw=newImagickDraw();
if(isset($style['font']))$draw->setFont($style['font']);
if(isset($style['font_size']))$draw->setFontSize($style['font_size']);
if(isset($style['fill_color']))$draw->setFillColor($style['fill_color']);
if(isset($style['under_color']))$draw->setTextUnderColor($style['under_color']);
if($this->type=='gif')
{
foreach($this->imageas$frame)
{
$frame->annotateImage($draw,$x,$y,$angle,$text);
}
}
else
{
$this->image->annotateImage($draw,$x,$y,$angle,$text);
}
}
//保存到指定路径
publicfunctionsave_to($path)
{
if($this->type=='gif')
{
$this->image->writeImages($path,true);
}
else
{
$this->image->writeImage($path);
}
}
//输出图像
publicfunctionoutput($header=true)
{
if($header)header('Content-type:'.$this->type);
echo$this->image->getImagesBlob();
}
publicfunctionget_width()
{
$size=$this->image->getImagePage();
return$size['width'];
}
publicfunctionget_height()
{
$size=$this->image->getImagePage();
return$size['height'];
}
//设置图像类型,默认与源类型一致
publicfunctionset_type($type='png')
{
$this->type=$type;
$this->image->setImageFormat($type);
}
//获取源图像类型
publicfunctionget_type()
{
return$this->type;
}
//当前对象是否为图片
publicfunctionis_image()
{
if($this->image)
returntrue;
else
returnfalse;
}
publicfunctionthumbnail($width=100,$height=100,$fit=true){$this->image->thumbnailImage($width,$height,$fit);}//生成缩略图$fit为真时将保持比例并在安全框$widthX$height内生成缩略图片
/*
添加一个边框
$width:左右边框宽度
$height:上下边框宽度
$color:颜色:RGB颜色'rgb(255,0,0)'或16进制颜色'#FF0000'或颜色单词'white'/'red'...
*/
publicfunctionborder($width,$height,$color='rgb(220,220,220)')
{
$color=newImagickPixel();
$color->setColor($color);
$this->image->borderImage($color,$width,$height);
}
publicfunctionblur($radius,$sigma){$this->image->blurImage($radius,$sigma);}//模糊
publicfunctiongaussian_blur($radius,$sigma){$this->image->gaussianBlurImage($radius,$sigma);}//高斯模糊
publicfunctionmotion_blur($radius,$sigma,$angle){$this->image->motionBlurImage($radius,$sigma,$angle);}//运动模糊
publicfunctionradial_blur($radius){$this->image->radialBlurImage($radius);}//径向模糊
publicfunctionadd_noise($type=null){$this->image->addNoiseImage($type==null?imagick::NOISE_IMPULSE:$type);}//添加噪点
publicfunctionlevel($black_point,$gamma,$white_point){$this->image->levelImage($black_point,$gamma,$white_point);}//调整色阶
publicfunctionmodulate($brightness,$saturation,$hue){$this->image->modulateImage($brightness,$saturation,$hue);}//调整亮度、饱和度、色调
publicfunctioncharcoal($radius,$sigma){$this->image->charcoalImage($radius,$sigma);}//素描
publicfunctionoil_paint($radius){$this->image->oilPaintImage($radius);}//油画效果
publicfunctionflop(){$this->image->flopImage();}//水平翻转
publicfunctionflip(){$this->image->flipImage();}//垂直翻转
}
希望本文所述对大家学习php程序设计有所帮助。