当前位置: 首页 > 编程日记 > 正文

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.pngconvert *.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"是边框的颜色,边框的大小为60x60convert -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和qualityconvert -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信息和降低了图片的质量

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

<?phpclass 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

转载于:https://www.cnblogs.com/fanfan259/p/7649790.html

相关文章:

低代码、RPA 和 AI,有什么区别

来源 | LowCode低码时代头图 | 下载于视觉中国在To B领域&#xff0c;低代码、RPA和AI可谓是“流量担当”&#xff0c;它们自带To B基因&#xff0c;搭载快速发展的企业服务赛道&#xff0c;在企业级IT服务这一细分市场崭露头角。以这三者为代表的前沿理念和科技引领IT产业升级…

C# 获取 IE 临时文件

大家知道&#xff0c;在我们访问一个网站的时候。系统会把这个网站上的图片&#xff0c;动画等内容全部缓存到Internet临时文件夹中。 我们可以通过 <Drives>:/Documents and Settings/<user>/Local Settings/Temporary Internet Files访问。但是可能我们都没有想…

wifidog接口文档(转)

目录(?)[-] 网关心跳协议 请求信息 回复格式 例子用户状态心跳协议 请求格式 注意 回复格式 状态码 例子跳转协议 请求格式 例子注册协议 请求格式 例子wifidog是搭建无线热点认证系统的解决方案之一&#xff0c;他比nocat更适合互联网营销思路。目前支持openwrt系统&#xff…

Oracle XQuery 过滤XML查询SQL

Oralce 支持SQL XQuery查询 一个简单示例&#xff1a; SELECT XMLQuery(for $i in /Videogame return $i/Type passing by value X RETURNING CONTENT) FROM (SELECT XMLTYPE(<Videogame><Type>Racing</Type><Name>NFS Most Wanted</Name><…

C#2.0匿名函数

C# 2.0中提供了通过delegate实现匿名函数功能&#xff0c;能有效地减少用户记代码工作&#xff0c;例如 以下为引用&#xff1a; ... button1.Click new EventHandler(button1_Click); ... void button1_Click(Object sender, EventArgs e) { // Do something, the button…

第三届北京智源大会开幕,全球最大智能模型“悟道2.0”重磅发布

6月1日&#xff0c;由北京智源人工智能研究院&#xff08;以下简称智源研究院&#xff09;主办的2021北京智源大会在北京中关村国家自主创新示范区会议中心成功开幕。 北京智源大会是智源研究院主办的年度国际性人工智能高端学术交流活动&#xff0c;定位于“AI内行顶级盛会”…

Cloneable接口和循环冗余校验算法

1 Cloneable 接口 实现该接口的类可以调用clone()方法合法地对该类实例进行按字段复制。按照惯例&#xff0c;实现此接口的类应该使用公共方法重写 Object.clone&#xff08;它是受保护的&#xff09; 2 循环冗余校验算法 循环冗余校验&#xff08;英语&#xff1a;Cyclic redu…

IOS自定义表格UITableViewCell

在UITableView中&#xff0c;自定义表格&#xff0c;最原始是继承UITableViewCell&#xff0c;然后通过写代码方式去搞&#xff0c;但是这个费事了。 1.在storyboard中 给一个ViewController的tabieview增加自定义的UITableViewCell&#xff0c;可以直接从 object Library里面选…

postfix邮件服务器搭建

项目环境&#xff1a;一台server ip:192.168.1.100 一台mail ip:192.168.1.200 一台win7 ip:192.168.1.222项目需求&#xff1a;1&#xff1a;在DNS Master上搭建DNS&#xff0c;能够解析mail.sw.com2&#xff1a;在Mail Server上部署邮件服务器&#xff0c;和webmail软件3…

