基于ImageMagick的php图片处理库Grafika介绍

Grafika是一个PHP图像处理库,是基于Imagick和GD,可以用于改变图片大小,剪裁,比较,添加水印等等功能。还有感知哈希,高级图像过滤,绘制贝塞尔曲线等功能,可谓非常强大。

《1、图像基本处理》
《2、图像特效处理模块》
《3、图像属性处理》
《4、图形绘制》

一、图像基本处理

优点:

  • 缩略图的速度非常快,质量非常高

  • 支持智能剪裁

  • 很好的支持GIF图片

  • 5种缩略图模式

  • 图像对比功能

  • 图像高级过滤功能

  • 图像混合

  • 其他图像处理库支持的API基本都支持

安装

下载

1、直接下载:

Grafika的官网 、 Github地址

2、composer

composer require kosinix/grafika:dev-master --prefer-dist

环境需求

  • PHP >= 5.3,当然官方推荐php7

  • GD库 >= 2.0版本

  • Imagick最好(不强求)>=3.3.0 , ImageMagick >= 6.5.3

部署

下载下来的Grafika目录基本结构像下面这样:

不过composer下载下来的多一点儿,你只需要使用kosinix/grafika目录下的东西就好了。

我们在grafika目录下建立一个index.php,之后的操作都在这里。

grafika给我们提供了一个非常好用的autoloader.php位于src目录下。

index.php中引入它,(说明下,以下示例都需要引入这个autoloader.php文件,我们默认省略),下面就可以直接开发了。

require_once 'src/autoloader.php';

创建Editors

1、createEditor

grafika通过静态方法createEditor来创建一个editor。它包含所有的图片处理方法。

由于,grafika是基于ImagickGD库,所以使用createEditor方法会根据当前情况,自动选择所需要的图片处理库。(推荐使用)

 
  1. use Grafika\Grafika; // Import package

  2. $editor = Grafika::createEditor(); // Create the best available editor

2、Imagick Editor

当然你也可以直接使用Imagick类库。

 
  1. use Grafika\Imagick\Editor; // Import package

  2. $editor = new Editor(); // Imagick editor

注意:有些情况可能不支持该类库,你需要使用下面语句检查后使用,(不过你最好直接使用方法1,就没这些事)

 
  1. use Grafika\Imagick\Editor; // Import package

  2. $editor = new Editor(); // Imagick editor

  3. if( $editor->isAvailable() ) { // Safety check

  4. // Your code here

  5. }

3、GD Editor

你也可以直接使用GD库,也有些情况可能不支持,记得检查

 
  1. use Grafika\Gd\Editor; // Import package

  2. $editor = new Editor(); // Gd editor

  3. if( $editor->isAvailable() ) { // Safety check

  4. // Your code here

  5. }

创建图像

grafika允许你使用4种方式创建一个待处理的图像

1、直接打开图像

创建editor + open方法

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'path/to/image.jpg');

2、使用静态方法打开图片

使用直接打开、创建图片

 
  1. use Grafika\Grafika;

  2. $image = Grafika::createImage('path/to/image.jpg');

  3. // 这里省略了$editor = Grafika::createEditor();

3、创建一个空白的画布

新建一个画布作为新图像

 
  1. use Grafika\Grafika;

  2. $image = Grafika::createBlankImage(100,100);

4、从已有图片拷贝一个

拷贝一个图像作为图像处理

$copy = clone $image;

这种方法你要保证之前有一张图片

这几种方法之后的操作大同小异,我们只选择第一种常规方法作为讲解示例

图片缩略图

我们先准备一个原图

接下来,假设我们要创建的缩略图长:200px宽200px

1、Resize Fit

