Grafika是一个基于Imagick和GD的PHP图像处理库,可以用来改变图片大小、裁剪、比较、添加水印等。还有感知哈希、高级图像过滤、绘制贝塞尔曲线等功能,可谓非常强大。由于功能太多,分几篇。《1、图像基本处理》《2、图像特效处理模块》《3、图像属性处理》《4、图形绘制》优点:缩略图速度非常快,质量非常高,支持智能裁剪,而且它支持GIF图片5缩略图模式、图像对比功能、图像高级过滤功能、图像混合等图像处理库。支持的API基本支持安装下载1.直接下载:Grafika官网,Github地址2,composer:composerrequirekosinix/grafika:dev-master--prefer-dist环境要求PHP>=5.3,当然是官方推荐的php7GDlibrary>=2.0versionImagick***(非强制)>=3.3.0,ImageMagick>=6.5.3deploymentdownloadGrafika目录基本结构如下:不过composer下载的多一点,你只需要使用kosinix/grafika目录中的东西。我们在grafika目录下新建一个index.php,后续的所有操作都在这里。Grafika为我们提供了一个非常有用的autoloader.php,位于src目录中。在index.php中引入,(说明下,下面的例子都需要导入这个autoloader.php文件,我们默认省略),下面直接开发即可。require_once'src/autoloader.php';创建Editors1,createEditorgrafika通过静态方法createEditor创建一个编辑器。它包含所有图像处理方法。由于grafika基于Imagick和GD库,使用createEditor方法会根据当前情况自动选择需要的图像处理库。(推荐)useGrafika\Grafika;//Importpackage$editor=Grafika::createEditor();//创建最好的可用编辑器2、ImagickEditor当然也可以直接使用Imagick类库。useGrafika\Imagick\Editor;//Importpackage$editor=newEditor();//Imagickeditor注意:在某些情况下可能不支持该类库,需要使用如下语句查看使用,(但可以直接使用方法1,没有这些)useGrafika\Imagick\Editor;//Importpackage$editor=newEditor();//Imagickeditorif($editor->isAvailable()){//Safetycheck//Yourcodehere}3.你也可以直接使用GDEditor某些情况下可能不支持GD库,记得勾选useGrafika\Gd\Editor;//Importpackage$editor=newEditor();//Gdeditorif($editor->isAvailable()){//Safetycheck//Yourcodehere}创建图片Grafika允许使用4种方式创建待处理图片1.直接打开图片创建编辑器+打开方法useGrafika\Grafika;$editor=Grafika::createEditor();$editor->open($image,'path/to/image.jpg');2.使用静态方法打开图片使用直接打开创建图片useGrafika\Grafika;$image=Grafika::createImage('path/to/image.jpg');//此处省略$editor=Grafika::createEditor();3.创建一个空白画布,并创建一个新画布作为新图像useGrafika\Grafika;$image=Grafika::createBlankImage(100,100);4。从现有图像复制图像作为图像处理$copy=clone$image;这种方法需要保证之前有图片。这些方法之后的操作都是类似的。我们仅选择第一种常规方法作为示例图片的缩略图进行说明。我们先准备一张原图接下来,假设我们要创建的缩略图是长的:200px宽,200px1,ResizeFit等缩放类型。然后保证图片较长的边不超过200px,按比例缩放,缩放后不填满背景。useGrafika\Grafika;$editor=Grafika::createEditor();$editor->open($image1,'yanying.jpg');//打开yanying.jpg存入$image1$editor->resizeFit($image1,200,200);$editor->save($image1,'yanying1.jpg');$editor->open($image2,'yanying-h.jpg');//打开yanying.jpg并保存到$image2$editor->resizeFit($image2,200,200);$editor->save($image2,'yanying2.jpg');当然,别忘了***行的require缩放的类型。即不考虑图片的宽高比,全部缩小到200px,可能会导致图片变形。useGrafika\Grafika;$editor=Grafika::createEditor();$editor->open($image1,'yanying.jpg');//打开yanying.jpg存入$image1$editor->resizeExact($image1,200,200);$editor->save($image1,'yanying1.jpg');$editor->open($image2,'yanying-h.jpg');//打开yanying.jpg并保存到$image2$editor->resizeExact($image2,200,200);$editor->save($image2,'yanying2.jpg');3、ResizeFill中心切割。就是将较短的变量缩放到200px,然后把长边大于200px的部分在中心切掉,这样图片就不会变形了。4、ResizeExactWidth等宽度缩放。与第一个函数类似,最终宽度为200px,按比例缩放,与高度无关。useGrafika\Grafika;$editor=Grafika::createEditor();$editor->open($image1,'yanying.jpg');//打开yanying.jpg存入$image1$editor->resizeExactWidth($image1,200);$editor->save($image1,'yanying1.jpg');$editor->open($image2,'yanying-h.jpg');//打开yanying.jpg并保存到$image2$editor->resizeExactWidth($image2,200);$editor->save($image2,'yanying2.jpg');5、ResizeExactHeight等高缩放。最终高度为200px,按比例缩放,与图像宽度无关。图片对比功能1.图片相似度对比我们首先准备一张基础图片,用于与其他图片进行对比。(segmentfault网页上的图片可能经过处理,直接用本文图片可能结果不一致)1)、我们第一次使用灰度图进行对比useGrafika\Grafika;$editor=Grafika::createEditor();$result=$editor->compare('yanying.jpg','yanying_grey.jpg');var_dump($result);//int2描述:Grafika图像比较方法compare返回一个数字,如果数字越接近0,则图片越相似。如果数字在0-10范围内,则这些图片很可能都是相似的。但如果这个数字大于10,那么,也许它完全是另外一回事。这里返回了2,说明相似度还是很高的。2)我们再用一张缩小图来测试,记得和第一张基本图对比一下。使用Grafika\Grafika;$editor=Grafika::createEditor();$result=$editor->compare('yanying.jpg','yanying-smaller.jpg');var_dump($result);//这里int0的result返回0,相似度很高。3)我们用裁剪后的局部图来测试useGrafika\Grafika;$editor=Grafika::createEditor();$result=$editor->compare('yanying.jpg','yanying-half.jpg');var_dump($result);//int20的结果是10多条,相似度不是很高4),我们用完全不同的图片来测试useGrafika\Grafika;$editor=Grafika::createEditor();$result=$editor->compare('yanying.jpg','yanying-h.jpg');var_dump($result);//int39结果39,越来越大不像2,比较是否图片是否相同Grafika提供了equal方法来检查两张图片是否完全相同。这里的检查是逐像素检测,所以时间可能会长一些。当然grafika也会进行预检,如果两张图片大小不一样,会直接返回false。只有在其他一切都相同的情况下才会进行逐像素检查。这里对比之前创建的一个缩略图,因为大小不一致,所以直接返回falseuseGrafika\Grafika;$editor=Grafika::createEditor();$result=$editor->equal('yanying.jpg','yanying-smaller.jpg');var_dump($result);//booleanfalsesmartcropping智能裁剪是自动识别图像的重要部分,裁剪时倾向于保留关键部分。不过grafika也提供人工操作位置裁剪,先说这个。基本位置裁剪基本位置裁剪包括9个位置top-lefttop-centertop-rightcenter-leftcentercenter-rightbottom-leftbottom-centerbottom-right我们这里一起讲了,这里用一张900*600的图片,分成9块useGrafika\Grafika;$editor=Grafika::createEditor();$src='yanying.jpg';$editor->open($image,$src);$editor->crop($image,300,200,'top-left');$editor->save($image,'result1.jpg');$editor->free($image);$editor->open($image,$src);$editor->crop($image,300,200,'top-center');$editor->save($image,'result2.jpg');$editor->free($image);$editor->open($image,$src);$editor->crop($image,300,200,'top-right');$editor->save($image,'result3.jpg');$editor->free($image);$editor->open($image,$src);$editor->crop($image,300,200,'center-left');$editor->save($image,'result4.jpg');$editor->free($image);$editor->open($image,$src);$editor->crop($image,300,200,'center');$editor->save($image,'result5.jpg');$editor->free($图片);$editor->open($image,$src);$编辑器->裁剪($image,300,200,'center-right');$editor->save($image,'result6.jpg');$editor->free($image);$editor->open($image,$src);$editor->crop($image,300,200,'bottom-left');$editor->save($image,'result7.jpg');$editor->free($image);$editor->open($image,$src);$editor->crop($image,300,200,'bottom-center');$editor->保存($image,'result8.jpg');$editor->free($image);$editor->open($image,$src);$editor->crop($image,300,200,'bottom-right');$editor->save($image,'result9.jpg');$editor->free($image);看效果智能裁剪原图我们使用智能裁剪将图片裁剪成200*200pxuseGrafika\Grafika;$editor=Grafika::createEditor();$editor->open($image,'yanying-smaller.jpg');$editor->crop($image,200,200,'smart');$editor->save($image,'yanying-smart.jpg');找到可以突出重点的GIF缩略图CompressGIFwithoutlosinganimationGrafika可以直接压缩GIF图片而不丢失动画功能useGrafika\Grafika;$editor=Grafika::createEditor();$editor->open($image,'sample.gif');$editor->resizeFit($image,250,128);$editor->保存($image,'output.gif');这里我们将原图压缩到原来的一半大小,发现动画并没有丢失。去除GIF动画效果当然,如果需要,我们也可以直接去除GIF动画效果useGrafika\Grafika;$editor=Grafika::createEditor();$editor->open($image,'sample.gif');$editor->flatten($image);$editor->save($image,'output-no-animation.gif');图片合并图片合并需要2张图片,其中一张作为基础图片,将准备好的第二章图片放在基础图片上。我们先看代码useGrafika\Grafika;$editor=Grafika::createEditor();$editor->open($image1,'yanying-h.jpg');$editor->open($image2,'yanying-smaller.jpg');$editor->blend($image1,$image2,'normal',0.9,'center');$editor->save($image1,'333/yanying-blend.jpg');说明首先打开两张图片,其中$image1为基础图片,放在下面。重点是混合方法。其中:第一个参数为基础图片,第二个参数为放置在基础图片之上的图片normal、multiply、overlay或screen。这里的类型是指图片叠加的方式。下面将举例说明,看看各自的区别。第三个参数是透明度,不用多说也很容易想到。第四个是location,有10个选项,其中前9个是自定义访问位置,最后一个是smartvisiting,grafika可以判断放在哪里。top-left,top-center,top-right,center-left,center,center-right,bottom-left,bottom-center,bottom-rightandsmart第五个参数可选,表示图片2离图片1远左边第6个参数distance也是可选参数,表示图片2距离图片1顶部的距离,我们试放几种情况。1.normal:center的位置信息,透明度0.9,就是上面那种代码2,multiply:的位置信息,top-left,其他不变3,overlay的位置信息:bottom-right,其他保持不变4,屏幕位置信息:,***没有给出位置参数,默认为top-leftImagerotationImagerotationis比较简单,只需要给一个旋转角度参数就可以了,如果要给背景填充颜色,给一个颜色参数就可以了。(背景颜色默认不是黑色)代码如下useGrafika\Grafika;useGrafika\Color;$editor=Grafika::createEditor();$editor->open($image,'yanying-smaller.jpg');$editor->rotate($image,'45',newColor('#ff0000'));$editor->save($image,'333/yanying-rotate.jpg');***一个背景色参数还需要一个Color对象在图片上写文字图片上写文字的参数有很多,但是如果正常使用的话,只需要前两个,后面的参数是可选的.下面我们一一看下每个参数image:要写入的文字的图片text:要写入的文字size:(可选)字体大小,默认为12pxx:(可选)距文字最左边的距离tothemostsideofthepicture,default0y:(optional)文字基线到图片顶部的距离,默认为12px,也就是文字的高度。(Baseline可以看作是文本的底部)color:(可选)字体颜色,Color对象,需要一个新的颜色,默认是黑色。font:(可选)字体的完整路径,默认为Sansfont.angle:(可选)文字旋转角度,取值范围0-359,默认为0,即不旋转,随便找文本并尝试useGrafika\Grafika;useGrafika\Color;$editor=Grafika::createEditor();$editor->open($image,'yanying-smaller.jpg');$editor->text($image,'yanying',30,200,100,newolor("#000000"),'',45);$editor->save($image,'333/yanying-text.jpg');看看效果。这里解释一下,如果文字是中文,需要找一个支持中文的字体。默认字体不支持中文,所以写中文的时候都是小方框。
