php下尝试使用GraphicsMagick的缩略图功能


Posted in PHP onJanuary 01, 2011

常用的图片处理工具有GD,ImageMagick,GraphicsMagick等等。GD就是个阿斗,略过不提;ImageMagick是目前最流行的图片处理工具,它的功能非常丰富;GraphicsMagick的功能略逊于ImageMagick,但是它的效率更强悍,就好比Apache和Nginx一样,一个功能更强,一个效率更胜。

现在更看重效率,所以本文就以GraphicsMagick为例来说说:

对于PHPer来说,有两种使用GraphicsMagick的方式:

1:使用PECL Gmagick扩展。
2:使用GraphicsMagick命令行。

PECL扩展的方式我并不喜欢,一来PECL代码Bug多多,二来PECL扩展的实现,代码写起来很罗嗦:比如缩放一个GIF动画图片,如果你用命令行的方式,一句话就搞定,而用PECL扩展的话,还得先算动画有几帧,再循环处理,很麻烦。所以说我更倾向于使用命令行的方式,虽然命令行操作听起来很“重”,但如果建立若干台图片服务器,通过Gearman连接起来,其实很是很有弹性的。

下面我们就以GraphicsMagick为例,采用命令行的方式来看看如何使用缩略图功能:

先上一个原始图片(input.jpg:160x120),以后的各个例子都会用到它:

php下尝试使用GraphicsMagick的缩略图功能

BTW:列位看官现在可以咽口水了。

缩略图1

gm convert input.jpg -thumbnail '100x100' output_1.jpg

php下尝试使用GraphicsMagick的缩略图功能

实际生成的图片大小是:100x75,也就是说说按此命令,会保持图片比例不变生成缩略图。这样很不错,但是有一个潜在的问题:我们不能简单明了的知道图片的最终大小,结果是前端显示的时候,无法设置img标签的width和height属性,如果我没记错的话,一般是推荐设定width和height属性的,否则浏览器渲染起来可能会稍稍慢一点。

缩略图2

gm convert input.jpg -thumbnail '100x100!' output_2.jpg

php下尝试使用GraphicsMagick的缩略图功能

这次实际生成的图片大小按定义来,但图片变形了,有时候这是不能接受的。

缩略图3

gm convert input.jpg -thumbnail '100x100^' \
-gravity center -extent 100x100 output_3.jpg

php下尝试使用GraphicsMagick的缩略图功能

这次不仅保证了大小,还保证了比例。不过图片经过了裁剪。

缩略图4

gm convert input.jpg -thumbnail '100x100' \
-background gray -gravity center -extent 100x100 output_4.jpg

php下尝试使用GraphicsMagick的缩略图功能

这次不仅保证了大小,还保证了比例,同时没有对图片进行任何裁剪,多余的部分按指定颜色进行填充。

缩略图5

gm convert input.jpg -thumbnail '10000@' \
-background gray -gravity center -extent 100x100 output_5.jpg

php下尝试使用GraphicsMagick的缩略图功能

这次保证了大小和比例,其中的10000就是100x100的乘积,同时在填充和裁剪之间做了一个平衡。

明白了以上几个例子,缩略图基本就能通吃了,肯定有一种会适合你的需求。GraphicsMagick的资料非常少,但好消息是GraphicsMagick和ImageMagick的用法基本兼容,所以你可以通过ImageMagick的资料来套用。

补充:如果想让用户手动裁剪头片的话,imgAreaSelect是个好选择。

PHP 相关文章推荐
php Mysql日期和时间函数集合
Nov 16 PHP
PHP容易被忽略而出错陷阱 数字与字符串比较
Nov 10 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
Jun 19 PHP
兼容PHP和Java的des加密解密代码分享
Jun 26 PHP
PHP里8个鲜为人知的安全函数分析
Dec 09 PHP
PHP结合Jquery和ajax实现瀑布流特效
Jan 07 PHP
php有效防止图片盗用、盗链的两种方法
Nov 01 PHP
详解Yii2 定制表单输入字段的标签和样式
Jan 04 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
Nov 22 PHP
php基于 swoole 实现的异步处理任务功能示例
Aug 13 PHP
Laravel 登录后清空COOKIE的操作方法
Oct 14 PHP
Laravel 5.5 实现禁用用户注册示例
Oct 24 PHP
PHP读取XML值的代码(推荐)
Jan 01 #PHP
PHP中simplexml_load_string函数使用说明
Jan 01 #PHP
php xml 入门学习资料
Jan 01 #PHP
PHP+SQL 注入攻击的技术实现以及预防办法
Dec 29 #PHP
解决PHP在DOS命令行下却无法链接MySQL的技术笔记
Dec 29 #PHP
window+nginx+php环境配置 附配置搭配说明
Dec 29 #PHP
php防攻击代码升级版
Dec 29 #PHP
You might like
php mysql索引问题
2008/06/07 PHP
php 模拟 asp.net webFrom 按钮提交事件的思路及代码
2013/12/02 PHP
php计算两个坐标(经度,纬度)之间距离的方法
2015/04/17 PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
2016/03/11 PHP
Linux下编译redis和phpredis的方法
2016/04/07 PHP
ThinkPHP实现生成和校验验证码功能
2017/04/28 PHP
详解PHP队列的实现
2019/03/14 PHP
jQuery实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
2010/03/21 Javascript
JS获取页面窗口大小的代码解读
2011/12/01 Javascript
JavaScript打字小游戏代码
2011/12/26 Javascript
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
2015/08/27 Javascript
jQuery模拟物体自由落体运动(附演示与demo源码下载)
2016/01/21 Javascript
js调用webservice构造SOAP进行身份验证
2016/04/27 Javascript
Js操作DOM元素及获取浏览器高宽的简单方法
2016/09/08 Javascript
基于Vue实现支持按周切换的日历
2020/09/24 Javascript
node 命令方式启动修改端口的方法
2018/05/12 Javascript
详解如何使用webpack打包JS
2018/06/21 Javascript
微信小程序实现横向增长表格的方法
2018/07/24 Javascript
vue实例中data使用return包裹的方法
2018/08/27 Javascript
生产制造追溯系统之再说条码打印
2019/06/03 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
Python中IPYTHON入门实例
2015/05/11 Python
pandas通过索引进行排序的示例
2018/11/16 Python
opencv 查找连通区域 最大面积实例
2020/06/04 Python
numpy 矩阵形状调整:拉伸、变成一位数组的实例
2020/06/18 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
Viking Direct爱尔兰:办公用品和家具
2019/11/21 全球购物
如何手工释放资源
2013/12/15 面试题
轻金属冶金专业毕业生自荐信
2013/11/02 职场文书
老公保证书范文
2014/04/29 职场文书
国旗下的讲话演讲稿
2014/05/08 职场文书
上课随便讲话检讨书
2014/09/12 职场文书
小学校园广播稿
2015/08/18 职场文书
gateway网关接口请求的校验方式
2021/07/15 Java/Android
一篇文章告诉你如何实现Vue前端分页和后端分页
2022/02/18 Vue.js