图片处理神器ImageMagick以及PHP的imagick扩展

发布时间: 8年前 (2016-08-10)浏览: 2048评论: 0

 

为了提高页面的加载速度,以及减少流量,要针对网站的图片进行瘦身,研究了很多的解决方案,最后确定了使用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) 写的脚本。

windows   下安装


  1. 下载 ImageMagick
    下载地址:http://imagemagick.org/script/binary-releases.php#windows

下载最新版本,ImageMagick-6.8.6-9-Q16-x86-dll.exe

2. 安装 ImageMagick
安装 ImageMagick 到 PC 上。安装路径不能出现空格,否则无法使用。安装时,一点选中把执行路径添加到 path 上,否则你就得手动去添加 path 路径了。

3. 测试安装
打开windows 命令行窗口(win+r -> “cmd” -> Enter),输入convert,回车。会出现convert的帮助文档,如果没有出现,说明没有安装成功,或没有把安装目录添加到环境变量 path 中。

添加到环境变量,如我的 ImageMagick 安装目录是 c:/imagemagick。

添加过程:
我的电脑 -> 右键点击 -> 高级系统设置 -> 高级 -> 环境变量 -> 系统变量 -> path -> 选择并编辑 -> 把你的安装目录,添加到其中

4. 下载 php扩展 php_imagick.dll


php5.4.x or php5.5.x 下载地址 http://www.peewit.fr/imagick/

dyn = dynamic, st = static, q16 = 16 bit, q8= 8 bit.

以上标识,同你下载的ImageMagick下载标识相同,本人用的是q16

5. 把dll文件重命名为php_imagick.dll,并放到php 扩展文件目录 php/ext 中。

6. 在 php.ini 配置文件中添加,extension=php_imagick.dll。

7. 重启电脑,只重启apache不管用的情况下,重启下PC。因为扩展底层使用的是imageMagic软件,所以软件重启电脑,重新加载软件,并刷新path路径。

8. 重启后,打开 phpinfo页面,查看,扩展已经安装成功。如果还未安装成功,极有可能imagemagick软件版本过高,请选择更低一级的版本安装。

9. PHP测试代码。

1
2
3
4
5
6
<?php
$im = new imagick( 'a.jpg' );
// resize by 200 width and keep the ratio
$im->thumbnailImage( 200, 0);
// write to disk
$im->writeImage( 'a_thumbnail.jpg' );

 

10. 查看手册,学习API

相关扩展学习手册地址 http://uk3.php.net/manual/zh/book.imagick.php 手册中包含大量易用实例。

这里还有查看命令行参数的文档 http://www.imagemagick.org/Usage/



LInux 安装:

  1. sudo apt-get install imagemagick
常见用例:
影响图片大小(占用空间)主要取决于图片的profile和quality。
  • quality:图片的品质,品质越高,占用的空间越大。适当降低品质能很大程度的减少图片的尺寸。一般来说,从品质100降到85,基本上肉眼很难区别其差别,但尺寸上减少很大。imagemagick通过通过-quality 来设置。

  • profile:记录图片一些描述信息。例如相机信息(光圈,相机型号)、photoshop元数据,颜色表等信息。它占用的空间可以从几KB到几百KB,甚至可能更大。ImageMagicK可以通过两种方式来去掉这些信息。+profile “*”  或 -strip


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

 

 

  1. convert +profile “*” -strip src.jpg src-profile.jpg


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

 


  1. convert -quality 85 src.jpg src-quality85.jpg

 

 

上面两个命令结合到一起使用:

 


  1. find /tmp/images -iname "*.jpg" -exec convert -strip +profile "*" -quality 80 {} {} \;



经过这两个命令的处理,你的图片绝对可以缩小很多。PS:根据我的经验,把png图片转换为jps图片会减小很多,然后再用以上两个命令处理一下,那就完美了。

 

PNG也可以通过减少PNG图片color数量的办法达到压缩的目的。但是这种办法压缩出来的图像可以明显看出来失真,而且呈锯齿状。 
对于真实世界的PNG图片(通常指照片),一般先转换成JPG,再通过上面的办法来压缩。


  1. convert -format jpg input.png  input.jpg

 

 

对用户上传图片进行缩放 

    对于用户自己上传的图片不能简单的 用css限制大小,因为这样每次加载图片时候还是会加载整幅大图。占用多余的宽带,并且影响页面加载速度。应该根据实际显示需要进行缩放。比如我想要用户相册里的图片大小不能超过500x300: 

 

  1. convert -resize "500x300>" input.jpg  output.jpg #如果图片比500x300小就保持原样,以防小图片被放大失真。   


下面说一下安装php的imgick扩展,来处理图片:

 

安装:

1.安装imgick扩展


 

  1. 1) sudo apt-get install libmagick-dev  
      
    2) sudo apt-get install php-pear php5-dev  
      
    3) sudo pecl install imagick

2.编辑php.ini文件,使其加载

 

打开php.ini文件,在其中加入extension=imagick.so


  1. /etc/php5/apache2/php.ini  

重启apache服务使其失效

 

  1. /etc/init.d/apache2 restart  


附上一个简单的例子,用来转换图片格式的:

 

  1. $thumb = new Imagick();  
    $thumb->readImage('test.gif');  
    $thumb->writeImage('test.jpg');  
    $thumb->clear();  
    $thumb->destroy();


用法太多了,我就不一一列举了,提供一下资料供大家学习:

 

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

最后,附上我自己编写的PHP用Imgick处理图片的类:

  1. /* 

  2.  * 图片压缩类  重新封装了Imagick 

  3.  *  

  4.  * @version 2014-07-30 

  5.  * @author andy1219111@163.com 

  6.  */  

  7. 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;  
            }  
        }
  8.       

  9.    

  10.  /* 
         * 图片瘦身 
         *  
         * @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();  
            }  
        }  
          
    }

 

原文链接: http://blog.csdn.net/andy1219111/article/details/38335987

标签:

上一篇: Mac下使用Brew搭建PHP(LNMP/LAMP)开发环境
下一篇: Vim命令合集

相关文章暂无相关
评论列表暂无评论
发表评论
验证码

«   2024年4月   »
1234567
891011121314
15161718192021
22232425262728
2930
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
    文章归档
    网站收藏
    友情链接
    • RainbowSoft Studio Z-Blog
    • 订阅本站的 RSS 2.0 新闻聚合
    ︿
    Top