php gmagick 安装 类库

公司要改版图片生成形式,觉得原先用GD2做效率不高,想换成gmagick,用1mb的图生成100张图,试验了一下,发现gmagick的生成效率跟GD2不是一个数量级的,gmagick确实相当地快,但在压缩上面不太给力,质量提到90以上所占物理空间有时候比原图还要大,GraphicsMagick可以再绝大多数的平台上使用,Linux、Mac、Windows都没有问题。GraphicsMagick支持大图片的处理,并且已经做过GB级别的图像处理实验。为了work,最近学习了下,做下Note:

Ubuntu下安装方式:

//先安装开发包
sudo apt-get install graphicsmagick libgraphicsmagick1-dev

//beta版
sudo pecl install gmagick-beta
或者
//stable版
sudo pecl install gmagick

pecl安装软件时候phpize: command not found的解决办法
sh: phpize: command not found
ERROR: ‘phpize’ failed
解决方案: apt-get install php5-dev

//安装过程中可能会提示你输入prefix(即安装路径). 填写一个路径即可,我这里填写的 ‘/opt/local’

//要支持jpeg和png的话,请确保安装了libJPEG和libPNG

//不要忘记在php.ini中加入:
extension=gmagick.so

安装完成重启php.使用phpinfo()探针看到有gmagick的扩展即安装成功

编译安装方式请参考:
http://www.cnblogs.com/cocowool/archive/2010/08/16/1800954.html

Window下面的安装方式:

目前只在php5.3.8线程安全版中测试成功
到官网去下载php_gmagick_ts.dll(注意下载线程安全版的哦):
http://valokuva.org/builds/
放到php目录下的ext中。
打开php.ini加上扩展:
extension=php_gmagick_ts.dll
然后重启web服务器即可!

解决GraphicsMagick 和 ImageMagick冲突(PHP imagick and gmagick extension)

发现PHP imagick or magickwand无法正确加载. 经过测试发现是由于和gmagick冲突. 解决, 在编译GraphicsMagick时候加入: –enable-symbol-prefix 重新编译后正常.

官方文档:
http://pecl.php.net/package/gmagick
http://docs.php.net/manual/zh/book.gmagick.php
http://www.graphicsmagick.org

gmagick缩略图命令行处理方式:
http://www.cnblogs.com/waw/archive/2011/09/02/2164172.html

对比Imagick和Gmagick的像素迭代功能
http://huoding.com/2010/10/17/9
应用实例(自己封装的一个类,方便生成缩略图)

