PHP图片处理库Grafika详细教程(1):图像基本处理

简介:

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

由于功能太多,所以分成几篇文章写。

《1、图像基本处理》

《2、图像特效处理模块》

《3、图像属性处理》

《4、图形绘制》

优点:

  • 缩略图的速度非常快,质量非常高
  • 支持智能剪裁
  • 很好的支持GIF图片
  • 5种缩略图模式
  • 图像对比功能
  • 图像高级过滤功能
  • 图像混合
  • 其他图像处理库支持的API基本都支持

安装

下载

1、直接下载:

Grafika的官网Github地址

2、composer:


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

环境需求

  1. PHP >= 5.3,当然官方推荐php7
  2. GD库 >= 2.0版本
  3. Imagick最好(不强求)>=3.3.0 , ImageMagick >= 6.5.3

部署

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

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

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

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

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


 
 
  1. require_once 'src/autoloader.php'

创建Editors

1、createEditor

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

由于,grafika是基于Imagick和GD库,所以使用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.  
  5.     // Your code here 
  6.  

3、GD Editor

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


 
 
  1. use Grafika\Gd\Editor; // Import package 
  2. $editor = new Editor(); // Gd editor 
  3. if( $editor->isAvailable() ) { // Safety check 
  4.  
  5.     // Your code here 
  6.  
  7. }  

创建图像

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、从已有图片拷贝一个

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


 
 
  1. $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.  
  7. $editor->open($image2 , 'yanying-h.jpg'); // 打开yanying.jpg并且存放到$image2 
  8. $editor->resizeFit($image2 , 200 , 200); 
  9. $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.  
  7. $editor->open($image2 , 'yanying-h.jpg'); // 打开yanying.jpg并且存放到$image2 
  8. $editor->resizeExact($image2 , 200 , 200); 
  9. $editor->save($image2 , 'yanying2.jpg');  

3、Resize Fill

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

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.  
  7. $editor->open($image2 , 'yanying-h.jpg'); // 打开yanying.jpg并且存放到$image2 
  8. $editor->resizeExactWidth($image2 , 200); 
  9. $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.  
  4. $src = 'yanying.jpg'
  5. $editor->open( $image, $src ); 
  6. $editor->crop( $image, 300, 200, 'top-left' ); 
  7. $editor->save( $image, 'result1.jpg' ); 
  8. $editor->free( $image ); 
  9.  
  10. $editor->open( $image, $src ); 
  11. $editor->crop( $image, 300, 200, 'top-center' ); 
  12. $editor->save( $image, 'result2.jpg' ); 
  13. $editor->free( $image ); 
  14.  
  15. $editor->open( $image, $src ); 
  16. $editor->crop( $image, 300, 200, 'top-right' ); 
  17. $editor->save( $image, 'result3.jpg' ); 
  18. $editor->free( $image ); 
  19.  
  20. $editor->open( $image, $src ); 
  21. $editor->crop( $image, 300, 200, 'center-left' ); 
  22. $editor->save( $image, 'result4.jpg' ); 
  23. $editor->free( $image ); 
  24.  
  25. $editor->open( $image, $src ); 
  26. $editor->crop( $image, 300, 200, 'center' ); 
  27. $editor->save( $image, 'result5.jpg' ); 
  28. $editor->free( $image ); 
  29.  
  30. $editor->open( $image, $src ); 
  31. $editor->crop( $image, 300, 200, 'center-right' ); 
  32. $editor->save( $image, 'result6.jpg' ); 
  33. $editor->free( $image ); 
  34.  
  35. $editor->open( $image, $src ); 
  36. $editor->crop( $image, 300, 200, 'bottom-left' ); 
  37. $editor->save( $image, 'result7.jpg' ); 
  38. $editor->free( $image ); 
  39.  
  40. $editor->open( $image, $src ); 
  41. $editor->crop( $image, 300, 200, 'bottom-center' ); 
  42. $editor->save( $image, 'result8.jpg' ); 
  43. $editor->free( $image ); 
  44.  
  45. $editor->open( $image, $src ); 
  46. $editor->crop( $image, 300, 200, 'bottom-right' ); 
  47. $editor->save( $image, 'result9.jpg' ); 
  48. $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 olor("#000000"),'',45); 
  6. $editor->save($image,'333/yanying-text.jpg');  

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



作者:星空幻颖

来源:51CTO

相关文章
|
12天前
|
PHP 计算机视觉 UED
Buzz库:PHP图像处理中的异步图像下载和保存
Buzz库:PHP图像处理中的异步图像下载和保存
|
1月前
|
SQL 安全 PHP
PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全
本文深入探讨了PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全。
54 4
|
1月前
|
XML 安全 PHP
PHP与SOAP Web服务开发:基础与进阶教程
本文介绍了PHP与SOAP Web服务的基础和进阶知识,涵盖SOAP的基本概念、PHP中的SoapServer和SoapClient类的使用方法,以及服务端和客户端的开发示例。此外,还探讨了安全性、性能优化等高级主题,帮助开发者掌握更高效的Web服务开发技巧。
|
2月前
|
tengine 应用服务中间件 Linux
Tengine、Nginx安装PHP命令教程
要在阿里云Linux上安装PHP,请先更新YUM源并启用PHP 8.0仓库,然后安装PHP及相关扩展。通过`php -v`命令验证安装成功后,需修改Nginx配置文件以支持PHP,并重启服务。最后,创建`phpinfo.php`文件测试安装是否成功。对于CentOS系统,还需安装EPEL源和Remi仓库,其余步骤类似。完成上述操作后,可通过浏览器访问`http://IP地址/phpinfo.php`测试安装结果。
|
3月前
|
PHP Windows
thinkPhP6.0安装教程图解--PHP框架安装
本文是一篇关于ThinkPHP 6.0安装教程的图解,包括环境检查、安装Composer、修改Composer镜像地址、安装ThinkPHP框架以及启动运行ThinkPHP的步骤。文章详细描述了每个步骤的操作方法,并提供了相应的命令和截图,帮助用户理解并顺利完成ThinkPHP 6.0的安装和运行。
thinkPhP6.0安装教程图解--PHP框架安装
|
2月前
|
Shell 网络安全 数据安全/隐私保护
suuk-s.php.jpg-python 库劫持
suuk-s.php.jpg-python 库劫持
32 0
|
3月前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。
|
4月前
|
PHP
在 PHP 中将 WebP 转换为 GIF 图像格式
【8月更文挑战第27天】
82 2
|
4月前
|
Linux PHP
Linux CentOS 宝塔 Suhosin禁用php5.6版本eval函数详细图文教程
【8月更文挑战第27天】本文介绍两种禁用PHP执行的方法:使用`PHP_diseval_extension`禁用和通过`suhosin`禁用。由于`suhosin`不支持PHP8,仅适用于PHP7及以下版本,若服务器安装了PHP5.6,则需对应安装`suhosin-0.9.38`版本。文章提供了详细的安装步骤,并强调了宝塔环境下与普通环境下的PHP路径差异。安装完成后,在`php.ini`中添加`suhosin.so`扩展并设置`executor.disable_eval = on`以禁用执行功能。最后通过测试代码验证是否成功禁用,并重启`php-fpm`服务生效。
57 2
|
4月前
|
SQL 关系型数据库 MySQL
PHP与MySQL交互之基础教程
【8月更文挑战第31天】 在数字世界中,数据是推动一切的核心力量。本文将引导你探索PHP与MySQL的协同工作,通过实际代码示例,展示如何建立连接、执行查询以及处理结果集。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你提供宝贵的实践知识。