等比例缩放类型。那么就保证图片较长的一边不超过200px,等比缩放,缩放后不填充背景

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open($image1 , 'yanying.jpg'); // 打开yanying.jpg并且存放到$image1

  4. $editor->resizeFit($image1 , 200 , 200);

  5. $editor->save($image1 , 'yanying1.jpg');

  6. $editor->open($image2 , 'yanying-h.jpg'); // 打开yanying.jpg并且存放到$image2

  7. $editor->resizeFit($image2 , 200 , 200);

  8. $editor->save($image2 , 'yanying2.jpg');

当然不要忘了第一行的require

       

2、Resize Exact

固定尺寸缩放类型。就是不管图片长宽比,全部缩小到200px,可能导致图片变形。

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open($image1 , 'yanying.jpg'); // 打开yanying.jpg并且存放到$image1

  4. $editor->resizeExact($image1 , 200 , 200);

  5. $editor->save($image1 , 'yanying1.jpg');

  6. $editor->open($image2 , 'yanying-h.jpg'); // 打开yanying.jpg并且存放到$image2

  7. $editor->resizeExact($image2 , 200 , 200);

  8. $editor->save($image2 , 'yanying2.jpg');

      

3、Resize Fill

居中剪裁。就是把较短的变缩放到200px,然后将长边的大于200px的部分居中剪裁掉,图片不会变形。

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open($image1 , 'yanying.jpg'); // 打开yanying.jpg并且存放到$image1

  4. $editor->resizeFill($image1 , 200,200);

  5. $editor->save($image1 , 'yanying1.jpg');

  6. $editor->open($image2 , 'yanying-h.jpg'); // 打开yanying.jpg并且存放到$image2

  7. $editor->resizeFill($image2 , 200,200);

  8. $editor->save($image2 , 'yanying2.jpg');

     

4、Resize Exact Width

等宽缩放。和第一种功能相似,最终宽为200px,等比缩放,高度不管。

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open($image1 , 'yanying.jpg'); // 打开yanying.jpg并且存放到$image1

  4. $editor->resizeExactWidth($image1 , 200);

  5. $editor->save($image1 , 'yanying1.jpg');

  6. $editor->open($image2 , 'yanying-h.jpg'); // 打开yanying.jpg并且存放到$image2

  7. $editor->resizeExactWidth($image2 , 200);

  8. $editor->save($image2 , 'yanying2.jpg');

       

5、Resize Exact Height

等高缩放。最终高为200px,等比缩放,不考虑图片宽度。

     

图像对比功能

1、图片相似度对比

我们首先准备一张基本图,用来和其他图片对比。(segmentfault网页图片可能处理过,直接使用本文图片可能结果不一致)

1、我们第一次使用一张灰度图片来比较

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $result = $editor->compare('yanying.jpg' , 'yanying_grey.jpg');

  4. var_dump($result); // int 2

说明: grafika图片对比方法compare返回一个数字,其中如果数字越接近于0,那么表示图片越相似。如果数字在0-10范围内,那么图片都可能相似。但是如果数字大于10,那么,可能就完全不同。

这里返回2,说明相似度还是非常高的。

2、我们再用一张缩小的图片来测试,记住都是和第一张基本图比较。

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $result = $editor->compare('yanying.jpg' , 'yanying-smaller.jpg');

  4. var_dump($result); // int 0

这里结果返回0,相似度非常高。

3、我们再用一张剪裁下来的局部图片测试

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $result = $editor->compare('yanying.jpg' , 'yanying-half.jpg');

  4. var_dump($result); // int 20

结果超过10了,相似度不怎么高

4、我们再用一张完全不同的图片测试

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $result = $editor->compare('yanying.jpg' , 'yanying-h.jpg');

  4. var_dump($result); // int 39

结果39,越来越大,越来越不像

2、比较图片是否相同

grafika提供方法equal来检查两张图片是否完全相同。这里的检查是一个像素一个像素的检测,所以时间可能会较长。

当然grafika也会预检查,如果两张图片大小不相同,则直接返回false。只有其他都相同后才会进行逐像素检查。

我们这里对比之前创建的一张缩略图,因为大小不一致,所以直接返回false

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $result = $editor->equal('yanying.jpg' , 'yanying-smaller.jpg');

  4. var_dump($result); // boolean false

