打印

[php] 用ImageMagick生成中央区域的缩略图

一直听说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下还必须是双引号,但是第一阶段做了个读取图片宽高,实现该功能的函数:
复制内容到剪贴板
代码:
//by hqlulu @ www.aslibra.com
function img_resize($file,$output,$w=0,$h=0,$method="resize",$center=true){
  if(!$w && !$h)return false;
  $tmp_file = "tmp_resize.jpg";
  if($method == "crop"){
    if($center){
      //先调整大小
      $wh = getimagesize($file);
      if(!$wh[0] || !$wh[1])return false;
      if(!$w || !$h)return false;
      
      if($wh[0]/$wh[1] >= $w/$h){
        img_resize($file,$tmp_file,0,$h);
      }else{
        img_resize($file,$tmp_file,$w,0);
      }
      $file = $tmp_file;
    }
    $c = " -gravity Center ";
    $m = " $c -$method {$w}x{$h}+0+0 ";
  }else{
    if($w && $h){
      $m = " -$method {$w}x{$h} ";
    }else if($w && !$h){
      $m = " -$method {$w} ";
    }else if(!$w && $h){
      $m = " -$method x{$h} ";
    }
  }
  $cmd = "convert $file $m $output";
  exec($cmd,$out);
}
后来看了一下usage,里面有很多很多的示例,太棒了,简直一个photoshop的教程:
http://www.imagemagick.org/Usage/

也发现了前面不能实现的功能的原因,同时发现了一句话完成我的需求的方法:
复制内容到剪贴板
代码:
convert www.aslibra.com.jpg  -thumbnail "100x100^" -gravity center -extent 100x100  center.gif
函数可以精简一下了,并且可以加上一个缩略图的截取部分的比例:
复制内容到剪贴板
代码:
function img_resize($file,$output,$w=0,$h=0,$method="resize",$percent=0){
// == usage ==
//resize by w : img_resize($file,$output,100)
//resize by h : img_resize($file,$output,0,100)
//resize by w&h : img_resize($file,$output,100,100)
//crop by w&h : img_resize($file,$output,100,100,'crop')
//crop by w&h&percent : img_resize($file,$output,100,100,'crop',0.8)
//
//2008-8-14
//by hqlulu
//www.aslibra.com
//
  if(!$w && !$h)return false;
  if($method == "crop"){
    if($percent){
      $w1=intval($w/$percent);
      $h1=intval($h/$percent);
      $m = " -thumbnail \"{$w1}x{$h1}^\" -gravity center -extent {$w}x{$h} ";
    }else{
      $m = " -thumbnail \"{$w}x{$h}^\" -gravity center -extent {$w}x{$h} ";
    }
  }else{
    if($w && $h){
      $m = " -$method {$w}x{$h} ";
    }else if($w && !$h){
      $m = " -$method {$w} ";
    }else if(!$w && $h){
      $m = " -$method x{$h} ";
    }
  }
  $cmd = "convert $file $m $output";
  exec($cmd,$out);
}
另外,如果有可能处理CMYK的图片,那可以做个强制颜色空间的参数
-colorspace RGB

这个功能就完成了!
本帖最近评分记录
  • 蓝色 威望 +2 我很赞同 2008-8-15 14:22
阿权的书房:摄影/杂记/PHP/Flash
http://AsLibra.com
以下是原图和每个命令方式对应的结果:



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/Flash
http://AsLibra.com
Good, 楼主很有研究精神
修行的魔法师
做perl时用过ImageMagick包来生成缩略图..
银子博客
经典站长QQ群:16719484
第三届经典论坛灌水王选举(12月1日-12月31日) 敬请期待

TOP

还在为头像烦恼?还在为不能关注好友动态烦忧?快来蓝色理想家园吧!
学习了,之前也想用imagemagick做这个功能,没摸索出来
pnq.cc - 可爱的、好玩的
blog: Flashlight (q.pnq.cc)

TOP