/*
 * Created on 2011-11-1
 *
 * $gmagick = new Gmagick_handler();
 * $gmagick->make_thumb("images/1.jpg",200,300,true,80,"newimage/1.jpg");
 *
 *
 */
 class Gmagick_handler{


  var $fillcolor = "#FFFFFF";


  function __construct()
     {


     }


  /**
  *
  *@param  $img:源图片地址; $path: 生成图片路径; $thumb_width: 最终宽度; $thumb_height: 最终高度; $crop: 是否裁剪,默认为否.$quality为生成图片的压缩质量; $path为生成文件的路径(不包括文件名)
  *@return 创建成功返回生成的文件名,否则返回false
  */
  function make_thumb($img,$thumb_width = 0, $thumb_height = 0,$crop=false,$quality=90,$path = ''){


  /* 检查缩略图宽度和高度是否合法 */
        if ($thumb_width == 0 && $thumb_height == 0)
        {
        throw new Exception("width and height Invalid!");
            return false;
        }


  /* 检查原始文件是否存在及获得原始文件的信息 */
        $org_info = @getimagesize($img);
        if (!$org_info)
         {
throw new Exception("image not exists");
            return false;
         }


  /* 创建当月目录 */
        if (empty($path))
        {
            $dir = 'images/' . date('Ym').'/';
        }
        else
        {
            $dir = $path;
        }


/* 如果目标目录不存在,则创建它 */
        if (!file_exists($dir))
         {
            if (!$this->make_dir($dir))
            {
                /* 创建目录失败 */
                throw new Exception("directory readonly");
                return false;
            }
         }


        /* 如果文件名为空,生成不重名随机文件名 */
        $filename = $this->unique_name($dir);


        $filename .= '.jpg';


try{


$gmagick = new Gmagick($img);


if($crop == false){


$canvas = new Gmagick();
$canvas->newimage($thumb_width,$thumb_height,$this->fillcolor,'jpeg');


$gmagick->scaleimage($thumb_width,$thumb_height,true);
/* 取得缩图的实际大小 */
$gw = $gmagick->getimagewidth();
$gh = $gmagick->getimageheight();  


$x = ( $thumb_width - $gw) / 2;
$y = ( $thumb_height - $gh ) / 2;
$tempgmagick = $gmagick;


$gmagick = $canvas->compositeimage($gmagick,Gmagick::COMPOSITE_OVER,$x,$y);


}else{


$gmagick->cropthumbnailimage($thumb_width,$thumb_height);


}
$gmagick->setCompressionQuality($quality);
$gmagick->write($dir . $filename);
$gmagick->destroy();


if($canvas != null){


$canvas->destroy();
$tempgmagick->destroy();
}


//确认文件是否生成
      if (file_exists($dir . $filename))
       {
           return $dir. $filename;
       }
      else
       {
             //生成图片失败!
           throw new Exception("create image error!");
           return false;
       }


}catch(Exception $e){


throw new Exception($e);
return false;


}


  }


  /**
      *  生成指定目录不重名的文件名
      *
     * @access  public
     * @param   string      $dir        要检查是否有同名文件的目录
      *
     * @return  string      文件名
     */
    function unique_name($dir)
    {
        $filename = '';


        while (empty($filename))
         {


            $filename = $this->random_filename();


            if (file_exists($dir . $filename . '.jpg') || file_exists($dir . $filename . '.gif') || file_exists($dir . $filename . '.png'))
            {
                $filename = '';
            }
         }


        return $filename;
    }


  /**
     * 生成随机的数字串
     *
     * @return string
     */
    function random_filename()
    {


        $str = '';
        for($i = 0; $i < 9; $i++)
        {
            $str .= mt_rand(0, 9);
        }


        return $this->gmtime() . $str;


    }


     /**
 *
 * 批量处理图片
 *
 */
    function file_list($path){
   if ($handle = opendir($path)) {
       while (false !== ($file = readdir($handle))) {
           if ($file != "." && $file != "..") {
               if (is_dir($path."/".$file)) {
                   echo $path."/".$file."<br>";//去掉此行显示的是所有的非目录文件
                   file_list($path."/".$file);
               } else {


                 $arr = explode('.',$file);
  echo end($arr);
                   echo $path."/".$file."<br>";
               }
           }
       }
   }
}


    /**
* 获得当前格林威治时间的时间戳
*
* @return  integer
*/
function gmtime()
{
   return (time() - date('Z'));
}


  function make_dir($folder)
{
   $reval = false;


   if (!file_exists($folder))
   {
       /* 如果目录不存在则尝试创建该目录 */
       @umask(0);


       /* 将目录路径拆分成数组 */
       preg_match_all('/([^\/]*)\/?/i', $folder, $atmp);


       /* 如果第一个字符为/则当作物理路径处理 */
       $base = ($atmp[0][0] == '/') ? '/' : '';


       /* 遍历包含路径信息的数组 */
       foreach ($atmp[1] AS $val)
       {
           if ('' != $val)
           {
               $base .= $val;


               if ('..' == $val || '.' == $val)
               {
                   /* 如果目录为.或者..则直接补/继续下一个循环 */
                   $base .= '/';


                   continue;
               }
           }
           else
           {
               continue;
           }


           $base .= '/';


           if (!file_exists($base))
           {
               /* 尝试创建目录,如果创建失败则继续循环 */
               if (@mkdir(rtrim($base, '/'), 0777))
               {
                   @chmod($base, 0777);
                   $reval = true;
               }
           }
       }
   }
   else
   {
       /* 路径已经存在。返回该路径是不是一个目录 */
       $reval = is_dir($folder);
   }


   clearstatcache();


   return $reval;
}
 }



//记得要处理异常哦!这里省略try catch代码
//记得图片生成完以后要调用Gmagick的destory方法释放内存哦


/**
//初始用例,准备两张图片
$image = new Gmagick('images/1-1.jpg');
//生成thumbnail image
$image->thumbnailImage(200, 0,FALSE);
$image->borderImage("yellow", 1, 1)->oilPaintImage(0.3);
//提高图片质量
$image->enhanceimage();
$image->write('images/1-2.jpg');
**/


/**
//组合图片,将两张图片组合为一张图
$imgMain = new Gmagick('images/1-1.jpg');
$width = (int) ($imgMain->getimagewidth() /2) - 150;
$imgBarcode = new Gmagick('images/1-2.jpg');
$imgMain->compositeimage($imgBarcode, 1, $width, 150);
$imgMain->write('images/withBarcode.jpg');
**/


/**
//切割图片
$image = new Gmagick('images/1-1.jpg');
//参数依次为切割的宽,高和切割的起始坐标x,y
$image->cropimage(200,200,300,300);
$image->write('images/cropimage.jpg');
**/


/**
//切割thumbnail image,会有图片缺失情况存在。
$image = new Gmagick('images/1-1.jpg');
//参数依次为切割的宽,高
$image->cropthumbnailimage(300,100);
$image->write('images/cropthumbnailimage.jpg');
**/


/**
//浮雕效果,返回具有立体效果的灰度图像
$image = new Gmagick('images/1-1.jpg');
$image->cropthumbnailimage(200,200);
//参数依次为:半径,浮雕程度
$image->embossimage(10.5, 5.2);
$image->write('images/embossimage.jpg');
**/