智能剪裁

智能剪裁是自动识别图像中的重要部分,剪裁时候偏向于保留重点部分。

不过grafika也提供了人为操控位置剪裁,我们先说这个。

基本位置剪裁

基本位置剪裁包含9个位置

  • top-left

  • top-center

  • top-right

  • center-left

  • center

  • center-right

  • bottom-left

  • bottom-center

  • bottom-right

我们这里一起说了,这里我们使用900*600的图片,分成9块

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $src = 'yanying.jpg';

  4. $editor->open( $image, $src );

  5. $editor->crop( $image, 300, 200, 'top-left' );

  6. $editor->save( $image, 'result1.jpg' );

  7. $editor->free( $image );

  8. $editor->open( $image, $src );

  9. $editor->crop( $image, 300, 200, 'top-center' );

  10. $editor->save( $image, 'result2.jpg' );

  11. $editor->free( $image );

  12. $editor->open( $image, $src );

  13. $editor->crop( $image, 300, 200, 'top-right' );

  14. $editor->save( $image, 'result3.jpg' );

  15. $editor->free( $image );

  16. $editor->open( $image, $src );

  17. $editor->crop( $image, 300, 200, 'center-left' );

  18. $editor->save( $image, 'result4.jpg' );

  19. $editor->free( $image );

  20. $editor->open( $image, $src );

  21. $editor->crop( $image, 300, 200, 'center' );

  22. $editor->save( $image, 'result5.jpg' );

  23. $editor->free( $image );

  24. $editor->open( $image, $src );

  25. $editor->crop( $image, 300, 200, 'center-right' );

  26. $editor->save( $image, 'result6.jpg' );

  27. $editor->free( $image );

  28. $editor->open( $image, $src );

  29. $editor->crop( $image, 300, 200, 'bottom-left' );

  30. $editor->save( $image, 'result7.jpg' );

  31. $editor->free( $image );

  32. $editor->open( $image, $src );

  33. $editor->crop( $image, 300, 200, 'bottom-center' );

  34. $editor->save( $image, 'result8.jpg' );

  35. $editor->free( $image );

  36. $editor->open( $image, $src );

  37. $editor->crop( $image, 300, 200, 'bottom-right' );

  38. $editor->save( $image, 'result9.jpg' );

  39. $editor->free( $image );

看下结果

智能剪裁

原图

我们使用智能剪裁将图片剪裁至200*200px

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'yanying-smaller.jpg' );

  4. $editor->crop( $image, 200, 200, 'smart' );

  5. $editor->save( $image, 'yanying-smart.jpg' );

发现还是可以突出重点的

GIF缩略图

压缩GIF,不丢失动画

grafika可以直接压缩GIF图片,并且不丢失动画功能。

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'sample.gif' );

  4. $editor->resizeFit( $image, 250, 128 );

  5. $editor->save( $image, 'output.gif' );

我们这里将原图压缩到原来的一半,发现动画并没有丢失

移除GIF动画效果

当然,如果有需要,我们也可以直接移除GIF的动画效果

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'sample.gif' );

  4. $editor->flatten( $image );

  5. $editor->save( $image, 'output-no-animation.gif' );

图片合并

图片合并需要2张图片,将其中一张作为基本图,准备的第二章图片就是放置在基础图片之上。

我们首先来看代码

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open($image1 , 'yanying-h.jpg');

  4. $editor->open($image2 , 'yanying-smaller.jpg');

  5. $editor->blend ( $image1, $image2 , 'normal', 0.9, 'center');

  6. $editor->save($image1,'333/yanying-blend.jpg');

解释一下

首先打开两张图片,其中$image1为基础图片,也就是放在下面的。重点在blend这个方法。