从DataView中生成Excel报表的方案(C#)

正文&#xff1a; 一、首先要引用一个Excel的组件&#xff0c;我一开始是在Office XP下尝试的&#xff0c;不 成功&#xff0c;后来把XP给干掉&#xff0c;装2k&#xff0c;就成功了&#xff0c;所以这里分享的是Office 2k下 引用相关组件来实现功能的&#xff0c;在工程中引…

被Python「苦虐」的日子太惨了!

Python因为其优越的特性广泛应用于数据分析、人工智能、Web开发、后端开发、自动化测试/运维、爬虫等领域&#xff0c;也得到了很多企业的青睐。甚至连BATZJ的技术大牛&#xff0c;都无可否认Python现在对于一个程序员发展的重要性&#xff01;最近一两年&#xff0c;我身边也有…

BeanUtils威力和代价

2019独角兽企业重金招聘Python工程师标准>>> BeanUtils: 威力和代价&#xff08;转载综合&#xff09; Apache Jakarta Commons项目非常有用。我曾在许多不同的项目上或直接或间接地使用各种流行的commons组件。其中的一个强大的组件就是BeanUtils。我将说明如何使…

C# 线程无法开启窗口的原因

在 C# 里面, 主窗口拥有主线程, 主线程产生子线程监控 Socket 埠, 子线程一收到数据流就会给主线程发送一个事件, 创建一个窗口. 现在的情况是子线程能够收到数据流, 主窗口能够收到子线程发送过来的事件, 能够创建一个窗口. 这个窗口有问题: 窗口状态像死掉程序的窗口一样, 反…

给力!斩获 GitHub 14000 Star,两周创办开源公司获数百万美元融资

作者 | 伍杏玲出品 | AI 科技大本营&#xff08;ID:rgznai100&#xff09;上世纪 90 年代初&#xff0c;21 岁大学生 Linus Torvalds 开源 Linux 操作系统&#xff0c;自此掀起全球开源浪潮。随后“中国 Linux 第一人”宫敏博士用手提肩背的方式将 20 盒磁带背回中国&#xff0…

root密码忘记怎么办

开机按e进入系统的紧急求援模式依次输入一下命令&#xff1a;mount -o remount&#xff0c;rw /sysrootchroot /sysrootecho "输入新密码" | passwd --stdin rootexitreboot转载于:https://blog.51cto.com/11552940/1971850

C#内容分页简单实现代码及祥解

//定义变量 int i,start,stop,t,stat,statt,pp,pagecount,pagesize; //变量初始值 stat0; statt0; start0;//开始查询的字符串位置&#xff0c;初始为0 stop0; pagesize2000;//定义每页至少显示字符串数 pagecount0; //获得当前的页数 paRequest.Params["page&qu…

灵活越障、花样空翻,腾讯轮腿式机器人亮相机器人顶会 ICRA

6月3日&#xff0c;腾讯轮腿式机器人Ollie&#xff08;奥利&#xff09;正式亮相。它像一个灵活的“轮滑小子”&#xff0c;能完成跳跃、360度空翻等高难度动作。 轮腿式机器人&#xff08;wheel-legged robot&#xff09;是近年来机器人研究的前沿领域。Ollie兼具轮式结构和腿…

android学习笔记之十服务(Service)

2019独角兽企业重金招聘Python工程师标准>>> Service拥有一个单独进程的模块. 1,继承自Service类,须实现public IBinder onBind(Intent intent) 2,通过startServie触发运行,stopService终止运行 生命周期: onCreate(如果是第一次运行) -> onStart -> onDest…

宝塔Linux常用命令

https://www.bt.cn/bbs/thread-1186-1-1.html 2017年3月8日发布全新架构的宝塔Linux 面板3.1Beta版&#xff0c;到现在的5.2.0正式版&#xff0c;历经100多天打磨&#xff0c;宝塔研发工程师做了大量优化适配&#xff0c;从最开始的只支持CentOS到现在支持CentOS、Ubuntu、Debi…

EMAIL发送系统(C#+基于SMTP认证) 2.0

这个是对于 EMAIL发送系统(C#基于SMTP认证) 1.0 的改版这个第一版是2002年11月写的&#xff0c;过了一年半了&#xff0c;才有人提意见&#xff0c;就修正了一下&#xff0c;因为后来做的项目一直用不上&#xff0c;也就没有注意到 前段时间有网友反馈了一些问题&#xff0c;这…

“奥利”来啦,腾讯Robotics X实验室跑出的“轮滑小子”

6月3日&#xff0c;腾讯Robotics X实验室的新成员——轮腿式机器人Ollie&#xff08;奥利&#xff09;正式亮相&#xff0c;它是机器狗Jamoca、Max和自平衡自行车之后&#xff0c;实验室又一创新成果。轮腿式机器人&#xff08;wheel-legged robot&#xff09;是近年来机器人研…

如何写一篇好的技术博客

在工作过程中&#xff0c;发现对很多东西都一知半解&#xff0c;不是很透澈&#xff0c;到头来很容易模糊&#xff0c;如果有一篇好的技术博客予以总结&#xff0c;一来即使忘记了&#xff0c;回国头来再看&#xff0c;仍然能 够从自己的思路中恢复&#xff1b;二来总结一下&am…

使用react心得

为什么80%的码农都做不了架构师&#xff1f;>>> 在使用react中,总会碰到这样那样的问题,如何解决这些问题,希望能够随着时间的积累,慢慢成熟! 在react中的renden函数里,不能使用setState这个方法,不然会死循环,原因:是因为setState会触发render,而render后又触发se…

将Byte数组转化为String

FCL得很多方法的返回值都是包含字符的Byte数组而不是返回一个String&#xff0c;这样的方法包含在如下的类中&#xff1a; System.Net.Sockets.Socket.Receive System.Net.Sockets.Socket.ReceiveFrom System.Net.Sockets.Socket.BeginReceive System.Net.Sockets.Socket.B…

[题解]UVA10054 The Necklace

链接&#xff1a;http://vjudge.net/problem/viewProblem.action?id18806 描述&#xff1a;给出一堆珠子&#xff0c;每个珠子有两种颜色&#xff0c;有一端颜色相同的珠子可以串在一起&#xff0c;问是否可以把所有珠子串在一起&#xff0c;并求其中一种方案。 思路&#xff…

程序员大厂不一定要进,算法必须要学!收藏89篇精选算法文章

为什么程序员都需要学算法&#xff1f;程序员对算法通常怀有复杂情感&#xff0c;算法很重要是共识&#xff0c;但是否每个程序员都必须学算法是主要的分歧点。很多人觉得像人工智能、数据搜索与挖掘这样高薪的工作才用得上算法&#xff0c;觉得算法深不可测。在面试中&#xf…

专有云到混合云,是云计算的下半场?

查获案件案值达数十亿&#xff0c;为国家挽回近十亿元税款&#xff0c;是海关情报系统在全国应用一年后交出的答卷。 海关情报系统是海关总署与阿里云专有云共同搭建海关大数据云平台后推出的首个应用。 专有云的使命&#xff1a;激发政企大脑潜能 十年前&#xff0c;自己动手D…

C# 2.0 的partial

partial 关键字的作用是将你的 class 分为多个部分&#xff0c;编译器会将多个部分拼到一起去。 public partial class SampleClass ...{ public void MethodA() ...{ } } public partial class SampleClass ...{ public void MethodB() ...{ } } 和 public class Sa…

findbugs:may expose internal representation by ret

2019独角兽企业重金招聘Python工程师标准>>> findbugs&#xff1a;1. *** getXXX() may expose internal representation by returning ***.getXXX 2. *** setXXX(DATE )may expose internal representation by storing an externally mutable object into setXXX *…

AI时代的幕后英雄:谁在生产高质量的AI训练数据?

在AI浪潮的推动下&#xff0c;软件正在朝着更「智能」的方向发展。2017年&#xff0c;特斯拉人工智能部门主管、李飞飞高徒Andrej Karpathy提出了「软件2.0」的概念。 什么是「软件2.0」&#xff1f;其实就是神经网络。 在「软件1.0」时代&#xff0c;程序员用Java、Python、…