• ImageMagick简单记录


    一、安装

    mac下的安装非常简单

    brew search ImageMagick
    brew install xxx

    安装后,可验证

    magick logo: logo.gif
    identify logo.gif
    display logo.gif

     更多安装方式参考:http://www.imagemagick.org/script/download.php

    二、命令介绍

    命令概览
    
    convert:转换图像格式和大小,模糊,裁剪,驱除污点,抖动,临近,图片上画图片,加入新图片,生成缩略图等。
    identify:描述一个或较多图像文件的格式和特性。
    mogrify:Mogrify改写最初的图像文件然后写到一个不同的图像文件。
    composite:根据一个图片或多个图片组合生成图片。
    montage:创建一些分开的要素图像。在含有要素图像任意的装饰图片,如边框、结构、图片名称等。
    display:如果你拥有一个X server的系统,它可以按次序的显示图片
    animate:利用X server显示动画图片
    import:在X server或任何可见的窗口上输出图片文件。 你可以捕获单一窗口,整个的荧屏或任何荧屏的矩形部分。用于截屏
    conjure:解释执行 MSL (Magick Scripting Language) 写的脚本。
    2.1 identify:
    
    ImageMagick有一个小工具identify,它可以用来显示一个图片文件的详悉信息,比如格式、分辨率、大小、色深等等
    identify xxx.png
    identify -format "%wx%h" image.png
    只获取图片的宽高
    
    
    2.2 convert
    
    格式:
    
    convert foo.jpg foo.png
    
    convert *.jpg  foo.pdf
    转换当前目录所有jpg文件为一个pdf文件
    
    mogrify -format png *.jpg
    批量转换当前目录所有jpg为相应的png
    
    
    大小:
    
    convert -resize 100x100 foo.jpg thumbnail.jpg
    转换原图为100*100的缩略图
    
    convert -resize 50%x50% foo.jpg thumbnail.jpg
    百分比转换缩略图
    
    convert -resize 200% foo.jpg big.jpg
    即放大图片,效果就是模糊了
    
    convert -resize "500x300>" input.jpg  output.jpg
    如果图片比500x300小就保持原样,以防小图片被放大失真
    
    convert -sample 50% foo.jpg thumb.jpg
    利用sample缩小图片
    
    mogrify -sample 80x60 *.jpg
    批量生成缩略图,会覆盖原有图像
    
    convert -sample 10% -sample 1000% image.png sample.png
    先缩小在放大,形成马赛克效果,用resize,无此效果
    与resize的区别在于-sample只进行了采样,没有进行插值,所以用来生成缩略图最合适
    
    
    裁剪:
    
    convert -crop 100x100+50+50 image.png crop.png
    从50x50位置开始,相对于图片左上角,裁剪100x100大小的图片
    如果不指定位置,则按照这个大小分隔出小图片,这个命令生成crop-0.png,crop-1.png,crop-2.png……:
    
    convert  -gravity northeast -crop 100x100+0+0 image.png crop.png
    -gravity即指定坐标原点,有northwest:左上角,north:上边中间,northeast:右上角,east:右边中间...
    
    
    旋转:
    
    convert -rotate 30 foo.png bar.png
    上面的30,表示向右旋转30度,如果要向左旋转,度数就是负数
    
    convert -background #000 -rotate 30 foo.png bar.png
    黑色背景 @todo 不支持
    convert -background rgba(0,0,0,0) -rotate 30 foo.png bar.png
    透明背景
    
    
    合并:
    合并指的是将一张图片覆盖到一个背景图片上
    
    convert -compose over overlay.png -composite image.png  newimage.png  
    -compose指定覆盖操作的类型,其中over为安全覆盖,另外还有xor、in、out、atop等等
    
    覆盖的位置可以通过-gravity指定
    convert -gravity southeast -compose over overlay.png -composite image.png newimage.png 
    
    
    拼接:
    横向拼接(+append),下对齐(-gravity south)
    纵向拼接(-append),右对齐(-gravity east)
    
    convert image1.png image2.png image3.png -gravity south +append result.png  
    convert -gravity south +append image1.png image2.png image3.png result.png
    
    
    
    边框:
    
    convert -mattecolor "#000000" -frame 60x60 yourname.jpg rememberyou.png
    图片四周加边框,"#000000"是边框的颜色,边框的大小为60x60
    
    convert -border 60x60 -bordercolor "#000000" yourname.jpg rememberyou.png
    上边一样的效果
    
    convert -trim -fuzz 10% image.png newimage.png
    去掉边框
    
    
    图片加文字:
    
    convert -fill green -pointsize 40 -draw 'text 10,50 "charry.org"' foo.png bar.png
    上面的命令在距离图片的左上角10x50的位置,用绿色的字写下charry.org,如果你要指定别的字体,可以用-font参数
    
    
    模糊:
    
    convert -blur 80 foo.jpg foo.png
    高斯模糊 -blur参数还可以这样-blur 80x5。后面的那个5表示的是Sigma的值,这个是图像术语
    80x50 比 80x5要模糊
    
    
    翻转:
    
    convert -flip foo.jpg bar.jpg
    convert -flop foo.jpg bar.jpg
    -flip 上下翻转 
    -flop 左右翻转
    
    
    反色:
    
    convert -negate foo.jpg bar.jpg
    形成底片的样子
    
    
    单色:
    
    convert -monochrome foo.png bar.png
    黑白图片
    
    
    加噪声:
    
    convert -noise 3 foo.png bar.png
    
    
    油画效果:
    
    convert -paint 4 foo.png bar.png
    数值越大,越模糊,越油
    
    
    炭笔效果:
    
    convert -charcoal 2 foo.png bar.png
    形成炭笔或者说是铅笔画的效果
    数值越大,铅笔颜色越重越黑
    
    
    散射:
    
    convert -spread 30 foo.png bar.png
    毛玻璃效果
    数值越大,越模糊
    
    
    旋涡:
    
    convert -swirl 67 foo.png bar.png
    以图片的中心作为参照,把图片扭转,形成漩涡的效果
    数值越大,旋涡越大
    
    
    凸起效果:
    
    convert -raise 5x5 foo.png bar.png
    照片的四周会一个5x5的边,如果你要一个凹下去的边,把-raise改为+raise就可以了
    
    
    质量和profile:
    
    影响图片大小(占用空间)主要取决于图片的profile和quality
    
    convert -quality 85 src.jpg src-quality85.jpg
    设置质量为原来的85,减少图片的大小
    
    convert +profile “*” -strip src.jpg src-profile.jpg
    去掉图片的描述信息,减少图片的大小
    View Code
    制作gif图片
    
    $ convert -delay 0 *.bmp -loop 0 animated.gif
    //      将当前目录下所有的bmp文件合成一个gif图片动画, 每帧间隔0ms, 重复播放。
    //      -delay n     迟延n*10毫秒
    //      -loop  n     播放n轮, 0表示不断地重复播放
    $ convert -delay 50 frame1.gif frame1.gif frame1.gif -loop 0 animated.gif
    //      将当前目录下的frame1.gif文件制作成animated.gif动画,其中3个frame1.gif作为一组,进行循环播放,延迟500毫秒。
    
    $ convert -delay 50 frame1.gif -delay 100 frame1.gif -delay 150 frame1.gif -loop 0 -pause 200 animated.gif
    //      在一轮播放之后暂停200毫秒,再进行下一轮播放。
    
    $ convert anim1.gif anim2.gif combined.gif
    //      将两个动画文件合并成一个。
    View Code

    三、案例使用

    在实际应用中,用到了图片的缩略图生成,实际上去掉了图片的exif profile信息和降低了图片的质量

    从而大大减少了图片的体积也不影响其清晰度

    <?php
    
    
    class Imagick_tool{
        public $obj = null;
        public function __construct(){
            if(!extension_loaded('Imagick')){
                return false;
            }
            $this->obj = new Imagick();
        }
    
        public function destory(){  
            if(is_object($this->obj)){  
                $this->obj->clear();  
                $this->obj->destroy();  
            }  
        }
        /**
         * [strip_profile 去掉图片的profile属性]
         * @param  [type] $src_img  [description]
         * @param  string $dest_img [description]
         * @return [type]           [description]
         */
        public function strip_profile($src_img,$dest_img = ''){
            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->obj->destroy();
                    return $src_img;
                }
            }catch(ImagickException $e){
                return false;
            }
        }
        /**
         * [set_quality 设置图片质量]
         * @param [type]  $src_img  [description]
         * @param integer $quality  [description]
         * @param string  $dest_img [description]
         */
        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   成功返回图片地址  否则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  [type]  $src_img [description]
         * @param  integer $width   [description]
         * @param  string  $height  [description]
         * @param  boolean $is_slimming [<description>]
         * @param  boolean $is_thumbnail [<description>]
         * @param  boolean $is_bestfit  Optional fit parameter
         * @return [type]           [description]
         */
        public function thumb($src_img,$width = 360,$height = '',$quality = 60,$is_slimming = true,$is_thumbnail = false,$is_bestfit = true){  
            if(!is_object($this->obj)){  
                return false;  
            }  
            try {  
                  
                $file_info = pathinfo($src_img);  
                //生成缩略图名称  
                $file_name = substr($file_info['basename'],0,strrpos($file_info['basename'],'.'));
                if($is_thumbnail){
                    $file_name_thumb = "_thumb_thumbnail";
                }else{
                    $file_name_thumb = "_thumb_resize";
                }
                $dest_img = $file_info['dirname'] . '/' . $file_name . $file_name_thumb . '.' . $file_info['extension'];  
                $this->obj->readImage($src_img);
                //计算要获得缩略图的高度  
                $img_width = $this->obj->getImageWidth();  
                $img_height = $this->obj->getImageHeight();
                $dest_width = $img_width;
                $dest_height = $img_height;
                if($width < $img_width){
                    $dest_width = $width;
                    $dest_height = $img_height * ($width / $img_width);
                }
                if($is_thumbnail){
                       $this->obj->thumbnailImage($dest_width, $dest_height,$is_bestfit); 
                }else{
                    $this->obj->resizeImage($dest_width, $dest_height, Imagick::FILTER_CATROM, 1, $is_bestfit);
                }
                //是否压缩图片
                if($is_slimming){
                    $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;  
            }  
        }  
        
    }
    View Code

    四、参考文献

    http://www.imagemagick.org
    http://php.net/manual/zh/book.imagick.php
    https://codeday.me/bug/20170711/40588.html
    http://blog.csdn.net/qwsamxy/article/details/50530900
    http://blog.csdn.net/andy1219111/article/details/38335987
    http://www.charry.org/docs/linux/ImageMagick/ImageMagick.html
    http://blog.just4fun.site/use-ImageMagick.html
  • 相关阅读:
    c#pda(wince)摄像头拍照程序
    单点登录在ASP.NET上的简单实现(图)
    写文件 指定固定开始位置
    关于"System.Web.HttpException: 超过了最大请求长度。"错误的解决
    配置本地YUM:
    开启mysql的审计功能
    用GRE通道连通机房之间的私网
    让nginx支持PATH_INFO
    Linux在本地使用yum安装软件
    sysbench的安装及使用
  • 原文地址:https://www.cnblogs.com/fanfan259/p/7649790.html
Copyright © 2020-2023  润新知