其中

  • 第一个参数为基础图片

  • 第二个参数为放置在基础图片之上的图片normal, multiply, overlay or screen.,这里的类型意思就是图片叠加的模式,下面会给出实例看每种的不同。

  • 第三个参数为透明度,这个不说太多,容易想到。

  • 第四个为位置,有10个选择,其中,前面9种为用户自定义拜访位置,而最后一个是智能拜访,由grafika来判断摆放在哪里好。top-left, top-center, top-right, center-left, center, center-right, bottom-left, bottom-center, bottom-right and smart

  • 第五个参数为可选参数,表示图片2距离图片1左边的距离

  • 第六个参数也为可选参数,表示图片2距离图片1上边的距离

我们试着摆几种情况。

1、normal

其中位置信息:center,透明度为0.9,也就是上面代码的那种

2、multiply

位置信息:,top-left,其他不变

3、overlay

位置信息:bottom-right,其他不变

4、screen

位置信息:,最后一个位置参数不给,也就是默认top-left

图像旋转

图像旋转比较简单,只需要给一个旋转角度参数就可以了,如果想要给背景填充个颜色,再给一个颜色参数即可。(默认不给背景色为黑色)

代码如下

 
  1. use Grafika\Grafika;

  2. use Grafika\Color;

  3. $editor = Grafika::createEditor();

  4. $editor->open($image , 'yanying-smaller.jpg');

  5. $editor->rotate($image ,'45',new Color('#ff0000'));

  6. $editor->save($image,'333/yanying-rotate.jpg');

最后一个背景颜色参数也是需要Color对象

图片写文字

在图片上面写文字的参数比较多,不过如果正常使用,只需要给前两个必填的即可,后面的参数都是可选的。

我们逐一的来看各个参数

  • image:所需要写文字的图片

  • text:需要写的文字

  • size:(选填)字体大小,默认为12px

  • x:(选填)文字的最左边距离图片最左边的距离,默认为0

  • y:(选填)文字的基线到图片的最上边的距离,默认是12px,也就是文字的高度。(基线你就当做文字最下面好了)

  • color:(选填)字体颜色,Color对象,需要new Color一下,默认为黑色。

  • font:(选填)字体的完整路径,默认Sans font.

  • angle:(选填)文字旋转角度,取值范围为0-359,默认为0,也就是不旋转

我们随便找个文字试试

 
  1. use Grafika\Grafika;

  2. use Grafika\Color;

  3. $editor = Grafika::createEditor();

  4. $editor->open($image , 'yanying-smaller.jpg');

  5. $editor->text($image ,'yanying',30,200,100,new Color("#000000"),'',45);

  6. $editor->save($image,'333/yanying-text.jpg');

看下效果。这里说明下,如果文字为中文,需要找一个支持中文的字体。默认字体不支持中文,所以你写中文,就是都是小方框。

图片过滤、滤镜

grafika提供了11种滤镜功能,可以满足开发中的任何情况需求。

这里先介绍一个操作方法:apply:它可以将滤镜效果应用到图片

图片模糊

使用Blur参数,模糊化一张图片

其中模糊度取值范围为0-100,数值越大,图片越模糊

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'yanying-smaller.jpg' );

  4. $filter = Grafika::createFilter('Blur', 50); // 模糊度为10,模糊度取值为0-100

  5. $editor->apply( $image, $filter ); // 将滤镜应用到图片

  6. $editor->save($image,'yanying-blur.jpg');

我们将图片模糊参数调为50

    

图片亮度调整

使用Brightness,加亮或者变暗图片

其中亮度值取值范围为

  • -100 至 -1,变暗

  • 0 图片没有变化

  • 1-100图片变量

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'yanying-smaller.jpg' );

  4. $filter = Grafika::createFilter('Brightness', -50);

  5. $editor->apply( $image, $filter );

  6. $editor->save($image,'333/yanying-Brightness-1.jpg');

改变图片颜色

使用Colorize参数,调整图片的红绿蓝三个基础色来改变图片颜色

