PHP中使用Imagick实现各种图片效果实例
imagick是一个功能强大的图像处理库。
说是翻译其实就是简要介绍imagick的主要功能的或者说是我觉得比较实用的功能函数的介绍以及使用的例子。
因为本人的英语水平有限,所以采用比较通俗或者说比较贴近应用化的语言来描述。
先欣赏一组炫丽的效果:
偏置图像:
例子:
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $image->rollImage(20,39); echo$image; ?>
thumbnailImage($width,$height)改变图片大小
例子:
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $image->thumbnailImage(100,0); echo$image; ?>
addNoiseImage(int$noise_type[,int$channel=Imagick::CHANNEL_ALL]);
功能:
Addsrandomnoisetotheimage
添加干扰素
Noiseconstants($noise_type类型) imagick::NOISE_UNIFORM(integer) imagick::NOISE_GAUSSIAN(integer) imagick::NOISE_MULTIPLICATIVEGAUSSIAN(integer) imagick::NOISE_IMPULSE(integer) imagick::NOISE_LAPLACIAN(integer) imagick::NOISE_POISSON(integer) Channelconstants($channel类型) imagick::CHANNEL_UNDEFINED(integer) imagick::CHANNEL_RED(integer) imagick::CHANNEL_GRAY(integer) imagick::CHANNEL_CYAN(integer) imagick::CHANNEL_GREEN(integer) imagick::CHANNEL_MAGENTA(integer) imagick::CHANNEL_BLUE(integer) imagick::CHANNEL_YELLOW(integer) imagick::CHANNEL_ALPHA(integer) imagick::CHANNEL_OPACITY(integer) imagick::CHANNEL_MATTE(integer) imagick::CHANNEL_BLACK(integer) imagick::CHANNEL_INDEX(integer) imagick::CHANNEL_ALL(integer)
例子:
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $image->thumbnailImage(100,0); $image->addNoiseImage(imagick::NOISE_POISSON,imagick::CHANNEL_OPACITY); echo$image; ?>
annotateImage创建文本图像
例子:
<?php $image=newImagick(); $draw=newImagickDraw(); $pixel=newImagickPixel('gray'); $image->newImage(800,75,$pixel); $pixel->setColor('black'); $draw->setFont('Bookman-DemiItalic'); $draw->setFontSize(30); $image->annotateImage($draw,10,45,0,'Thequickbrownfoxjumpsoverthelazydog'); $image->setImageFormat('png'); header('Content-type:image/png'); echo$image; ?>
blurImage(float$radius,float$sigma[,int$channel])
Addsblurfiltertoimage图像模糊度处理
参数:
int$channel: imagick::CHANNEL_UNDEFINED(integer) imagick::CHANNEL_RED(integer) imagick::CHANNEL_GRAY(integer) imagick::CHANNEL_CYAN(integer) imagick::CHANNEL_GREEN(integer) imagick::CHANNEL_MAGENTA(integer) imagick::CHANNEL_BLUE(integer) imagick::CHANNEL_YELLOW(integer) imagick::CHANNEL_ALPHA(integer) imagick::CHANNEL_OPACITY(integer) imagick::CHANNEL_MATTE(integer) imagick::CHANNEL_BLACK(integer) imagick::CHANNEL_INDEX(integer) imagick::CHANNEL_ALL(integer)
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $image->blurImage(5,3); echo$image; ?>
borderImage(mixed$bordercolor,int$width,int$height)图片边框处理
例子:
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $color=newImagickPixel(); $color->setColor("rgb(220,220,220)"); $image->borderImage($color,5,4); $image->blurImage(5,5,imagick::CHANNEL_GREEN); echo$image; ?>
charcoalImage(float$radius,float$sigma)图像素描处理
参数说明:
$radius:越小越薄。
$sigma:越大墨越深反之。
例子:
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $color=newImagickPixel(); $color->setColor("rgb(220,220,220)"); $image->borderImage($color,5,4); $image->charcoalImage(0.0001,0.001); //$image->blurImage(5,5,imagick::CHANNEL_GREEN); echo$image; ?>
chopImage(int$width,int$height,int$x,int$y)
参数说明:删除一定范围的图像区域
就不做参数说明,一看便知.
colorizeImage(mixed$colorize,mixed$opacity)混合填充颜色
$colorize颜色
$opacit透明度
例子:
<?php /* 胶卷底片效果 */ ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $image->negateImage(false); $image->colorizeImage('#000',1.0); echo$image; ?>
embossImage(float$radius,float$sigma)
功能:返回一个灰度级3D图像不太好。
例子:
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $image->embossImage(1,1); echo$image; ?>
(两张效果图)
flipImage(void)
功能:创建图像倒影(垂直翻转)
例子:
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $image->flipImage(); echo$image; ?>
flopImage(void)
功能:图像水平横向翻转
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $image->flopImage(); echo$image; ?>
frameImage(mixed$matte_color,int$width,int$height,int$inner_bevel,int$outer_bevel)
功能:创建3D图像边框
参数说明:
$matte_color:颜色
$inner_bevel:边框内部倾斜度
$outer_bevel:外部边框倾斜度
例子:
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $color=newImagickPixel(); $color->setColor("rgb(220,220,220)"); $image->frameImage($color,11,11,1,10); echo$image; ?>
注意事项:
$width(宽度)不能小于$inner_bevel(边框内部倾斜度)
Imagick::gammaImage(float$gamma[,int$channel=Imagick::CHANNEL_ALL])
功能:调整图像灰度系数
参数说明:
float$gamma:灰度系数值
$channel默认为Imagick::CHANNEL_ALL
Imagick::CHANNEL_ALL
例子1:
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $image->gammaImage(30); echo$image; ?>
例子2:
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $image->gammaImage(30); echo$image; ?>
gaussianBlurImage(float$radius,float$sigma[,int$channel=Imagick::CHANNEL_ALL])
功能:高斯模糊处理类似于photo的高斯模糊
参数说明:
float$radius:高斯模糊的半径,像素,不包括中心象素。
float$sigma:高斯的标准偏差,以像素为单位。我觉得这个参数最重要。
int$channel:图像颜色模式。
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $image->gaussianBlurImage(30,3); echo$image; ?>
levelImage(float$blackPoint,float$gamma,float$whitePoint[,int$channel=Imagick::CHANNEL_ALL])
功能:调整图像的色阶(Adjuststhelevelsofanimage)
参数说明
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $image->levelImage(4,4,4); echo$image; ?>
例子2:
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $image->levelImage(200,200,200,imagick::CHANNEL_GREEN); echo$image; ?>
magnifyImage(void)
功能说明:简便的图像等比例放大2倍(Isaconveniencemethodthatscalesanimageproportionallytotwiceitsoriginalsize.)
例子:
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $image->magnifyImage(); echo$image; ?>
medianFilterImage(float$radius)
功能:特是的滤镜有点像photoshop调色刀滤镜
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $color=newImagickPixel(); $color->setColor("rgb(220,220,220)"); $image->medianFilterImage(5); echo$image; ?>
minifyImage(void)
功能:图小缩小一倍(Scalesanimageproportionallytohalfitssize)
例子:
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $image->minifyImage(); echo$image; ?>
modulateImage(float$brightness,float$saturation,float$hue)
功能:控制调整图像的亮度、饱和度、色调。
参数说明:
float$brightness:亮度
float$saturation:饱和度
float$hue色调
例子1:
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $image->modulateImage(100,1,100); echo$image; ?>
例子2:
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $image->modulateImage(250,1,250); echo$image; ?>
motionBlurImagemotionBlurImage(float$radius,float$sigma,float$angle[,int$channel=Imagick::CHANNEL_DEFAULT])
功能:模拟运动模糊(Simulatesmotionblur),类似photoshop的动感模糊滤镜功能
参数说明:
float$radius:高斯半径,不包过中心像素。
float$sigma:标准偏差的高斯,以像素为单位。【重要参数】
float$angle:模糊角度。
int$channel:图像颜色模式。默认为Imagick::CHANNEL_DEFAULT
例子1:
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $color=newImagickPixel(); $color->setColor("rgb(220,220,220)"); $image->motionBlurImage(61,10,10); echo$image; ?>
例子2:
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $color=newImagickPixel(); $color->setColor("rgb(220,220,220)"); $image->motionBlurImage(201,10,100); echo$image; ?>
oilPaintImage(float$radius):
功能说明:模拟油画滤镜(Simulatesanoilpainting)
例子:
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $color=newImagickPixel(); $color->setColor("rgb(220,220,220)"); $image->oilPaintImage(1); echo$image; ?>
radialBlurImage(float$angle[,int$channel=Imagick::CHANNEL_ALL])
功能:径向模糊(Radialblursanimage)
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $color=newImagickPixel(); $color->setColor("rgb(220,220,220)"); $image->radialBlurImage(30); echo$image; ?>
raiseImage(int$width,int$height,int$x,int$y,bool$raise)
功能说明:创建3D图像按钮(Createsasimulated3dbutton-likeeffect)
<?php ini_set('display_errors',1); header('Content-type:image/jpeg'); $image=newImagick('1.jpg'); $color=newImagickPixel(); $color->setColor("rgb(220,220,220)"); $image->raiseImage(10,10,3,5,6); echo$image; ?>
附1:要求缩小图片尺寸、增加半透明边框,读入exif信息,按指定要求显示在图片上
$towidth='500'; $toheight='700';//设置图片调整大小时允许的最大宽度和高度 $sourcefile='./b.jpg';//定义一个图像文件路径 //$image->writeImage('./b.jpg.bak');//可以备份这个图片 $myimage=newImagick($sourcefile);//读入该图像文件 $exifobject=my_exif($myimage);//自写函数,读取exif信息(拍摄数据),按自己的要求排列exif信息,返回对象 //$myimage->setImageFormat('jpeg');//把图片转为jpg格式 $myimage->setCompressionQuality(100);//设置jpg压缩质量,1-100 $myimage->enhanceImage();//去噪点 $sourcewidth=$myimage->getImageWidth();//获取读入图像原始大小 if($sourcewidth>$towidth) { $myimage->scaleImage($towidth,$toheight,true);//调整图片大小 } $myimage->raiseImage(8,8,0,0,1);//加半透明边框 $resizewidth=$myimage->getImageWidth();//读出调整之后的图片大小 $resizeheight=$myimage->getImageHeight(); $drawback=newImagickDraw();//实例化一个绘画对象,绘制半透明黑色背景给exif信息用 $drawback->setFillColor(newImagickPixel('#000000'));//设置填充颜色为黑色 $drawback->setFillOpacity(0.6);//填充透明度为0.6,参数0.1-1,1为不透明 $drawback->rectangle($resizewidth/2-190,$resizeheight-50,$resizewidth/2+190,$resizeheight-12);//绘制矩形参数,分别为左上角x、y,右下角x、y $myimage->drawImage($drawback);//确认到image中绘制该矩形框 $draw=newImagickDraw();//实例化一个绘画对象,绘制exif文本信息嵌入图片中 $draw->setFont('./xianhei.ttf');//设置文本字体,要求ttf或者ttc字体,可以绝对或者相对路径 $draw->setFontSize(11);//设置字号 $draw->setTextAlignment(2);//文字对齐方式,2为居中 $draw->setFillColor('#FFFFFF');//文字填充颜色 $myimage->annotateImage($draw,$resizewidth/2,$resizeheight-39,0,$exifobject->row1);//绘制第一行文本,居中 $myimage->annotateImage($draw,$resizewidth/2,$resizeheight-27,0,$exifobject->row2);//绘制第二行文本,居中 $myimage->annotateImage($draw,$resizewidth/2,$resizeheight-15,0,$exifobject->row3);//绘制第三行文本,居中 /*Outputtheimagewithheaders*/ header('Content-type:image/jpeg');//php文件输出mime类型为jpeg图片 echo$myimage;//在当前php页面输出图片 //$image->writeImage('./b.new.jpg');//如果图片不需要在当前php程序中输出,使用写入图片到磁盘函数,上面的设置header也可以去除 $myimage->clear(); $myimage->destroy();//释放资源 //自写函数,读取exif信息,返回对象 functionmy_exif($myimage) { $exifArray=array('exif:Model'=>'未知','exif:DateTimeOriginal'=>'未知','exif:ExposureProgram'=>'未知','exif:FNumber'=>'0/10','exif:ExposureTime'=>'0/10','exif:ISOSpeedRatings'=>'未知', 'exif:MeteringMode'=>'未知','exif:Flash'=>'关闭闪光灯','exif:FocalLength'=>'未知','exif:ExifImageWidth'=>'未知','exif:ExifImageLength'=>'未知');//初始化部分信息,防止无法读取照片exif信息时运算发生错误 $exifArray=$myimage->getImageProperties("exif:*");//读取图片的exif信息,存入$exifArray数组 //如果需要显示原数组可以使用print_r($exifArray); $r->row1='相机:'.$exifArray['exif:Model']; $r->row1=$r->row1.'拍摄时间:'.$exifArray['exif:DateTimeOriginal']; switch($exifArray['exif:ExposureProgram']) { case1: $exifArray['exif:ExposureProgram']="手动(M)"; break;//ManualControl case2: $exifArray['exif:ExposureProgram']="程序自动(P)"; break;//ProgramNormal case3: $exifArray['exif:ExposureProgram']="光圈优先(A,Av)"; break;//AperturePriority case4: $exifArray['exif:ExposureProgram']="快门优先(S,Tv)"; break;//ShutterPriority case5: $exifArray['exif:ExposureProgram']="慢速快门"; break;//ProgramCreative(SlowProgram) case6: $exifArray['exif:ExposureProgram']="运动模式"; break;//ProgramAction(High-SpeedProgram) case7: $exifArray['exif:ExposureProgram']="人像"; break;//Portrait case8: $exifArray['exif:ExposureProgram']="风景"; break;//Landscape default: $exifArray['exif:ExposureProgram']="其它"; } $r->row1=$r->row1.'模式:'.$exifArray['exif:ExposureProgram']; $exifArray['exif:FNumber']=explode('/',$exifArray['exif:FNumber']); $exifArray['exif:FNumber']=$exifArray['exif:FNumber'][0]/$exifArray['exif:FNumber'][1]; $r->row2='光圈:F/'.$exifArray['exif:FNumber']; $exifArray['exif:ExposureTime']=explode('/',$exifArray['exif:ExposureTime']); if(($exifArray['exif:ExposureTime'][0]/$exifArray['exif:ExposureTime'][1])>=1) { $exifArray['exif:ExposureTime']=sprintf("%.1fs",(float)$exifArray['exif:ExposureTime'][0]/$exifArray['exif:ExposureTime'][1]); }else { $exifArray['exif:ExposureTime']=sprintf("1/%ds",$exifArray['exif:ExposureTime'][1]/$exifArray['exif:ExposureTime'][0]); } $r->row2=$r->row2.'快门:'.$exifArray['exif:ExposureTime']; $r->row2=$r->row2.'ISO:'.$exifArray['exif:ISOSpeedRatings']; $exifArray['exif:ExposureBiasValue']=explode("/",$exifArray['exif:ExposureBiasValue']); $exifArray['exif:ExposureBiasValue']=sprintf("%1.1feV",((float)$exifArray['exif:ExposureBiasValue'][0]/$exifArray['exif:ExposureBiasValue'][1]*100)/100); if((float)$exifArray['exif:ExposureBiasValue']>0) { $exifArray['exif:ExposureBiasValue']="+".$exifArray['exif:ExposureBiasValue']; } $r->row2=$r->row2.'补偿:'.$exifArray['exif:ExposureBiasValue']; switch($exifArray['exif:MeteringMode']) { case0: $exifArray['exif:MeteringMode']="未知"; break; case1: $exifArray['exif:MeteringMode']="矩阵"; break; case2: $exifArray['exif:MeteringMode']="中央重点平均"; break; case3: $exifArray['exif:MeteringMode']="点测光"; break; case4: $exifArray['exif:MeteringMode']="多点测光"; break; default: $exifArray['exif:MeteringMode']="其它"; } $r->row2=$r->row2.'测光:'.$exifArray['exif:MeteringMode']; switch($exifArray['exif:Flash']) { case1: $exifArray['exif:Flash']="开启闪光灯"; break; } $r->row2=$r->row2.''.$exifArray['exif:Flash']; if($exifArray['exif:FocalLengthIn35mmFilm']) { $r->row3='等效焦距:'.$exifArray['exif:FocalLengthIn35mmFilm']."mm"; }else { $exifArray['exif:FocalLength']=explode("/",$exifArray['exif:FocalLength']); $exifArray['exif:FocalLength']=sprintf("%4.1fmm",(double)$exifArray['exif:FocalLength'][0]/$exifArray['exif:FocalLength'][1]); $r->row3='焦距:'.$exifArray['exif:FocalLength']; } $r->row3=$r->row3.'原始像素:'.$exifArray['exif:ExifImageWidth'].'x'.$exifArray['exif:ExifImageLength'].'px'; if($exifArray['exif:Software']) { $r->row3=$r->row3.'后期:'.$exifArray['exif:Software']; } return$r; }
附2:处理图片水印
<?php //获取水印图片 $logo=newImagick("logo.png"); $logo->setImageResolution(0.01,0.03); //创建一个Imagick对象,同时获取要处理的源图 $im=newImagick("old_large_img_2.jpg"); //获取源图片宽和高 $srcWH=$im->getImageGeometry(); //图片等比例缩放宽和高设置 if($srcWH['width']>710){ $srcW['width']=710; $srcH['height']=$srcW['width']/$srcWH['width']*$srcWH['height']; }else{ $srcW['width']=$srcWH['width']; $srcH['height']=$srcWH['height']; } //按照比例进行缩放 $im->thumbnailImage($srcW['width'],$srcH['height'],true); //按照缩略图大小创建一个有颜色的图片 $canvas=newImagick(); $canvas->newImage($srcW['width'],$srcH['height'],'black','jpg');//pink,black //添加水印 $im->compositeImage($logo,Imagick::COMPOSITE_OVER,$srcW['width']-280,$srcH['height']-77); $canvas->setcompressionquality(91); //合并图片 $canvas->compositeImage($im,imagick::COMPOSITE_OVER,0,0); //输出图片 header("Content-Type:image/jpg"); echo$canvas; //生成图片 $canvas->writeImage("test_img/old_large_img_2_96.jpg"); ?>