图片处理神器imageMagick

ImageMagick介绍:

ImageMagick是一套功能强大、稳定而且开源的工具集和开发包,可以用来读、写和处理超过89种基本格式的图片文件,包括流行的TIFF、JPEG、GIF、 PNG、PDF以及PhotoCD等格式。利用ImageMagick,你可以根据web应用程序的需要动态生成图片, 还可以对一个(或一组)图片进行改变大小、旋转、锐化、减色或增加特效等操作,并将操作的结果以相同格式或其它格式保存,对图片的操作,即可以通过命令行进行,也可以用C/C++、Perl、Java、PHP、Python或Ruby编程来完成。同时ImageMagick提供了一个高质量的2D工具包,部分支持SVG。ImageMagic的主要精力集中在性能,减少bug以及提供稳定的API和ABI上。
ImageMagick 是一个用来创建、编辑、合成图片的软件。它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线, 多边形,椭圆,曲线,附加到图片伸展旋转。ImageMagick是免费软件:全部源码开放,可以自由使用,复制,修改,发布。支持大多数的操作系统。

ImageMagick的命令概览

[ convert | identify | mogrify | composite | montage | compare | display | animate | import | conjure ]
  • convert:转换图像格式和大小,模糊,裁剪,驱除污点,抖动,临近,图片上画图片,加入新图片,生成缩略图等。

  • identify:描述一个或较多图像文件的格式和特性。

  • mogrify:按规定尺寸***一个图像,模糊,裁剪,抖动等。Mogrify改写最初的图像文件然后写到一个不同的图像文件。

  • composite:根据一个图片或多个图片组合生成图片。

  • montage:创建一些分开的要素图像。在含有要素图像任意的装饰图片,如边框、结构、图片名称等。

  • compare:在算术上和视觉上评估不同的图片***其它的改造图片。

  • display:如果你拥有一个X server的系统,它可以按次序的显示图片

  • animate:利用X server显示动画图片

  • import:在X server或任何可见的窗口上输出图片文件。 你可以捕获单一窗口,整个的荧屏或任何荧屏的矩形部分。

  • conjure:解释执行 MSL (Magick Scripting Language) 写的脚本。

安装

  • ubuntu
   sudo apt-get install imagemagick

常见用例:

影响图片大小(占用空间)主要取决于图片的profile和quality。

  • quality:图片的品质,品质越高,占用的空间越大。适当降低品质能很大程度的减少图片的尺寸。一般来说,从品质100降到85,基本上肉眼很难区别其差别,但尺寸上减少很大。imagemagick通过通过-quality 来设置。
convert -quality 85 src.jpg src-quality85.jpg 
  • profile:记录图片一些描述信息。例如相机信息(光圈,相机型号)、photoshop元数据,颜色表等信息。它占用的空间可以从几KB到几百KB,甚至可能更大。ImageMagicK可以通过两种方式来去掉这些信息。+profile “*”  或 -strip

Exif信息是数码相机在拍摄过程中采集的一系列信息,这些信息放置在我们熟知的jpg文件的头部,也就是说Exif信息是镶嵌在JPEG图像文件格式内的一组拍摄参数,主要包括摄影时的光圈、快门、ISO、日期时间等各种与当时摄影条件相关的讯息,相机品牌型号,色彩编码,拍摄时录制的声音以及全球定位系统(GPS)等信息。简单的说,它就好像是傻瓜相机的日期打印功能一样,只不过Exif信息所记录的资讯更为详尽和完备。不过,具有Exif信息的JPEG图像文件要比普通的JPEG文件略大一点。还有就是像PS这种软件处理过的图片会有“program comments”。如果不是专业的摄影类网站,这些信息是没有用的,可以去掉:

convert -strip src.jpg src-profile.jpg 

降低图片的quality品质来压缩图片:

  • 把png图片转换为jps图片会减小很多,然后再用以上两个命令处理一下,那就完美了。
    PNG也可以通过减少PNG图片color数量的办法达到压缩的目的。但是这种办法压缩出来的图像可以明显看出来失真,而且呈锯齿状。
    对于真实世界的PNG图片(通常指照片),一般先转换成JPG,再通过上面的办法来压缩。

  • 对用户上传图片进行缩放

安装php的imgick扩展,来处理图片:

安装:

1.安装imgick扩展

  sudo apt-get install php5-imagick

2.编辑php.ini文件,使其加载
打开php.ini文件,在其中加入extension=imagick.so

用法

Imgick Class API:http://php.net/manual/en/class.imagick.php
图片压缩心得:http://blog.lizhigang.net/archives/228
ImageMagick官网:http://www.imagemagick.org/script/index.php
http://elf8848.iteye.com/blog/382528
使用实例:http://hi.baidu.com/7soon/item/d394c2b55bd3bb70254b09ed

一般框架也提供imgick的类

网上找的PHP用Imgick处理图片的类:

/* 
 * 图片压缩类  重新封装了Imagick 
 */  
class Imgick_tool{  
      
    //Imagick对象实例  
    public $obj = null;  
      