颜色参数(红色、绿色、蓝色取值范围相同)

  • 取值-100至-1,颜色减少;

  • 如果为0表示不变;

  • 取值1-100,表示色值增加

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'yanying-smaller.jpg' );

  4. $filter = Grafika::createFilter('Colorize', -50,50,-50);

  5. $editor->apply( $image, $filter );

  6. $editor->save($image,'333/yanying-Colorize.jpg');

    

改变图片对比度

使用Contrast参数可以改变图片的对比度

对比度的取值和之前的也差不多,-100至-1,对比度减少;0不变;1至100,对比度增加

具体什么叫对比度,自行百度,我也不是太清楚,毕竟不是搞设计的

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'yanying-smaller.jpg' );

  4. $filter = Grafika::createFilter('Contrast', 50);

  5. $editor->apply( $image, $filter );

  6. $editor->save($image,'333/yanying-Contrast.jpg');

    

图像噪点

使用Dither来给图像添加噪点,其参数取值只有两个diffusion:扩散;ordered:规整的

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'yanying-smaller.jpg' );

  4. $filter = Grafika::createFilter('Dither', 'diffusion');

  5. $editor->apply( $image, $filter );

  6. $editor->save($image,'333/yanying-Dither-diffusion.jpg');

    

图像色阶调整

Gamma这个参数在平时是不常用的,只有在专业的图像领域才会使用。可以理解为色阶,是灰阶亮度值与灰阶等级之间的数学关系。

这里的Gamma功能是校正图像色阶,使得图像看起来颜色更加正确

这里的数字值取值范围只有最小值没有最大值只要 >=1.0都可以

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'yanying-smaller.jpg' );

  4. $filter = Grafika::createFilter('Gamma', 2.0);

  5. $editor->apply( $image, $filter );

  6. $editor->save($image,'333/yanying-Gamma.jpg');

    

图片灰度

使用Grayscale使图片所有的色彩丢弃,只保留黑白两种颜色,没有取值。

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'yanying-smaller.jpg' );

  4. $filter = Grafika::createFilter('Grayscale');

  5. $editor->apply( $image, $filter );

  6. $editor->save($image,'333/yanying-Grayscale.jpg');

    

图像反色处理

图像反色,也就是弄得和胶片似得。

使用Invert参数可以达到图像反色效果,也没有可选值

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'yanying-smaller.jpg' );

  4. $filter = Grafika::createFilter('Invert');

  5. $editor->apply( $image, $filter );

  6. $editor->save($image,'333/yanying-Invert.jpg');

    

图片像素化、栅格化

就是把矢量图形转换成像素点组成的点阵图形,也叫栅格化。搞ps的应该都清楚

该参数有个取值范围只要大于或者等于1就可以,如果值越大,像素点也就越大

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'yanying-smaller.jpg' );

  4. $filter = Grafika::createFilter('Pixelate',10);

  5. $editor->apply( $image, $filter );

  6. $editor->save($image,'333/yanying-Pixelate-10.jpg');

我们取值5和取值10对比下

图片锐化

图片锐化就是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰。

使用参数Sharpen可以处理锐化,其取值为1-100(包含)。

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'yanying-smaller.jpg' );

  4. $filter = Grafika::createFilter('Sharpen',50);

  5. $editor->apply( $image, $filter );

  6. $editor->save($image,'333/yanying-Sharpen.jpg');

我们取值50,看下效果

    

图像查找边缘

通过数学计算检测出图像的边缘,在ps中较为常用。

这里使用Sobel参数达到相同效果,没有值可选

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'yanying-smaller.jpg' );

  4. $filter = Grafika::createFilter('Sobel');

  5. $editor->apply( $image, $filter );

  6. $editor->save($image,'333/yanying-Sobel.jpg');

    

grafika的图像属性处理功能,共7个方法

1、图片格式化为二进制格式输出

该方法的作用是打开一张图片,然后格式化为二进制数据,直接输出到浏览器,而不是传统的src显示图片。