/**
//边缘效果
$image = new Gmagick('images/1-1.jpg');
$image->cropthumbnailimage(200,200);
//参数依次为:半径,浮雕程度
$image->edgeimage(10.5);
$image->write('images/edgeimage.jpg');
**/


/**
$image = new Gmagick('images/1-1.jpg');
//垂直翻转图片效果
$image->flipimage();
//横向翻转效果
$image->flopimage();
$image->write('images/flipimage.jpg');
**/


/**
$image = new Gmagick('images/1-1.jpg');
//伽玛效果
$image->gammaimage(10.3);
$image->write('images/gammaimage.jpg');
**/


/**
$image = new Gmagick('images/1-1.jpg');
//模糊滤镜效果,参数为半径,标准偏差
$image->blurimage(10,20);
$image->write('images/blurimage.jpg');
**/


/**
$image = new Gmagick('images/1-1.jpg');
//模拟木炭画效果,参数为半径,标准偏差
$image->charcoalimage(10,20.5);
$image->write('images/charcoalimage.jpg');
**/


/**
$image = new Gmagick('images/1-1.jpg');
//印章效果,参数:宽度,高度,坐标x,y
$image->chopimage(100,100,200,200);
$image->write('images/chopimage.jpg');
**/


/**
$image = new Gmagick('images/1-1.jpg');
//图片缩放效果,参数:宽度(为0时按高度等比缩放图片),高度(为0时按宽度等比缩放图片)
$image->scaleimage(100,0);
$image->write('images/scaleimage.jpg');
**/


/**
$image = new Gmagick('images/1-1.jpg');
//偏移效果,参数:x(x轴方向偏移量),y(y轴轴方向偏移量)
$image->rollimage(200,300);
$image->write('images/rollimage.jpg');
**/


/**
$image = new Gmagick('images/1-1.jpg');
//模拟3D按钮效果
$image->raiseimage(200,300,100,50,true);
$image->write('images/raiseimage.jpg');
**/


/**
$image = new Gmagick('images/1-1.jpg');
//增强图片对比度
$image->normalizeimage(3);
$image->write('images/normalizeimage.jpg');
**/


/**
$image = new Gmagick('images/1-1.jpg');
//模拟油画效果
$image->oilpaintimage(13);
$image->write('images/oilpaintimage.jpg');
**/


/**
$image = new Gmagick('images/1-1.jpg');
//放大两倍
$image->magnifyimage();
$image->write('images/magnifyimage.jpg');
**/


/**
$image = new Gmagick('images/1-1.jpg');
//创建一个副本,参数为0时,图片副本跟原图一样
$image->implodeimage(0);
$image->write('images/implodeimage.jpg');
**/


/**
$image = new Gmagick('images/1-1.jpg');
//随机置换每个像素块
$image->spreadimage(100);
$image->write('images/spreadimage.jpg');
**/


/**
$image = new Gmagick('images/1-1.jpg');
//solarize效果
$image->solarizeimage(100);
$image->write('images/solarizeimage.jpg');
**/


/**
$image = new Gmagick('images/1-1.jpg');
//创建一个平行四边形,参数依次为:填充色,x方向度数,y方向度数
$image->shearimage('#cccccc',100.4,100.5);
$image->write('images/shearimage.jpg');
**/


/**
$image = new Gmagick('images/1-1.jpg');
//翻飞效果,参数为:密度
$image->swirlimage(100.5);
$image->write('images/swirlimage.jpg');
**/


/**
$image = new Gmagick('images/1-1.jpg');
//翻飞效果,参数为:密度
$image->swirlimage(100.5);
$image->write('images/swirlimage.jpg');
**/


/**
$image = new Gmagick('images/1-1.jpg');
//平滑图像轮廓,参数:半径
$image->reducenoiseimage(50.5);
$image->write('images/reducenoiseimage.jpg');
**/


/**
$image = new Gmagick('images/1-1.jpg');
//创建一张不同分辨率的图片,参数:x方向分辨率,y方向分辨率,滤镜数,模糊数
$image->resampleimage(50.5,13.5,5,10);
$image->write('images/resampleimage.jpg');
**/


/**
$image = new Gmagick('images/1-1.jpg');
//旋转图片,参数:填充色,角度
$image->rotateimage("#cccccc",50);
$image->write('images/rotateimage.jpg');
**/


//Gmagick设置生成图片质量的方法,Gmagick默认生成的图片质量有点差。
//这里设置质量为90,注意设置质量为90以上的(包括90)可能会导致生成后的图片所占的空间比原图还要大,还要注意在write()的时候再设置这个压缩质量,不要在把图片经过各种处理之前设置这个值,这样write的时候质量就不生效了,生成的图片可以用picasa来查看质量,目前这个方法官方文档居然还木有描述,在imagick中有这个方法的描述,我是在网上找了很久才找到的,很无语。
$image->setCompressionQuality(90); //注意graphicsmagick1.3.7以上才支持setCompressionQuality,相对的getCompressionQuality方法目前还木有提供

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值