    public function __construct()  
    {  
        //判断是否加载了该扩展  
        if(!extension_loaded('Imagick'))  
        {  
            return false;  
        }  
        $this->obj = new Imagick();  
    }  
    /* 
     * png2jpg转换图片格式 
     *  
     * @param string src_img 源图片路径 
     * @param string dest_img 要生成的图片的路径 
     * @return boolean 转换成共返回true  否则false 
     */  
    public function png2jpg($src_img,$dest_img)  
    {  
        if(!is_object($this->obj))  
        {  
            return false;  
        }  
        try  
        {  
            $this->obj->readImage($src_img);  
            if($this->obj->writeImage($dest_img))  
            {  
                $this->destory();  
                return $dest_img;  
            }  
            return false;  
        }  
        catch (ImagickException $e)  
        {  
            return false;  
        }  
    }  
      
    /* 
     * 去掉图片的profile信息 
     *  
     * @param string src_img 源图片路径 
     * @return string src_img 图片名称 否则返回false 
     */  
    public function strip_profile($src_img,$dest_img = '')  
    {  
        if(!is_object($this->obj))  
        {  
            return false;  
        }  
        try  
        {  
            $dest_img = empty($dest_img) ? $src_img : $dest_img;  
            $this->obj->readImage($src_img);  
            $this->obj->stripImage ();  
            if($this->obj->writeImage ($dest_img))  
            {  
                $this->destory();  
                return $src_img;  
            }  
            return false;  
        }  
        catch (ImagickException $e)  
        {  
            return false;  
        }  
    }  
      
    /* 
     * 设置jpg图片质量 
     *  
     * @param string src_img 源图片路径 
     * @param string dest_img 要生成的图片的路径 
     * @return boolean 转换成共返回true  否则false 
     */  
    public function set_quality($src_img,$quality = 70,$dest_img = '')  
    {  
        if(!is_object($this->obj))  
        {  
            return false;  
        }  
        try  
        {  
            $dest_img = empty($dest_img) ? $src_img : $dest_img;  
            $this->obj->readImage($src_img);  
            $this->obj->setImageCompression(Imagick::COMPRESSION_JPEG);  
            $this->obj->setImageCompressionQuality($quality);  
            if($this->obj->writeImage($dest_img))  
            {  
                $this->destory();  
                return $dest_img;  
            }  
            return false;  
        }  
        catch (ImagickException $e)  
        {  
            return false;  
        }  
    }  
      
    /* 
     * 图片瘦身 
     *  
     * @param string src_img 源图片路径 
     * @param int quality 设置图片压缩质量 
     * @param string dest_img 要生成的图片的路径 
     * @return boolean 转换成共返回true  否则false 
     */  
    public function slimming($src_img,$quality = 60,$dest_img = '',)  
    {  
        if(!is_object($this->obj))  
        {  
            return false;  
        }  
        try  
        {  
            $dest_img = empty($dest_img) ? $src_img : $dest_img;  
            $this->obj->readImage($src_img);  
            $this->obj->setImageFormat('jpeg');  
            $this->obj->setImageCompression(Imagick::COMPRESSION_JPEG);  
            //将图片的质量降低到原来的60%  
            $quality = $this->obj->getImageCompressionQuality() * $quality / 100;  
            $this->obj->setImageCompressionQuality($quality);  
            $this->obj->stripImage();  
               
            if($this->obj->writeImage($dest_img))  
            {  
                $this->destory();  
                return $dest_img;  
            }  
            return false;  
        }  
        catch (ImagickException $e)  
        {  
            return false;  
        }  
    }  
      
    /* 
     * 生成缩略图 
     *  
     * @param string src_img 源图片路径 
     * @param int quality 设置图片压缩质量 
     * @param string dest_img 要生成的图片的路径 
     * @return boolean 转换成共返回true  否则false 
     */  
    public function thump($src_img,$width = 250,$height = '')  
    {  
        if(!is_object($this->obj))  
        {  
            return false;  
        }  
        try  
        {  
              
            $file_info = pathinfo($src_img);  
            //生成缩略图名称  
            $file_name = substr($file_info['basename'],0,strrpos($file_info['basename'],'.'));  
            $dest_img = $file_info['dirname'] . '/' . $file_name . '_thump.' . $file_info['extension'];  
            $this->obj->readImage($src_img);  
            //计算要获得缩略图的高度  
            $img_width = $this->obj->>getImageWidth();  
            $img_height = $this->obj->>getImageHeight();  
            $dest_height = $img_height * ($width / $img_width);  
            $this->obj->resizeImage($width, $dest_height, Imagick::FILTER_CATROM, 1, false);  
            //生成图片  
            if($this->obj->writeImage($dest_img))  
            {  
                $this->destory();  
                return $dest_img;  
            }  
            return false;  
        }  
        catch (ImagickException $e)  
        {  
            return false;  
        }  
    }  
      
    /* 
     * 释放资源 
     *  
     */  
    function destory()  
    {  
        if(is_object($this->obj))  
        {  
            $this->obj->clear();  
  
            $this->obj->destroy();  
        }  
    }  
      
}  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容