其有一个参数,你可以自定义输出图片的格式,比如png啥的

我们这里打开图片,输出为png

当然你还是要告诉浏览器你需要输出的类型是图片header('Content-type: image/png');

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'yanying-smaller.jpg' );

  4. header('Content-type: image/png'); // Tell the browser we're sending a png image

  5. $image->blob('PNG');

2、获取图片当前使用的处理库

使用方法可以获取处理当前图片,grafika使用了什么库,是gd还是Imagick

该方法不在editor里面,而是直接在$image里面,没有任何参数

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'yanying-smaller.jpg' );

  4. $result = $image->getCore();

  5. var_dump($result); // resource(12, gd)

3、获取图片高度

我们图片高度为213px

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'yanying-smaller.jpg' );

  4. $result = $image->getHeight();

  5. var_dump($result); // int 213

4、获取图片宽度

我们图片宽度为319px

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'yanying-smaller.jpg' );

  4. $result = $image->getWidth();

  5. var_dump($result); // int 319

5、获取图片名称

图片名称为当前文件名

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'yanying-smaller.jpg' );

  4. $result = $image->getImageFile();

  5. var_dump($result); // string 'yanying-smaller.jpg' (length=19)

6、获取图片类型

这里我们发现是jpg的

 
  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'yanying-smaller.jpg' );

  4. $result = $image->getType();

  5. var_dump($result); // string 'JPEG' (length=4)

7、判断图片是否是动态图片,比如gif

我们这张图片是jpg的,所以不是动态图片,返回值为bool类型,true或者false

 

绘制贝塞尔曲线有两个方法。但是大体步骤相同。1:、打开图片;2、绘图;3、保存或者输出

1、自行选择库,这种方法需要自行判断

命名空间中的use也需要注意,比之前多了两个

 

2、可以让grafika自己去选择当前适合的类

这种方法就是简单了许多,我们这次重新设定了参数,并且把线条颜色改为了黑色

 

效果不错,以后再搞验证码就简单多了

2、绘制椭圆

椭圆虽然看着难,但是只要搞清楚确定一个椭圆的几个基本参数就可以了。

这里使用Ellipse参数来绘制椭圆。

后面跟着一些绘制椭圆的形状、样式参数。我们从左到右描述

我们创建一个200*100,距离左边50,上边75,边框为1,边框色为黑色,填充红色的椭圆。

 

查看结果

3、绘制直线

绘制直线就稍微简单点儿了。

我们试着画几根线试试:

 

4、绘制多边形

我们使用Polygon绘制多边形,其中参数为

形如

array(array(0,0), array(50,0), array(0,50))

我们试着画几个图形

 

5、二次贝塞尔曲线

又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线

其形如这个样子

我们使用如下代码就可以很轻松的创建

 

其中参数如下

当然你也可以使用另外一种方式来创建二次贝塞曲线

 

6、创建矩形

矩形,其实和椭圆形差不多,只是有个别参数有些差异。

可以使用如下的代码直接创建一个矩形

 

其中的参数

