请选择 进入手机版 | 继续访问电脑版
收藏本站腾讯微博新浪微博
点点网模板设计大赛 phpchina

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 用悬赏 三天解决问题 解决访问速度慢 论坛支持农历生日 - 给官方提建议

论坛活动及任务 归纳网站最新活动 地图任务 邮件更新任务:保护帐号安全

积分换实物,来参加蓝色理想积分兑换吧! 联系招聘客服 蓝色理想帮你找工作! 万元奖励等你拿——点点网模板设计大赛

查看: 4302|回复: 4

[php] 用ImageMagick生成中央区域的缩略图 [复制链接]

hqlulu 楼主

阿权

钻石会员

帖子
1959
体力
6564
威望
59
发表于 2008-8-15 00:01:36 |显示全部楼层
一直听说ImageMagick,但今天因为需要做一个缩略图,所以特意了解一下ImageMagick。

ImageMagick,可以作为PHP的dll使用,也可以用命令行的方式调用。有windows和linux等各个平台的版本,所以要用起来真的是非常方便!不作为PHP的dll,也可以通过exec调用,那更加的不错,对于喜欢命令行做处理的人,那是相当的方便。

刚开始就想着投入到各个参数的了解当中,一片的英文,搞的我头晕,看来强硬的英文水平是做技术的一个前提了,呵呵。

我想做的就是一个事情,把图片做缩略图,关键是等比缩小,取中间的部分作为图片文件。于是刚刚开始就想着看看有哪些参数是干嘛的,ImageMagick提供太多的功能了,以至于我这类人要了解完还真难,了解了几个关键参数 -resize -crop,但用这个一步做不出图片来,而且在windows下面还有部分命令有点问题,比如输入:

convert aslibra.com.jpg -resize 100x100^ www.aslibra.com.jpg

没有得到如期的效果,应该是每个边都大于100,后来知道是需要用引号括起来,windows下还必须是双引号,但是第一阶段做了个读取图片宽高,实现该功能的函数:

  1. //by hqlulu @ www.aslibra.com
  2. function img_resize($file,$output,$w=0,$h=0,$method="resize",$center=true){

  3.   if(!$w && !$h)return false;

  4.   $tmp_file = "tmp_resize.jpg";
  5.   if($method == "crop"){
  6.     if($center){
  7.       //先调整大小
  8.       $wh = getimagesize($file);

  9.       if(!$wh[0] || !$wh[1])return false;
  10.       if(!$w || !$h)return false;
  11.       
  12.       if($wh[0]/$wh[1] >= $w/$h){
  13.         img_resize($file,$tmp_file,0,$h);
  14.       }else{
  15.         img_resize($file,$tmp_file,$w,0);
  16.       }
  17.       $file = $tmp_file;
  18.     }
  19.     $c = " -gravity Center ";
  20.     $m = " $c -$method {$w}x{$h}+0+0 ";
  21.   }else{
  22.     if($w && $h){
  23.       $m = " -$method {$w}x{$h} ";
  24.     }else if($w && !$h){
  25.       $m = " -$method {$w} ";
  26.     }else if(!$w && $h){
  27.       $m = " -$method x{$h} ";
  28.     }
  29.   }
  30.   $cmd = "convert $file $m $output";
  31.   exec($cmd,$out);
  32. }
复制代码


后来看了一下usage,里面有很多很多的示例,太棒了,简直一个photoshop的教程:
http://www.imagemagick.org/Usage/

也发现了前面不能实现的功能的原因,同时发现了一句话完成我的需求的方法:

  1. convert www.aslibra.com.jpg  -thumbnail "100x100^" -gravity center -extent 100x100  center.gif
复制代码


函数可以精简一下了,并且可以加上一个缩略图的截取部分的比例:


  1. function img_resize($file,$output,$w=0,$h=0,$method="resize",$percent=0){

  2. // == usage ==
  3. //resize by w : img_resize($file,$output,100)
  4. //resize by h : img_resize($file,$output,0,100)
  5. //resize by w&h : img_resize($file,$output,100,100)
  6. //crop by w&h : img_resize($file,$output,100,100,'crop')
  7. //crop by w&h&percent : img_resize($file,$output,100,100,'crop',0.8)
  8. //
  9. //2008-8-14
  10. //by hqlulu
  11. //www.aslibra.com
  12. //
  13.   if(!$w && !$h)return false;

  14.   if($method == "crop"){
  15.     if($percent){
  16.       $w1=intval($w/$percent);
  17.       $h1=intval($h/$percent);
  18.       $m = " -thumbnail \"{$w1}x{$h1}^\" -gravity center -extent {$w}x{$h} ";
  19.     }else{
  20.       $m = " -thumbnail \"{$w}x{$h}^\" -gravity center -extent {$w}x{$h} ";
  21.     }
  22.   }else{
  23.     if($w && $h){
  24.       $m = " -$method {$w}x{$h} ";
  25.     }else if($w && !$h){
  26.       $m = " -$method {$w} ";
  27.     }else if(!$w && $h){
  28.       $m = " -$method x{$h} ";
  29.     }
  30.   }
  31.   $cmd = "convert $file $m $output";
  32.   exec($cmd,$out);
  33. }
复制代码


另外,如果有可能处理CMYK的图片,那可以做个强制颜色空间的参数
-colorspace RGB

这个功能就完成了!
已有 1 人评分威望 收起 理由
蓝色 + 2 我很赞同

总评分: 威望 + 2   查看全部评分

阿权的书房:摄影/杂记/PHP/Linux
http://www.asLibra.com
西部数码顶级域名注册商39元抢注!
hqlulu 楼主

阿权

钻石会员

帖子
1959
体力
6564
威望
59
发表于 2008-8-15 00:09:40 |显示全部楼层
以下是原图和每个命令方式对应的结果:



convert 0.jpg -resize 100 1.jpg



convert 0.jpg -resize x100 2.jpg



convert 0.jpg -resize 100x100 3.jpg



convert 0.jpg  -thumbnail "100x100^" -gravity center -extent 100x100  4.jpg



convert 0.jpg  -thumbnail "150x150^" -gravity center -extent 100x100  5.jpg

附件: 你需要登录才可以下载或查看附件。没有帐号?注册
阿权的书房:摄影/杂记/PHP/Linux
http://www.asLibra.com
租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

修行的魔法师

金牌会员

帖子
1527
体力
3049
威望
4
发表于 2008-8-15 08:21:22 |显示全部楼层
Good, 楼主很有研究精神
修行的魔法师

使用道具 举报

罗亮

超级版主 手机认证 

帖子
15895
体力
19488
威望
19
居住地
北京市 海淀区
发表于 2008-8-15 09:12:04 |显示全部楼层
做perl时用过ImageMagick包来生成缩略图..

使用道具 举报

qhwa 

水蓝色青蛙

荣誉管理 手机认证 

帖子
4509
体力
19737
威望
78
居住地
浙江省 杭州市
发表于 2008-9-17 15:13:21 |显示全部楼层
学习了,之前也想用imagemagick做这个功能,没摸索出来
blog: Flashlight (q.pnq.cc)

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|安久科技提供CDN|blueidea.com ( 京ICP备05002321号 )  

GMT+8, 2012-2-13 09:51 , Processed in 0.079353 second(s), 9 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部