Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解

前言

Intervention/image 是为 Laravel 定制的图片处理工具, 它提供了一套易于表达的方式来创建、编辑图片。

Demo 代码请见:

Github:https://github.com/zhengjinghua/est-image-demo

本地下载:http://xiazai.jb51.net/201711/yuanma/est-image-demo(jb51.net).rar

Demo

Demo 截图

Demo 运行

请参照文档 如何利用 Homestead 快速运行一个 Laravel 项目.

文章概览

安装; 修改配置信息; 基础用法; 特色功能.

接下来是详细解说.

1. 安装

1). 使用 composer 安装:

composer require intervention/image

上面的命令会

2). 修改 app/config/app.php 添加 ServiceProvider:

// 将下面代码添加到 providers 数组中 'providers' => [ // ... Intervention\Image\ImageServiceProvider::class, // ... ], // 将下面代码添加到 aliases 数组中 'aliases' => [ // ... 'Image' => Intervention\Image\Facades\Image::class, // ... ],

2. 图片处理库的配置

此扩展包默认使用 PHP 的 GD 库来进行图像处理, 但由于 GD 库对图像的处理效率要稍逊色于 imagemagick 库, 因此这里推荐替换为 imagemagick 库来进行图像处理.

开始之前, 你得先确定本地已经安装好 GD 或 Imagick.

在使用 Intervention Image 的时候, 你只需要给 ImageManager 传一个数组参数就可以完成 GD 和 Imagick 库之间的互相切换.

如下所示:

// 引入 composer autoload require 'vendor/autoload.php'; // 导入 Intervention Image Manager Class use Intervention\Image\ImageManager; // 通过指定 driver 来创建一个 image manager 实例 $manager = new ImageManager(array('driver' => 'imagick')); // 最后创建 image 实例 $image = $manager->make('public/foo.jpg')->resize(300, 200);

另外你也可以使用 ImageManager 的静态版本, 如下所示:

// 引入 composer autoload require 'vendor/autoload.php'; // 导入 Intervention Image Manager Class use Intervention\Image\ImageManagerStatic as Image; // 通过指定 driver 来创建一个 image manager 实例 (默认使用 gd) Image::configure(array('driver' => 'imagick')); // 最后创建 image 实例 $image = Image::make('public/foo.jpg')->resize(300, 200);

生成 config/image.php 配置文件:

php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravel5"

运行上面的命令后, 会在项目中生成 config/image.php 配置文件, 打开此文件并将 driver 修改成 imagick:

return array( 'driver' => 'imagick' );

到此, 此拓展包即安装成功!

3. 基础用法

// 修改指定图片的大小 $img = Image::make('images/avatar.jpg')->resize(200, 200); // 插入水印, 水印位置在原图片的右下角, 距离下边距 10 像素, 距离右边距 15 像素 $img->insert('images/watermark.png', 'bottom-right', 15, 10); // 将处理后的图片重新保存到其他路径 $img->save('images/new_avatar.jpg'); /* 上面的逻辑可以通过链式表达式搞定 */ $img = Image::make('images/avatar.jpg')->resize(200, 200)->insert('images/new_avatar.jpg', 'bottom-right', 15, 10);

4. 特色功能

除上文介绍的基本用法之外, 此扩展包还支持:

图片上传功能; 图片缓存功能; 图片过滤功能: 将图片按照统一规则进行转换; 图片动态处理: 根据访问图片的 URL 参数自动调整图片大小

更多的例子请移步 官方文档 参考.

intervention/image 中的一个小坑及其破解之法

事实上 intervention/iamge 用了很有些时日了,它的 api 设计得很简洁,文档也很全面,用起来相当顺手。

不过最近无意间发现了一个小坑。因为需要合成带微信头像的二维码,我使用 Image::make($avatarUrl) (这里的 $avatarUrl 是微信头像的链接)来产生头像,然后合成到二维码图像中去(还包括一些其它操作,比如使用模板背景、写入文字)。

写完之后一运行,发现相当慢,平均耗时 23 秒左右。起初以为是因为合成过程中进行的操作比较多、尺寸比较大,本来就应该是这个速度。不过后来闲下来,开始试着优化,即使不能提升速度,至少也搞清楚到底是什么原因这么耗时。

这一通折腾下来,发现真相竟然与合成操作的多少、尺寸没有多大关系。而关键在于我创建头像数据的姿势。

为了说明这个问题,特意写了下面的代码进行对比。

// 记录开始时间 $startTimestamp = microtime(true); $url = 'http://wx.qlogo.cn/mmopen/XxT9TiaJ1ibf06TNRCMjQADS4opDHvQLguLZHpqkRlvuJYZicvJW4iaOalPsKIs0kpZ3F6864ZzibyObYiaucUQSrdp4pFTNDyIpxw/0'; $avatar = \Image::make($url); // 记录结束时间 $endTimestamp = microtime(true); info($startTimestamp); info($endTimestamp); info($endTimestamp - $startTimestamp);

上面这段代码使用 Image::make($url) 的形式,直接从 url 生成头像。从记录的日志数据来看,耗时基本上在 16 秒左右。

后来,想到了一个新姿势,其实也就是在尝试优化的过程中折腾时想到的。见下面代码:

$startTimestamp = microtime(true); $client = new \GuzzleHttp\Client(); $url = 'http://wx.qlogo.cn/mmopen/XxT9TiaJ1ibf06TNRCMjQADS4opDHvQLguLZHpqkRlvuJYZicvJW4iaOalPsKIs0kpZ3F6864ZzibyObYiaucUQSrdp4pFTNDyIpxw/0'; $avatarResponse = $client->get($url); $avatar = \Image::make($avatarResponse->getBody()->getContents()); $endTimestamp = microtime(true); info($startTimestamp); info($endTimestamp); info($endTimestamp - $startTimestamp);