我们绘制了几个矩形

  1. use Grafika\Grafika;

  2. $editor = Grafika::createEditor();

  3. $editor->open( $image, 'yanying-smaller.jpg' );

  4. $result = $image->isAnimated();

  5. var_dump($result); // boolean false

    1、绘制贝塞尔曲线

    贝塞尔曲线绘制,需要两个端点,一头一尾,还有两个控制点,在之间。所以,必然最起码4个参数。加上一个颜色共计5个参数。

    从做到右,我们依次解释

  6. 第一个(数组):表示起始点,数组内第一个参数为x,第二个参数为y(下同)

  7. 第二个(数组):控制点1(接近起始点),数组内参数同上

  8. 第三个(数组):控制点2(接近结束点),数组内参数同上

  9. 第四个(数组):结束点,数组内参数同上

  10. 第五个:颜色,可以用十六进制表示,比如:#ff0000

  11. use Grafika\Grafika;

  12. use Grafika\Gd\DrawingObject\CubicBezier as GdCubicBezier;

  13. use Grafika\Imagick\DrawingObject\CubicBezier as ImagickCubicBezier;

  14. $editor = Grafika::createEditor();

  15. $editor->open($image , 'yanying-smaller.jpg');

  16. $editorName = Grafika::detectAvailableEditor();

  17. if('Imagick'===$editorName){

  18. $drawingObject = new ImagickCubicBezier(array(42, 180), array(230, 190), array(42, 45), array(300, 43), '#ff0000');

  19. } else if ('Gd'===$editorName) {

  20. $drawingObject = new GdCubicBezier(array(42, 180), array(230, 190), array(42, 45), array(300, 43), '#ff0000');

  21. }

  22. $editor->draw( $image, $drawingObject );

  23. $editor->save($image,'333/yanying-CubicBezier-1.jpg');

  24. use Grafika\Grafika;

  25. $editor = Grafika::createEditor();

  26. $editor->open($image , 'yanying-smaller.jpg');

  27. $drawingObject = Grafika::createDrawingObject('CubicBezier', array(42, 230), array(230, 237), array(42, 45), array(230, 43), '#000000');

  28. $editor->draw( $image, $drawingObject );

  29. $editor->save($image,'333/yanying-CubicBezier-1.jpg');

  30. 椭圆的宽:px为单位

  31. 椭圆的高:px为单位

  32. 位置(数组):数组内第一个值为x(椭圆最左边距离图像最左边值),第二个值为y(椭圆最上边距离图形最上边值)

  33. 边框宽度:单位px,如果设置为0,则表示无边框,默认为1px

  34. 椭圆边框颜色:该值需要借助于color类,而不是简单的填入一个颜色字符串

  35. 椭圆的填充值:该颜色同上

  36. use Grafika\Grafika;

  37. use Grafika\Color;

  38. $editor = Grafika::createEditor();

  39. $editor->open($image , 'yanying-smaller.jpg');

  40. $drawingObject = Grafika::createDrawingObject('Ellipse', 200, 100, array(50, 75), 1, new Color('#000000'), new Color('#FF0000'));

  41. $editor->draw( $image, $drawingObject );

  42. $editor->save($image,'333/yanying-Ellipse.jpg');

  43. 第一个参数为数组,表示起始坐标

  44. 第二个参数为数组,表示结束坐标

  45. 第三个参数为垂直方向的顺序,表示哪根线在上哪根线在下。(其中GD库会忽略掉,默认为1)

  46. use Grafika\Grafika;

  47. use Grafika\Color;

  48. $editor = Grafika::createEditor();

  49. $editor->open($image , 'yanying-smaller.jpg');

  50. $editor->draw($image, Grafika::createDrawingObject('Line', array(0, 0), array(200, 200), 1, new Color('#FF0000')));

  51. $editor->draw($image, Grafika::createDrawingObject('Line', array(0, 200), array(200, 0), 1, new Color('#00FF00')));

  52. $editor->draw($image, Grafika::createDrawingObject('Line', array(0, 0), array(200, 100), 1, new Color('#0000FF')));

  53. $editor->draw($image, Grafika::createDrawingObject('Line', array(0, 100), array(200, 100)));

  54. $editor->draw($image, Grafika::createDrawingObject('Line', array(100, 0), array(100, 200)));

  55. $editor->save($image,'333/Line.jpg');

  56. 第一个参数为坐标点,是一个数组,其中该数组内有3个数组,每个数组有两个值,第一个值表示x,第二个值表示y

  57. 第二个参数为边框宽度,0为没有,从1开始,单位为px(默认为1)

  58. 第三个参数为边框颜色(默认为黑色)

  59. 第四个参数为填充色(默认白色)

  60. use Grafika\Grafika;

  61. use Grafika\Color;

  62. $editor = Grafika::createEditor();

  63. $editor->open($image , 'yanying-smaller.jpg');

  64. $editor->draw( $image, Grafika::createDrawingObject('Polygon', array(array(0,0), array(50,0), array(0,50)), 1));

  65. $editor->draw( $image, Grafika::createDrawingObject('Polygon', array(array(200-1,0), array(150-1,0), array(200-1,50)), 1));

  66. $editor->draw( $image, Grafika::createDrawingObject('Polygon', array(array(100,0), array(140,50), array(100,100), array(60,50)), 1, null, new Color('#FF0000')));

  67. $editor->save($image,'333/Polygon.jpg');

  68. use Grafika\Grafika;

  69. $editor = Grafika::createEditor();

  70. $editor->open($image , 'yanying-smaller.jpg');

  71. $drawingObject = Grafika::createDrawingObject('QuadraticBezier', array(70, 250), array(20, 110), array(220, 60), '#FF0000');

  72. $editor->draw( $image, $drawingObject );

  73. $editor->save($image,'333/yanying-QuadraticBezier.jpg');

  74. 第一个参数为起始点的坐标,是一个数组array(x,y)

  75. 第二个参数为控制点的坐标,也是数组,数组内分别为x,y

  76. 第三个参数为结束点的坐标,也是一个数组,数组内为x,y

  77. 最后一个参数为颜色,默认为黑色

  78. use Grafika\Grafika;

  79. use Grafika\Gd\DrawingObject\QuadraticBezier as GdQuadraticBezier;

  80. use Grafika\Imagick\DrawingObject\QuadraticBezier as ImagickQuadraticBezier;

  81. $editorName = Grafika::detectAvailableEditor();

  82. $editor = Grafika::createEditor();

  83. $editor->open($image , 'yanying-smaller.jpg');

  84. if('Imagick'===$editorName){

  85. $drawingObject = new ImagickQuadraticBezier(array(70, 250), array(20, 110), array(220, 60), '#FF0000');

  86. } else if ('Gd'===$editorName) {

  87. $drawingObject = new GdQuadraticBezier(array(70, 250), array(20, 110), array(220, 60), '#FF0000');

  88. }

  89. $editor->draw( $image, $drawingObject );

  90. $editor->save($image,'333/yanying-QuadraticBezier-1.jpg');

  91. use Grafika\Grafika;

  92. use Grafika\Color;

  93. $editorName = Grafika::detectAvailableEditor();

  94. $editor = Grafika::createEditor();

  95. $editor->open($image , 'yanying-smaller.jpg');

  96. $editor->draw( $image, Grafika::createDrawingObject('Rectangle', 85, 50)); // A 85x50 no filled rectangle with a black 1px border on location 0,0.

  97. $editor->draw( $image, Grafika::createDrawingObject('Rectangle', 85, 50, array(105, 10), 0, null, new Color('#FF0000'))); // A 85x50 red rectangle with no border.

  98. $editor->draw( $image, Grafika::createDrawingObject('Rectangle', 85, 50, array(105, 70), 0, null, new Color('#00FF00'))); // A 85x50 green rectangle with no border.

  99. $editor->draw( $image, Grafika::createDrawingObject('Rectangle', 85, 50, array(0, 60), 1, '#000000', null)); // No fill rectangle

  100. $editor->save($image,'333/yanying-Rectangle.jpg');

  101. 第一个为:宽度。px为单位

  102. 第二个为高度,px为单位

  103. 第三个为一个数组,内包含两个值,x:表示矩形左边距离图片左边的距离;y:表示矩形的上边距离图片的上边距离。默认为array(0,0)表示和左上角重叠。

  104. 第四个参数为边框的宽度,默认为1,当设置为0的时候,表示没有边框

  105. 第五个参数为边框的颜色,默认为黑色,当设置为null的时候表示没有颜色

  106. 第六个参数为填充颜色,默认为白色,当设置为null的时候表示没有颜色

    • 第四个参数为颜色,不填默认为黑色

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梅坞茶坊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值