基于ImageMagick的php图片处理库Grafika介绍
Grafika是一个PHP图像处理库,是基于Imagick和GD,可以用于改变图片大小,剪裁,比较,添加水印等等功能。还有感知哈希,高级图像过滤,绘制贝塞尔曲线等功能,可谓非常强大。
《1、图像基本处理》
《2、图像特效处理模块》
《3、图像属性处理》
《4、图形绘制》
一、图像基本处理
优点:
-
缩略图的速度非常快,质量非常高
-
支持智能剪裁
-
很好的支持GIF图片
-
5种缩略图模式
-
图像对比功能
-
图像高级过滤功能
-
图像混合
-
其他图像处理库支持的API基本都支持
安装
下载
直接下载:
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
位于class="lazy" data-src
目录下。
在index.php
中引入它,(说明下,以下示例都需要引入这个autoloader.php
文件,我们默认省略),下面就可以直接开发了。
require_once 'class="lazy" data-src/autoloader.php';
创建Editors
1、createEditor
grafika
通过静态方法createEditor
来创建一个editor
。它包含所有的图片处理方法。
由于,grafika
是基于Imagick
和GD
库,所以使用createEditor
方法会根据当前情况,自动选择所需要的图片处理库。(推荐使用)
-
use Grafika\Grafika; // Import package
-
$editor = Grafika::createEditor(); // Create the best available editor
2、Imagick Editor
当然你也可以直接使用Imagick
类库。
-
use Grafika\Imagick\Editor; // Import package
-
$editor = new Editor(); // Imagick editor
注意:有些情况可能不支持该类库,你需要使用下面语句检查后使用,(不过你最好直接使用方法1,就没这些事)
-
use Grafika\Imagick\Editor; // Import package
-
$editor = new Editor(); // Imagick editor
-
if( $editor->isAvailable() ) { // Safety check
-
// Your code here
-
}
3、GD Editor
你也可以直接使用GD
库,也有些情况可能不支持,记得检查
-
use Grafika\Gd\Editor; // Import package
-
$editor = new Editor(); // Gd editor
-
if( $editor->isAvailable() ) { // Safety check
-
// Your code here
-
}
创建图像
grafika
允许你使用4种方式创建一个待处理的图像
1、直接打开图像
创建editor
+ open
方法
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'path/to/image.jpg');
2、使用静态方法打开图片
使用直接打开、创建图片
-
use Grafika\Grafika;
-
$image = Grafika::createImage('path/to/image.jpg');
-
// 这里省略了$editor = Grafika::createEditor();
3、创建一个空白的画布
新建一个画布作为新图像
-
use Grafika\Grafika;
-
$image = Grafika::createBlankImage(100,100);
4、从已有图片拷贝一个
拷贝一个图像作为图像处理
$copy = clone $image;
这种方法你要保证之前有一张图片
这几种方法之后的操作大同小异,我们只选择第一种常规方法作为讲解示例
图片缩略图
我们先准备一个原图
接下来,假设我们要创建的缩略图长:200px宽200px
1、Resize Fit
等比例缩放类型。那么就保证图片较长的一边不超过200px,等比缩放,缩放后不填充背景。
-
use Grafika\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
2、Resize Exact
固定尺寸缩放类型。就是不管图片长宽比,全部缩小到200px,可能导致图片变形。
-
use Grafika\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、Resize Fill
居中剪裁。就是把较短的变缩放到200px,然后将长边的大于200px的部分居中剪裁掉,图片不会变形。
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open($image1 , 'yanying.jpg'); // 打开yanying.jpg并且存放到$image1
-
$editor->resizeFill($image1 , 200,200);
-
$editor->save($image1 , 'yanying1.jpg');
-
$editor->open($image2 , 'yanying-h.jpg'); // 打开yanying.jpg并且存放到$image2
-
$editor->resizeFill($image2 , 200,200);
-
$editor->save($image2 , 'yanying2.jpg');
4、Resize Exact Width
等宽缩放。和第一种功能相似,最终宽为200px,等比缩放,高度不管。
-
use Grafika\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、Resize Exact Height
等高缩放。最终高为200px,等比缩放,不考虑图片宽度。
图像对比功能
1、图片相似度对比
我们首先准备一张基本图,用来和其他图片对比。(segmentfault网页图片可能处理过,直接使用本文图片可能结果不一致)
我们第一次使用一张灰度图片来比较
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$result = $editor->compare('yanying.jpg' , 'yanying_grey.jpg');
-
var_dump($result); // int 2
说明: grafika图片对比方法compare
返回一个数字,其中如果数字越接近于0,那么表示图片越相似。如果数字在0-10范围内,那么图片都可能相似。但是如果数字大于10,那么,可能就完全不同。
这里返回2,说明相似度还是非常高的。
我们再用一张缩小的图片来测试,记住都是和第一张基本图比较。
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$result = $editor->compare('yanying.jpg' , 'yanying-smaller.jpg');
-
var_dump($result); // int 0
这里结果返回0,相似度非常高。
我们再用一张剪裁下来的局部图片测试
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$result = $editor->compare('yanying.jpg' , 'yanying-half.jpg');
-
var_dump($result); // int 20
结果超过10了,相似度不怎么高
我们再用一张完全不同的图片测试
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$result = $editor->compare('yanying.jpg' , 'yanying-h.jpg');
-
var_dump($result); // int 39
结果39,越来越大,越来越不像
2、比较图片是否相同
grafika提供方法equal
来检查两张图片是否完全相同。这里的检查是一个像素一个像素的检测,所以时间可能会较长。
当然grafika也会预检查,如果两张图片大小不相同,则直接返回false
。只有其他都相同后才会进行逐像素检查。
我们这里对比之前创建的一张缩略图,因为大小不一致,所以直接返回false
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$result = $editor->equal('yanying.jpg' , 'yanying-smaller.jpg');
-
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块
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$class="lazy" data-src = 'yanying.jpg';
-
$editor->open( $image, $class="lazy" data-src );
-
$editor->crop( $image, 300, 200, 'top-left' );
-
$editor->save( $image, 'result1.jpg' );
-
$editor->free( $image );
-
$editor->open( $image, $class="lazy" data-src );
-
$editor->crop( $image, 300, 200, 'top-center' );
-
$editor->save( $image, 'result2.jpg' );
-
$editor->free( $image );
-
$editor->open( $image, $class="lazy" data-src );
-
$editor->crop( $image, 300, 200, 'top-right' );
-
$editor->save( $image, 'result3.jpg' );
-
$editor->free( $image );
-
$editor->open( $image, $class="lazy" data-src );
-
$editor->crop( $image, 300, 200, 'center-left' );
-
$editor->save( $image, 'result4.jpg' );
-
$editor->free( $image );
-
$editor->open( $image, $class="lazy" data-src );
-
$editor->crop( $image, 300, 200, 'center' );
-
$editor->save( $image, 'result5.jpg' );
-
$editor->free( $image );
-
$editor->open( $image, $class="lazy" data-src );
-
$editor->crop( $image, 300, 200, 'center-right' );
-
$editor->save( $image, 'result6.jpg' );
-
$editor->free( $image );
-
$editor->open( $image, $class="lazy" data-src );
-
$editor->crop( $image, 300, 200, 'bottom-left' );
-
$editor->save( $image, 'result7.jpg' );
-
$editor->free( $image );
-
$editor->open( $image, $class="lazy" data-src );
-
$editor->crop( $image, 300, 200, 'bottom-center' );
-
$editor->save( $image, 'result8.jpg' );
-
$editor->free( $image );
-
$editor->open( $image, $class="lazy" data-src );
-
$editor->crop( $image, 300, 200, 'bottom-right' );
-
$editor->save( $image, 'result9.jpg' );
-
$editor->free( $image );
看下结果
智能剪裁
原图
我们使用智能剪裁将图片剪裁至200*200px
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'yanying-smaller.jpg' );
-
$editor->crop( $image, 200, 200, 'smart' );
-
$editor->save( $image, 'yanying-smart.jpg' );
发现还是可以突出重点的
GIF缩略图
压缩GIF,不丢失动画
grafika可以直接压缩GIF图片,并且不丢失动画功能。
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'sample.gif' );
-
$editor->resizeFit( $image, 250, 128 );
-
$editor->save( $image, 'output.gif' );
我们这里将原图压缩到原来的一半,发现动画并没有丢失
移除GIF动画效果
当然,如果有需要,我们也可以直接移除GIF的动画效果
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'sample.gif' );
-
$editor->flatten( $image );
-
$editor->save( $image, 'output-no-animation.gif' );
图片合并
图片合并需要2张图片,将其中一张作为基本图,准备的第二章图片就是放置在基础图片之上。
我们首先来看代码
-
use Grafika\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
为基础图片,也就是放在下面的。重点在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
图像旋转
图像旋转比较简单,只需要给一个旋转角度参数就可以了,如果想要给背景填充个颜色,再给一个颜色参数即可。(默认不给背景色为黑色)
代码如下
-
use Grafika\Grafika;
-
use Grafika\Color;
-
$editor = Grafika::createEditor();
-
$editor->open($image , 'yanying-smaller.jpg');
-
$editor->rotate($image ,'45',new Color('#ff0000'));
-
$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
,也就是不旋转
我们随便找个文字试试
-
use Grafika\Grafika;
-
use Grafika\Color;
-
$editor = Grafika::createEditor();
-
$editor->open($image , 'yanying-smaller.jpg');
-
$editor->text($image ,'yanying',30,200,100,new Color("#000000"),'',45);
-
$editor->save($image,'333/yanying-text.jpg');
看下效果。这里说明下,如果文字为中文,需要找一个支持中文的字体。默认字体不支持中文,所以你写中文,就是都是小方框。
图片过滤、滤镜
grafika提供了11种滤镜功能,可以满足开发中的任何情况需求。
这里先介绍一个操作方法:apply
:它可以将滤镜效果应用到图片
图片模糊
使用Blur
参数,模糊化一张图片
其中模糊度取值范围为0-100,数值越大,图片越模糊
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'yanying-smaller.jpg' );
-
$filter = Grafika::createFilter('Blur', 50); // 模糊度为10,模糊度取值为0-100
-
$editor->apply( $image, $filter ); // 将滤镜应用到图片
-
$editor->save($image,'yanying-blur.jpg');
我们将图片模糊参数调为50
图片亮度调整
使用Brightness
,加亮或者变暗图片
其中亮度值取值范围为
-
-100 至 -1,变暗
-
0 图片没有变化
-
1-100图片变量
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'yanying-smaller.jpg' );
-
$filter = Grafika::createFilter('Brightness', -50);
-
$editor->apply( $image, $filter );
-
$editor->save($image,'333/yanying-Brightness-1.jpg');
改变图片颜色
使用Colorize
参数,调整图片的红绿蓝三个基础色来改变图片颜色
颜色参数(红色、绿色、蓝色取值范围相同)
-
取值-100至-1,颜色减少;
-
如果为0表示不变;
-
取值1-100,表示色值增加
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'yanying-smaller.jpg' );
-
$filter = Grafika::createFilter('Colorize', -50,50,-50);
-
$editor->apply( $image, $filter );
-
$editor->save($image,'333/yanying-Colorize.jpg');
改变图片对比度
使用Contrast
参数可以改变图片的对比度
对比度的取值和之前的也差不多,-100至-1,对比度减少;0不变;1至100,对比度增加
具体什么叫对比度,自行百度,我也不是太清楚,毕竟不是搞设计的
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'yanying-smaller.jpg' );
-
$filter = Grafika::createFilter('Contrast', 50);
-
$editor->apply( $image, $filter );
-
$editor->save($image,'333/yanying-Contrast.jpg');
图像噪点
使用Dither
来给图像添加噪点,其参数取值只有两个diffusion
:扩散;ordered
:规整的
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'yanying-smaller.jpg' );
-
$filter = Grafika::createFilter('Dither', 'diffusion');
-
$editor->apply( $image, $filter );
-
$editor->save($image,'333/yanying-Dither-diffusion.jpg');
图像色阶调整
Gamma
这个参数在平时是不常用的,只有在专业的图像领域才会使用。可以理解为色阶,是灰阶亮度值与灰阶等级之间的数学关系。
这里的Gamma
功能是校正图像色阶,使得图像看起来颜色更加正确
这里的数字值取值范围只有最小值没有最大值只要 >=1.0都可以
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'yanying-smaller.jpg' );
-
$filter = Grafika::createFilter('Gamma', 2.0);
-
$editor->apply( $image, $filter );
-
$editor->save($image,'333/yanying-Gamma.jpg');
图片灰度
使用Grayscale
使图片所有的色彩丢弃,只保留黑白两种颜色,没有取值。
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'yanying-smaller.jpg' );
-
$filter = Grafika::createFilter('Grayscale');
-
$editor->apply( $image, $filter );
-
$editor->save($image,'333/yanying-Grayscale.jpg');
图像反色处理
图像反色,也就是弄得和胶片似得。
使用Invert
参数可以达到图像反色效果,也没有可选值
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'yanying-smaller.jpg' );
-
$filter = Grafika::createFilter('Invert');
-
$editor->apply( $image, $filter );
-
$editor->save($image,'333/yanying-Invert.jpg');
图片像素化、栅格化
就是把矢量图形转换成像素点组成的点阵图形,也叫栅格化。搞ps的应该都清楚
该参数有个取值范围只要大于或者等于1就可以,如果值越大,像素点也就越大
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'yanying-smaller.jpg' );
-
$filter = Grafika::createFilter('Pixelate',10);
-
$editor->apply( $image, $filter );
-
$editor->save($image,'333/yanying-Pixelate-10.jpg');
我们取值5和取值10对比下
图片锐化
图片锐化就是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰。
使用参数Sharpen
可以处理锐化,其取值为1-100(包含)。
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'yanying-smaller.jpg' );
-
$filter = Grafika::createFilter('Sharpen',50);
-
$editor->apply( $image, $filter );
-
$editor->save($image,'333/yanying-Sharpen.jpg');
我们取值50,看下效果
图像查找边缘
通过数学计算检测出图像的边缘,在ps中较为常用。
这里使用Sobel
参数达到相同效果,没有值可选
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'yanying-smaller.jpg' );
-
$filter = Grafika::createFilter('Sobel');
-
$editor->apply( $image, $filter );
-
$editor->save($image,'333/yanying-Sobel.jpg');
grafika的图像属性处理功能,共7个方法
1、图片格式化为二进制格式输出
该方法的作用是打开一张图片,然后格式化为二进制数据,直接输出到浏览器,而不是传统的class="lazy" data-src显示图片。
其有一个参数,你可以自定义输出图片的格式,比如png啥的
我们这里打开图片,输出为png
当然你还是要告诉浏览器你需要输出的类型是图片header('Content-type: image/png');
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'yanying-smaller.jpg' );
-
header('Content-type: image/png'); // Tell the browser we're sending a png image
-
$image->blob('PNG');
获取图片当前使用的处理库
使用方法可以获取处理当前图片,grafika使用了什么库,是gd
还是Imagick
该方法不在editor
里面,而是直接在$image
里面,没有任何参数
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'yanying-smaller.jpg' );
-
$result = $image->getCore();
-
var_dump($result); // resource(12, gd)
3、获取图片高度
我们图片高度为213px
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'yanying-smaller.jpg' );
-
$result = $image->getHeight();
-
var_dump($result); // int 213
4、获取图片宽度
我们图片宽度为319px
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'yanying-smaller.jpg' );
-
$result = $image->getWidth();
-
var_dump($result); // int 319
5、获取图片名称
图片名称为当前文件名
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'yanying-smaller.jpg' );
-
$result = $image->getImageFile();
-
var_dump($result); // string 'yanying-smaller.jpg' (length=19)
6、获取图片类型
这里我们发现是jpg的
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'yanying-smaller.jpg' );
-
$result = $image->getType();
-
var_dump($result); // string 'JPEG' (length=4)
7、判断图片是否是动态图片,比如gif
我们这张图片是jpg的,所以不是动态图片,返回值为bool类型,true或者false
绘制贝塞尔曲线有两个方法。但是大体步骤相同。1:、打开图片;2、绘图;3、保存或者输出
自行选择库,这种方法需要自行判断
命名空间中的use也需要注意,比之前多了两个
可以让grafika自己去选择当前适合的类
这种方法就是简单了许多,我们这次重新设定了参数,并且把线条颜色改为了黑色
效果不错,以后再搞验证码就简单多了
绘制椭圆
椭圆虽然看着难,但是只要搞清楚确定一个椭圆的几个基本参数就可以了。
这里使用Ellipse
参数来绘制椭圆。
后面跟着一些绘制椭圆的形状、样式参数。我们从左到右描述
我们创建一个200*100,距离左边50,上边75,边框为1,边框色为黑色,填充红色的椭圆。
查看结果
3、绘制直线
绘制直线就稍微简单点儿了。
我们试着画几根线试试:
4、绘制多边形
我们使用Polygon
绘制多边形,其中参数为
形如
array(array(0,0), array(50,0), array(0,50))
我们试着画几个图形
5、二次贝塞尔曲线
又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线
其形如这个样子
我们使用如下代码就可以很轻松的创建
其中参数如下
当然你也可以使用另外一种方式来创建二次贝塞曲线
6、创建矩形
矩形,其实和椭圆形差不多,只是有个别参数有些差异。
可以使用如下的代码直接创建一个矩形
其中的参数
我们绘制了几个矩形
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open( $image, 'yanying-smaller.jpg' );
-
$result = $image->isAnimated();
-
var_dump($result); // boolean false
1、绘制贝塞尔曲线
贝塞尔曲线绘制,需要两个端点,一头一尾,还有两个控制点,在之间。所以,必然最起码4个参数。加上一个颜色共计5个参数。
从做到右,我们依次解释
-
第一个(数组):表示起始点,数组内第一个参数为x,第二个参数为y(下同)
-
第二个(数组):控制点1(接近起始点),数组内参数同上
-
第三个(数组):控制点2(接近结束点),数组内参数同上
-
第四个(数组):结束点,数组内参数同上
-
第五个:颜色,可以用十六进制表示,比如:#ff0000
-
use Grafika\Grafika;
-
use Grafika\Gd\DrawingObject\CubicBezier as GdCubicBezier;
-
use Grafika\Imagick\DrawingObject\CubicBezier as ImagickCubicBezier;
-
$editor = Grafika::createEditor();
-
$editor->open($image , 'yanying-smaller.jpg');
-
$editorName = Grafika::detectAvailableEditor();
-
if('Imagick'===$editorName){
-
$drawingObject = new ImagickCubicBezier(array(42, 180), array(230, 190), array(42, 45), array(300, 43), '#ff0000');
-
} else if ('Gd'===$editorName) {
-
$drawingObject = new GdCubicBezier(array(42, 180), array(230, 190), array(42, 45), array(300, 43), '#ff0000');
-
}
-
$editor->draw( $image, $drawingObject );
-
$editor->save($image,'333/yanying-CubicBezier-1.jpg');
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open($image , 'yanying-smaller.jpg');
-
$drawingObject = Grafika::createDrawingObject('CubicBezier', array(42, 230), array(230, 237), array(42, 45), array(230, 43), '#000000');
-
$editor->draw( $image, $drawingObject );
-
$editor->save($image,'333/yanying-CubicBezier-1.jpg');
-
椭圆的宽:px为单位
-
椭圆的高:px为单位
-
位置(数组):数组内第一个值为x(椭圆最左边距离图像最左边值),第二个值为y(椭圆最上边距离图形最上边值)
-
边框宽度:单位px,如果设置为0,则表示无边框,默认为1px
-
椭圆边框颜色:该值需要借助于color类,而不是简单的填入一个颜色字符串
-
椭圆的填充值:该颜色同上
-
use Grafika\Grafika;
-
use Grafika\Color;
-
$editor = Grafika::createEditor();
-
$editor->open($image , 'yanying-smaller.jpg');
-
$drawingObject = Grafika::createDrawingObject('Ellipse', 200, 100, array(50, 75), 1, new Color('#000000'), new Color('#FF0000'));
-
$editor->draw( $image, $drawingObject );
-
$editor->save($image,'333/yanying-Ellipse.jpg');
-
第一个参数为数组,表示起始坐标
-
第二个参数为数组,表示结束坐标
-
第三个参数为垂直方向的顺序,表示哪根线在上哪根线在下。(其中GD库会忽略掉,默认为1)
-
use Grafika\Grafika;
-
use Grafika\Color;
-
$editor = Grafika::createEditor();
-
$editor->open($image , 'yanying-smaller.jpg');
-
$editor->draw($image, Grafika::createDrawingObject('Line', array(0, 0), array(200, 200), 1, new Color('#FF0000')));
-
$editor->draw($image, Grafika::createDrawingObject('Line', array(0, 200), array(200, 0), 1, new Color('#00FF00')));
-
$editor->draw($image, Grafika::createDrawingObject('Line', array(0, 0), array(200, 100), 1, new Color('#0000FF')));
-
$editor->draw($image, Grafika::createDrawingObject('Line', array(0, 100), array(200, 100)));
-
$editor->draw($image, Grafika::createDrawingObject('Line', array(100, 0), array(100, 200)));
-
$editor->save($image,'333/Line.jpg');
-
第一个参数为坐标点,是一个数组,其中该数组内有3个数组,每个数组有两个值,第一个值表示x,第二个值表示y
-
第二个参数为边框宽度,0为没有,从1开始,单位为px(默认为1)
-
第三个参数为边框颜色(默认为黑色)
-
第四个参数为填充色(默认白色)
-
use Grafika\Grafika;
-
use Grafika\Color;
-
$editor = Grafika::createEditor();
-
$editor->open($image , 'yanying-smaller.jpg');
-
$editor->draw( $image, Grafika::createDrawingObject('Polygon', array(array(0,0), array(50,0), array(0,50)), 1));
-
$editor->draw( $image, Grafika::createDrawingObject('Polygon', array(array(200-1,0), array(150-1,0), array(200-1,50)), 1));
-
$editor->draw( $image, Grafika::createDrawingObject('Polygon', array(array(100,0), array(140,50), array(100,100), array(60,50)), 1, null, new Color('#FF0000')));
-
$editor->save($image,'333/Polygon.jpg');
-
use Grafika\Grafika;
-
$editor = Grafika::createEditor();
-
$editor->open($image , 'yanying-smaller.jpg');
-
$drawingObject = Grafika::createDrawingObject('QuadraticBezier', array(70, 250), array(20, 110), array(220, 60), '#FF0000');
-
$editor->draw( $image, $drawingObject );
-
$editor->save($image,'333/yanying-QuadraticBezier.jpg');
-
第一个参数为起始点的坐标,是一个数组array(x,y)
-
第二个参数为控制点的坐标,也是数组,数组内分别为x,y
-
第三个参数为结束点的坐标,也是一个数组,数组内为x,y
-
最后一个参数为颜色,默认为黑色
-
use Grafika\Grafika;
-
use Grafika\Gd\DrawingObject\QuadraticBezier as GdQuadraticBezier;
-
use Grafika\Imagick\DrawingObject\QuadraticBezier as ImagickQuadraticBezier;
-
$editorName = Grafika::detectAvailableEditor();
-
$editor = Grafika::createEditor();
-
$editor->open($image , 'yanying-smaller.jpg');
-
if('Imagick'===$editorName){
-
$drawingObject = new ImagickQuadraticBezier(array(70, 250), array(20, 110), array(220, 60), '#FF0000');
-
} else if ('Gd'===$editorName) {
-
$drawingObject = new GdQuadraticBezier(array(70, 250), array(20, 110), array(220, 60), '#FF0000');
-
}
-
$editor->draw( $image, $drawingObject );
-
$editor->save($image,'333/yanying-QuadraticBezier-1.jpg');
-
use Grafika\Grafika;
-
use Grafika\Color;
-
$editorName = Grafika::detectAvailableEditor();
-
$editor = Grafika::createEditor();
-
$editor->open($image , 'yanying-smaller.jpg');
-
$editor->draw( $image, Grafika::createDrawingObject('Rectangle', 85, 50)); // A 85x50 no filled rectangle with a black 1px border on location 0,0.
-
$editor->draw( $image, Grafika::createDrawingObject('Rectangle', 85, 50, array(105, 10), 0, null, new Color('#FF0000'))); // A 85x50 red rectangle with no border.
-
$editor->draw( $image, Grafika::createDrawingObject('Rectangle', 85, 50, array(105, 70), 0, null, new Color('#00FF00'))); // A 85x50 green rectangle with no border.
-
$editor->draw( $image, Grafika::createDrawingObject('Rectangle', 85, 50, array(0, 60), 1, '#000000', null)); // No fill rectangle
-
$editor->save($image,'333/yanying-Rectangle.jpg');
-
第一个为:宽度。px为单位
-
第二个为高度,px为单位
-
第三个为一个数组,内包含两个值,x:表示矩形左边距离图片左边的距离;y:表示矩形的上边距离图片的上边距离。默认为array(0,0)表示和左上角重叠。
-
第四个参数为边框的宽度,默认为1,当设置为0的时候,表示没有边框
-
第五个参数为边框的颜色,默认为黑色,当设置为null的时候表示没有颜色
-
第六个参数为填充颜色,默认为白色,当设置为null的时候表示没有颜色
-
第四个参数为颜色,不填默认为黑色
-
来源地址:https://blog.csdn.net/qq_32421489/article/details/129768217
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341