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

2015-01-24信息快讯网

现在,对一个Web程序员来说,图像处理已经属于必会知识之一了。且不说Flickr,Yupoo等专业图片分享网站,就算是一个和图片分享不沾边的网站,也会用到很多图片处理的功能,比如说:用户上传头像,然后自动生成缩略图。

常用的图片处理工具有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是个好选择。
iis下php mail函数的sendmail配置方法(官方推荐)
Notice: Trying to get property of non-object problem(PHP)解决办法
smarty巧妙处理iframe中内容页的代码
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
JS中encodeURIComponent函数用php解码的代码
phpmail类发送邮件函数代码
PHP类的静态(static)方法和静态(static)变量使用介绍
用phpmailer实现简单openvpn用户认证的实现代码
PHP异步调用socket实现代码
Trying to clone an uncloneable object of class Imagic的解决方法
php fsockopen中多线程问题的解决办法[翻译]
php空间不支持socket但支持curl时recaptcha的用法
php获取远程图片的两种 CURL方式和sockets方式获取远程图片
防止本地用户用fsockopen DDOS攻击对策
提示Trying to clone an uncloneable object of class Imagic的解决
php中使用Imagick实现图像直方图的实现代码
Php Image Resize图片大小调整的函数代码
php实现无限级分类实现代码(递归方法)
PHP读取XML值的代码(推荐)
php iconv() : Detected an illegal character in input string
smarty模板嵌套之include与fetch性能测试
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
php下使用iconv需要注意的问题
Notice: Undefined index: page in E:\PHP\test.php on line 14
smarty中先strip_tags过滤html标签后truncate截取文章运用
PHP类中Static方法效率测试代码
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
用PHP将数据导入到Foxmail的实现代码
php Notice: Undefined index 错误提示解决方法
php checkbox 取值详细说明
php set_magic_quotes_runtime() 函数过时解决方法
php select,radio和checkbox默认选择的实现方法
php checkbox复选框值的获取与checkbox默认值输出方法
php imagecreatetruecolor 创建高清和透明图片代码小结
php getimagesize 上传图片的长度和宽度检测代码
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
PHP Socket 编程
©2014-2024 dbsqp.com