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 相关文章推荐
开源SNS系统-ThinkSNS
May 18 PHP
五款常用mysql slow log分析工具的比较分析
May 22 PHP
实测在class的function中include的文件中非php的global全局环境
Jul 15 PHP
php获取文件夹路径内的图片以及分页显示示例
Mar 11 PHP
可以保证单词完整性的PHP英文字符串截取代码分享
Jul 15 PHP
php防止恶意刷新与刷票的方法
Nov 21 PHP
php两种无限分类方法实例
Apr 21 PHP
ThinkPHP在Cli模式下使用模板引擎的方法
Sep 25 PHP
PHP使用curl模拟post上传及接收文件的方法
Mar 04 PHP
php版阿里大于(阿里大鱼)短信发送实例详解
Nov 30 PHP
PHP使用mysqli操作MySQL数据库的简单方法
Feb 04 PHP
PHP性能测试工具xhprof安装与使用方法详解
Apr 29 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绘制饼状图的实现代码
2013/06/07 PHP
PHP中addslashes与mysql_escape_string的区别分析
2016/04/25 PHP
php判断手机浏览还是web浏览,并执行相应的动作简单实例
2016/07/28 PHP
使用POST方式弹出窗口的两种方法示例介绍
2014/01/29 Javascript
深入理解JavaScript系列(29):设计模式之装饰者模式详解
2015/03/03 Javascript
jQuery插件实现大图全屏图片相册
2015/03/14 Javascript
JavaScript程序中的流程控制语句用法总结
2016/05/23 Javascript
微信小程序 location API接口详解及实例代码
2016/10/12 Javascript
js编写的treeview使用方法
2016/11/11 Javascript
jQuery操作复选框(CheckBox)的取值赋值实现代码
2017/01/10 Javascript
浅谈react.js 之 批量添加与删除功能
2017/04/17 Javascript
JS实现百度搜索接口及链接功能实例代码
2018/02/02 Javascript
JS实现json对象数组按对象属性排序操作示例
2018/05/18 Javascript
vue awesome swiper异步加载数据出现的bug问题
2018/07/03 Javascript
JavaScript实现的反序列化json字符串操作示例
2018/07/18 Javascript
jQuery实现的自定义轮播图功能详解
2018/12/28 jQuery
layui 弹出删除确认界面的实例
2019/09/06 Javascript
Vue组件化开发之通用型弹出框的实现
2020/02/28 Javascript
springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)
2020/10/15 Javascript
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
JSON Web Tokens的实现原理
2017/04/02 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
2019/01/04 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
2019/08/12 Python
Python写捕鱼达人的游戏实现
2020/03/31 Python
浅析Python 中的 WSGI 接口和 WSGI 服务的运行
2020/12/09 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
利用Node实现HTML5离线存储的方法
2020/10/16 HTML / CSS
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
Aosom西班牙:家具在线商店
2020/06/11 全球购物
J2EE面试题
2016/03/14 面试题
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
师范毕业生自我鉴定
2014/01/15 职场文书
心理学专业求职信
2014/06/16 职场文书
村级个人对照检查材料
2014/08/22 职场文书
使用SQL实现车流量的计算的示例代码
2022/02/28 SQL Server