在这里我先使用 GuzzleHttp 获取头像,再使用 Image::make($data) 创建头像。

注意,要高潮了…… sunglasses

看看下面的日志截图,三次平均耗时在 0.07 秒左右,和前面的 16 秒相比,差了 200 多倍。

至于为什么会出现这种现象,自己也没搞清楚,但这无疑是一点比较有用且小众的经验。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

时间: 2024-08-02 12:55:10

Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解的相关文章

Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法

本文实例讲述了Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法.分享给大家供大家参考,具体如下: 1.简介 本扩展包添加了两个视图相关的Artisan命令到Laravel应用,以便我们通过Artisan命令即可创建和管理视图文件,可谓是进一步解放了生产力. 2.安装 还是通过Composer安装: composer require sven/artisan-view 安装完成后到config/app.php中注册服务提供者ArtisanViewServiceProv

Laravel 中通过 Artisan View 扩展包创建及删除应用视图文件

1.简介 本扩展包添加了两个视图相关的Artisan命令到Laravel应用,以便我们通过Artisan命令即可创建和管理视图文件,可谓是进一步解放了生产力. 2.安装 还是通过Composer安装: composer require sven/artisan-view 安装完成后到config/app.php中注册服务提供者ArtisanViewServiceProvider到providers数组: // config/app.php 'providers' => [     ...    

对盗图、盗文、盗墓深恶痛绝吗?PostgreSQL结合余弦、线性相关算法 在文本、图片、数组相似 等领域的应用 - 2 smlar插件详解

标签 PostgreSQL , 文本分析 , cosine , smlar , 相似性 , simlar , tf , idf , tf-idf , tag 背景 以2个例子作为开始, 例1 在数据库中有两条这样的记录 "I want a dog" // 狗 "I want a chihuahua" // 吉娃娃狗 然后使用这样的查询条件进行查询 "dog|chihuahua" 很显然,两条记录都会被匹配到,但是哪条记录应该排在前面呢? 例2 在

Laravel集成WordPress扩展包——Corcel

Corcel是一个可以适用于Laravel框架的集成Wordpress的扩展包,使用wordpress的后台发布文章,通过它的接口可以在Laravel中方便的调取文章等,试用了一下,安装和使用也非常简单. Corcel的Github地址:https://github.com/jgrossi/corcel 这里讲一下大概的过程,具体的安装和使用见github主页上的说明. 一.数据库迁徙 需要把Wordpress的数据库迁徙到Laravel的服务器上,也就是新建一个数据库,放wordpress的数

Laravel 5.1中进行自定义包开发的例子

1.安装Laravel 已安装Laravel的略过本步骤,未安装的参考Laravel安装文档:Laravel 5.1安装及配置 2.创建目录和服务提供者 在根目录下创建文件夹 packages/jai/contact/src 进入src目录并创建一个服务提供者ContactServiceprovider.php: <?php namespace Jai\Contact; use Illuminate\Support\ServiceProvider; use Illuminate\Routing\

280张新卡牌 《万智牌2014》扩展包即将发布

知名游戏厂商海岸巫师(Wizards of the Coast)在不久前出品了卡牌系列游戏<万智牌2014>(Magic 2014).一经发布,就在广大玩家.尤其是万智牌迷中产生了相当不错的反响.近日,海岸巫师借着这股势头,公布了<万智牌2014>扩展包的消息.此次的扩展包新增五个可玩的牌组.280张新卡牌和六场全新的单人对战.此外,还推出了全新的个人头像.成就.奖品和更多的解锁道具.海岸巫师目前尚未公布<万智牌2014>扩展包的具体发布时间,不过相信官方既然已经公布消

包含图片的jar包导出问题

问题描述 包含图片的jar包导出问题 麻烦各位大神, 我的JAVA程序,在MyEclipse里面是可以运行的, 但是作为jar包导出后,加载的图片资源都不见了. 代码如下: 然后我的图片资源路径是image这个文件夹, 关系如下: 请问我应该怎么改呢? 解决方案 问题描述: 在编写完Java程序后,打包成Jar时发布,会发现找不到Jar文件中的图片和文本文件,其原因是程序中载入图片或文本文件时,使用了以当前工作路径为基准的方式来指定文件和路径.这与用户运行Jar包时的当前工作路径并不一致. 问题

数据层扩展包EFCachingProvider 总结

  前不久学习了<EFCachingProvider>,该扩展包不但可以用于EntityFramework的扩展,所有与数据库连接相关的应用程序都可以使用类似的方案进行扩展.今天做个小的总结,以方便以后回顾.   总体描述     关于EFCachingProvider是什么及如何使用它,请看园子的这篇文章:< Entity Framework 缓存处理与日志监控 >.我主要说一下内部代码实现的原理机制.     园子文章的图中,画出了EFCachingProvider所扩展的位置

c++-用C++程序处理数据,并根据处理结果出动画,需要用什么配合的软件或者扩展包比较简单?

问题描述 用C++程序处理数据,并根据处理结果出动画,需要用什么配合的软件或者扩展包比较简单? 用C++程序处理数据,大概是些坐标啊什么的,然后根据处理后的结果,结合载入的open street map 地图,画出一段时间的移动轨迹,这个需要的基于时间线的二维动画技术,用什么配合VC好呢? 是软件?还是扩展程序包什么的? 能说的更详细点就好啦! 谢谢! 解决方案 如果是偏向数学,用matlab更好,偏向图形,那就用opengl,gdiplus 解决方案二: 推荐使用opencv吧,动画可以用op