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 相关文章推荐
第十节--抽象方法和抽象类
Nov 16 PHP
PHP iconv 函数转gb2312的bug解决方法
Oct 11 PHP
PHP 批量删除数据的方法分析
Oct 30 PHP
PHP 开发环境配置(Zend Studio)
Apr 28 PHP
php excel类 phpExcel使用方法介绍
Aug 21 PHP
PHP实现的sqlite数据库连接类
Dec 12 PHP
php定义一个参数带有默认值的函数实例分析
Mar 16 PHP
PHP中的静态变量及static静态变量使用详解
Nov 05 PHP
php 删除指定文件夹的实例讲解
Jul 25 PHP
PHP实现根据数组某个键值大小进行排序的方法
Mar 13 PHP
PHP设计模式之适配器模式定义与用法详解
Apr 03 PHP
PDO::prepare讲解
Jan 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
全国FM电台频率大全 - 10 江苏省
2020/03/11 无线电
php设计模式 Template (模板模式)
2011/06/26 PHP
开启PHP的伪静态模式
2015/12/31 PHP
PHP如何根据文件头检测文件类型实例代码
2018/10/14 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
JS 打印界面的CSS居中代码适用所有浏览器
2014/03/19 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
JavaScript判断文件上传类型的方法
2014/09/02 Javascript
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
JavaScript中apply方法的应用技巧小结
2016/09/29 Javascript
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
2017/06/11 jQuery
Javascript(es2016) import和require用法和区别详解
2017/08/11 Javascript
AngularJS基于http请求实现下载php生成的excel文件功能示例
2018/01/23 Javascript
详解如何使用node.js的开发框架express创建一个web应用
2018/12/20 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
2019/04/17 Javascript
使用webpack4编译并压缩ES6代码的方法示例
2019/04/24 Javascript
vue slot与传参实例代码讲解
2019/04/28 Javascript
jsonp跨域获取百度联想词的方法分析
2019/05/13 Javascript
Vue2.x通用编辑组件的封装及应用详解
2019/05/28 Javascript
微信小程序图片左右摆动效果详解
2019/07/13 Javascript
vue中使用router全局守卫实现页面拦截的示例
2020/10/23 Javascript
[01:48:04]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第一场 2月7日
2021/03/11 DOTA
使用python脚本实现查询火车票工具
2018/07/19 Python
对python产生随机的二维数组实例详解
2018/12/13 Python
Python通过2种方法输出带颜色字体
2020/03/02 Python
欧洲最大的球衣网上商店:Kitbag
2017/11/11 全球购物
娱乐地球:Entertainment Earth
2020/01/08 全球购物
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
如果让你测试一台高速激光打印机,你都会进行哪些测试
2012/12/04 面试题
描述JSP和Servlet的区别、共同点、各自应用的范围
2012/10/02 面试题
《美丽的小兴安岭》教学反思
2014/02/26 职场文书
住宅使用说明书
2014/05/09 职场文书
交通事故赔偿协议书
2014/10/16 职场文书
综治维稳工作汇报
2014/10/27 职场文书
学雷锋感言
2015/08/03 职场文书
MySQL对数据表已有表进行分区表的实现
2021/11/01 MySQL