imagemagick根据请求生成大小缩略图

安装JPG,PNG开发包

apt-get install libjpeg62-dev libpng12-dev libtiff4-dev

安装ImageMagick和imagick

XML/HTML代码
  1. tar zxvf ImageMagick.tar.gz   
  2. cd ImageMagick-6.5.1-2/   
  3. ./configure   
  4. make   
  5. make install   
  6. cd ../   
  7.   
  8. tar zxvf imagick-2.3.0.tgz   
  9. cd imagick-2.3.0/   
  10. /usr/local/webserver/php/bin/phpize   
  11. ./configure --with-php-config=/usr/local/webserver/php/bin/php-config   
  12. make   
  13. make install   
  14. cd ../  

如果:no decode delegate for this image format
安装:apt-get install libjpeg62-dev libpng12-dev libtiff4-dev后再重新安装ImageMagick和imagick

如果:libMagickCore.so.5: cannot open shared object file
执行命令:ldconfig /usr/local/lib

修改php.ini
extension = "imagick.so"

重启php-fpm
/etc/init.d/php5-fpm restart

增加rewrite
rewrite ^/uploads/(.*)\.(.*)$ /img.php last;

重启nignx
nginx -s reload

增加img.php代码处理

PHP代码
  1. <?php   
  2.     
  3. /*
  4.         A  thumbnail creation.  
  5. */    
  6.     
  7. /* Create the Imagick object */  
  8. $img = $_SERVER['REQUEST_URI'];   
  9.   
  10.   
  11. define('DEDEROOT'str_replace("\\", '/', dirname(__FILE__) ) );
  12. preg_match("/(.*)_(\d+)_(\d+)\.(\w+)/is",$img,$match);  
  13.  
  14. $getWidth = $match[2];  
  15. $getHeight = $match[3];  
  16. $normalImg = DEDEROOT. $match[1].".".$match[4];  
  17. $smallImg = DEDEROOT. $match[0];  
  18. $im = new Imagick();  
  19.  
  20. if (!$match[4] || !file_exists($normalImg)) {  
  21.         $normalImg =  DEDEROOT. $img;  
  22.         if (!file_exists($normalImg)) {  
  23.                 //没有图片  
  24.                 header("HTTP/1.1 404 Not Found");  
  25.                 exit;  
  26.         }  
  27.         //使用原图  
  28.         $im->readImage( $normalImg);  
  29.         header( "Content-Type: image/{$im->getImageFormat()}" );  
  30.         echo $im->getImageBlob();  
  31.         $im->destroy();  
  32.         exit;  
  33. }  
  34. /* Read the image file */  
  35. $im->readImage( $normalImg);  
  36.  
  37. if ($getWidth && $getHeight) {  
  38.         $srcWH = $im->getImageGeometry();   
  39.             
  40.         $rate_w  = $getWidth / $srcWH['width'];  
  41.         $rate_h  = $getHeight / $srcWH['height'];  
  42.    
  43.         $rate    = ($rate_w > $rate_h) ? $rate_w : $rate_h;  
  44.         $rate = $rate > 1 ? 1 : $rate;  
  45.         $thumb_w = round($srcWH['width'] * $rate);  
  46.         $thumb_h = round($srcWH['height'] * $rate);  
  47.         //缩略   
  48.         $im->thumbnailImage( $thumb_w, $thumb_h );  
  49.         if ($thumb_w>$getWidth || $thumb_h>$getHeight) {  
  50.                 $fromX = ($thumb_w-$getWidth)/2;  
  51.                 //剪切  
  52.                 $im->cropImage($getWidth, $getHeight,$fromX,0);  
  53.         }  
  54. } elseif ($getWidth && !$getHeight) {  
  55.         $im->thumbnailImage( $getWidth, null);  
  56. } elseif (!$getWidth && $getHeight) {  
  57.         $im->thumbnailImage(null, $getHeight );  
  58. }  
  59.  
  60. /* Write the thumbail to disk */  
  61. $im->writeImage($smallImg);  
  62.    
  63.  
  64. header( "Content-Type: image/{$im->getImageFormat()}" );   
  65. echo $im->getImageBlob();   
  66.   
  67. /* Free resources associated to the Imagick object */  
  68. $im->destroy();   
  69.     
  70. ?>  

 

优化:

nginx的rewrite时可以做个判断,如果已经有生成的图片则直接显示。不用再到php里处理。

if (!-f $request_filename) {
     rewrite ^/uploads/(.*)\.(.*)$ /img.php last;
}

参考:

http://www.digitalsanctum.com/2009/03/18/installing-imagemagick-from-source-on-ubuntu-804/
http://bootpolish.net/home_howto_installimagemagick
http://wenku.baidu.com/view/2e93f278168884868762d689.html
http://apps.hi.baidu.com/share/detail/37348887
http://hi.baidu.com/houwenbin1986/blog/item/a0afa1fa3adcad294e4aea48.html
http://www.zhouchen33.com/index.php/archives/284

Tags: nginx , imagick , imagemagick

上一篇: linux利器strace命令用法   下一篇: dedecms Coreseek实现全文搜索

提交疑问

回顶部