php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
本文实例讲述了php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法。分享给大家供大家参考。具体分析如下:
一个可以供PHP调用ImageMagick功能的PHP扩展。使用这个扩展可以使PHP具备和ImageMagick相同的功能。
ImageMagick是一套功能强大、稳定而且免费的工具集和开发包,可以用来读、写和处理超过185种基本格式的图片文件,包括流行的TIFF,JPEG,GIF,PNG,PDF以及PhotoCD等格式。利用ImageMagick,你可以根据web应用程序的需要动态生成图片,还可以对一个(或一组)图片进行改变大小、旋转、锐化、减色或增加特效等操作,并将操作的结果以相同格式或其它格式保存。
php_imagick是PHP对图片处理的一个扩展包,可以完成对图片改变大小、旋转、锐化、减色或增加特效等操作。
一、windows下安装Imagick扩展:
1、下载ImageMagick并安装
http://image_magick.veidrodis.com/image_magick/binaries/ImageMagick-6.6.2-10-Q16-windows-dll.exe
2、下载php_imagick.dll
http://valokuva.org/outside-blog-content/imagick-windows-builds/php53/imagick-2.3.0-dev/vc9_nts/php_imagick.dll
如果你用的是线程安全的php,请下载
http://valokuva.org/outside-blog-content/imagick-windows-builds/php53/imagick-2.3.0-dev/vc9_zts/php_imagick.dll
3、设置
在php.ini中添加
extension=php_imagick.dll,重启webserver
二、linux下安装Imagick扩展:
1.yum安装ImageMagick
yuminstallImageMagickImageMagick-devel
2.测试是否安装成功
convert-version
3.安装imagick扩展
01.wgethttp://pecl.php.net/get/imagick-3.1.0RC2.tgz02.tarxzvfimagick-3.1.0RC2.tgz03.cdimagick-3.1.0RC204.phpize05../configure06.make07.makeinstall
4.编辑php.ini文件,在文件末尾添加如下代码
extension=imagick.so
5.重新启动apache服务器
servicehttpdrestart
三、案例
1.边框处理
$image=newImagick("test.jpg");
$color=newImagickPixel();
$color->setColor("rgb(220,220,220)");
$image->borderImage($color,5,4);
$image->blurImage(5,5,imagick::CHANNEL_GREEN);
echo$image;
我们先来看个简单的实例
php_imagick程序示例
1.创建一个缩略图并显示出来
header("Content-type:image/jpeg");
$image=newImagick("image.jpg");
//If0isprovidedasawidthorheightparameter,//aspectratioismaintained
$image->thumbnailImage(100,0);
echo$image;
?>
2.创建一个目录下的缩略图,并保存
$images=newImagick(glob("images/*.JPG"));
foreach($imagesas$image){
//Providing0forcesthumbnailImagetomaintainaspectratio
$image->thumbnailImage(1024,0);
}
$images->writeImages();
?>
3.缩略GIF动画图片
/*CreateanewimagickobjectandreadinGIF*/
$im=newImagick("example.gif");
/*Resizeallframes*/
foreach($imas$frame){
/*50x50frames*/
$frame->thumbnailImage(50,50);
/*Setthevirtualcanvastocorrectsize*/
$frame->setImagePage(50,50,0,0);
}/*NoticewriteImagesinsteadofwriteImage*/
$im->writeImages("example_small.gif",true);
?>
现在我们进入正题吧,
示例:
裁切/生成缩略图/添加水印,自动检测和处理GIF
调用方式:
$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
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_west north north_east
west center east
south_west south south_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程序设计有所帮助。
相关文章
- php批量修改怎么实现,PinPHP购物分享系统2.2后台批量采集修改实现方法
- php实现网站访客数量统计的方法(简单实现,不能防刷新)
- PHP连接linux并执行命令,php实现ssh远程连接服务器并操作服务器,PHP跨服务器执行shell脚本
- PHP与MySQL融合,尽享轻松开发(php与mysql整合)
- PHP实现Linux脚本之旅(php调用linux脚本)
- PHP 操作 Redis:实现强大的数据存储 (php操作redis)
- 拓展PHP Redis功能的重要性与实现方法探讨(phpredis拓展)
- 使用 PHP 查询 MySQL 数据库的方法详解(php查询mysql数据)
- 实现PHP与MySQL的无缝连接,增强web开发效率(让php支持mysql)
- PHP连接Oracle:轻松实现数据库交互(php链接oracle)
- PHP与MSSQL的结合:实现无缝连接(php调用mssql)
- MySQL实现PHP数组存储的效果(mysql存储数组php)
- PHP编程查询MySQL数据库:入门指南(php 查询 mysql)
- PHP解决MSSQL数据库乱码问题(php解决mssql乱码)
- PHP编写的MSSQL查询:实现可能性无限(php写mssql查询)
- 检查PHP Redis环境实现快速可靠性服务(检查php redis)
- php程序的国际化实现方法(利用gettext)
- PHP以及MYSQL日期比较方法
- php中使用addslashes函数报错问题的解决方法
- 用PHP实现浏览器点击下载TXT文档的方法详解
- php使用Cookie实现和用户会话的方法