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 %x50% foo.jpg thumbnail.jpg
百分比转换缩略图 convert -resize % foo.jpg big.jpg
即放大图片,效果就是模糊了 convert -resize "500x300>" input.jpg output.jpg
如果图片比500x300小就保持原样,以防小图片被放大失真 convert -sample % foo.jpg thumb.jpg
利用sample缩小图片 mogrify -sample 80x60 *.jpg
批量生成缩略图,会覆盖原有图像 convert -sample % -sample % image.png sample.png
先缩小在放大,形成马赛克效果,用resize,无此效果
与resize的区别在于-sample只进行了采样,没有进行插值,所以用来生成缩略图最合适 裁剪: convert -crop 100x100++ image.png crop.png
从50x50位置开始,相对于图片左上角,裁剪100x100大小的图片
如果不指定位置,则按照这个大小分隔出小图片,这个命令生成crop-.png,crop-.png,crop-.png……: convert -gravity northeast -crop 100x100++ image.png crop.png
-gravity即指定坐标原点,有northwest:左上角,north:上边中间,northeast:右上角,east:右边中间... 旋转: convert -rotate foo.png bar.png
上面的30,表示向右旋转30度,如果要向左旋转,度数就是负数 convert -background # -rotate foo.png bar.png
黑色背景 @todo 不支持
convert -background rgba(,,,) -rotate 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 % image.png newimage.png
去掉边框 图片加文字: convert -fill green -pointsize -draw 'text 10,50 "charry.org"' foo.png bar.png
上面的命令在距离图片的左上角10x50的位置,用绿色的字写下charry.org,如果你要指定别的字体,可以用-font参数 模糊: convert -blur 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 foo.png bar.png 油画效果: convert -paint foo.png bar.png
数值越大,越模糊,越油 炭笔效果: convert -charcoal foo.png bar.png
形成炭笔或者说是铅笔画的效果
数值越大,铅笔颜色越重越黑 散射: convert -spread foo.png bar.png
毛玻璃效果
数值越大,越模糊 旋涡: convert -swirl foo.png bar.png
以图片的中心作为参照,把图片扭转,形成漩涡的效果
数值越大,旋涡越大 凸起效果: convert -raise 5x5 foo.png bar.png
照片的四周会一个5x5的边,如果你要一个凹下去的边,把-raise改为+raise就可以了 质量和profile: 影响图片大小(占用空间)主要取决于图片的profile和quality convert -quality src.jpg src-quality85.jpg
设置质量为原来的85,减少图片的大小 convert +profile “*” -strip src.jpg src-profile.jpg
去掉图片的描述信息,减少图片的大小
制作gif图片 $ convert -delay *.bmp -loop animated.gif
// 将当前目录下所有的bmp文件合成一个gif图片动画, 每帧间隔0ms, 重复播放。
// -delay n 迟延n*10毫秒
// -loop n 播放n轮, 0表示不断地重复播放
$ convert -delay frame1.gif frame1.gif frame1.gif -loop animated.gif
// 将当前目录下的frame1.gif文件制作成animated.gif动画,其中3个frame1.gif作为一组,进行循环播放,延迟500毫秒。 $ convert -delay frame1.gif -delay frame1.gif -delay frame1.gif -loop -pause animated.gif
// 在一轮播放之后暂停200毫秒,再进行下一轮播放。 $ convert anim1.gif anim2.gif combined.gif
// 将两个动画文件合并成一个。
三、案例使用
在实际应用中,用到了图片的缩略图生成,实际上去掉了图片的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;
}
} }
四、参考文献
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
ImageMagick简单记录的更多相关文章
- JSP简单记录
JSP,全称是Java Server Page,是运行在服务器端的页面,是建立在Servlet规范的动态网页技术,JSP文件在第一次请求时,会被编译成Servlet,所以JSP也可以看成是运行中的Se ...
- OpenCV安装配置的简单记录
在ubuntu16.04下安装OpenCV 2.4.11的简单记录 1. 安装cmake,执行$apt-get install cmake即可,cmake -version验证 2. 下载OpenCV ...
- asp.net 简单记录请求的客户端和服务端 处理时间
最近项目需要简单记录一下 ajax客户端和服务端处理时间,服务端时间的思路是借用BeginRequest和EndRequest事件,为了不影响现有接口返回的数据格式,因此服务处理时间放在respons ...
- PHP 版本简单记录
PHP 版本简单记录 PHP 博物馆 http://museum.php.net/php5/ PHP 版本发布 https://secure.php.net/release ...
- 简单记录一次注入到shell
0x00 前言 帮朋友之前拿的一个站,有点久了没有完整截图,简单记录一下. 0x01 基础信息 操作系统:win 集成环境:phpstudy 端口开放:82,3306,3389 有phpmyadmin ...
- oracle SCN推进恢复数据库 简单记录
由于是在内网专用机器上操作,没有日志记录,下面做个简单记录: 前几天某供电局的的一个老数据库存储挂了,数据全部丢失,该库没有开归档,没接备份,怎么恢复? 由于存储损坏严重,从存储恢复不好搞. 好在 ...
- [git] github 使用简单记录
前提 :1. 已有 github 账号.2. 已安装 git .3. 在 github 和 本地 git 客户端交互秘钥.(这步我记得需要做,有点久远,不确定.) 正文: 下面是一个简单的例子.先在 ...
- Linux中java项目环境部署,简单记录一下
这里只是简单的记录一下linux环境下面如何快速的搭配好环境,使你的项目能在linux环境上面运行. 很多时候,我们都是用windows环境进行配置调试的,而真正很多服务器都是在linux服务器上面的 ...
- Android查看联系人简单记录
简单实现打印联系人信息,可以作为插入联系人的基础和主要代码块,作为个人记录的小逻辑 package com.lgqrlchinese.contactstest; import android.Mani ...
随机推荐
- appium运行报错java.net.SocketException: socket write error
这个错我调了 快两天一点头绪没有,脚本正常跑没问题,但是就是控制台输出信息报错,没法定位问题在哪.报错如图: 虽然这个报错不影响测试结果,但是本人有强迫症,一定要查出究竟: 我的尝试: 1.那天试验, ...
- Java的初始化执行顺序(父类static变量->子类static变量->父类成员变量->父类构造器->成员变量->构造器->main函数)
1. 引言 了解Java初始化的顺序,有助于理解Java的初始化机制和内存机制. 顺序:父类static变量->子类static变量->父类成员变量->父类构造器->成员变量- ...
- Deep Learning系统实训之一:深度学习基础知识
K-近邻与交叉验证 1 选取超参数的正确方法是:将原始训练集分为训练集和验证集,我们在验证集上尝试不同的超参数,最后保留表现最好的那个. 2 如果训练数据量不够,使用交叉验证法,它能帮助我们在选取最优 ...
- 激活函数--(Sigmoid,tanh,Relu,maxout)
Question? 激活函数是什么? 激活函数有什么用? 激活函数怎么用? 激活函数有哪几种?各自特点及其使用场景? 1.激活函数 1.1激活函数是什么? 激活函数的主要作用是提供网络的非线性建模能力 ...
- Javascript事件设计模式(七)
一:事件设计概述 事件机制可以使程序逻辑更加符合现实世界,在JavaScript中很多对象都有自己的事件,例如按钮就有onclick事件,下拉列表框就有 onchange事件,通过这些事件可以方便编程 ...
- 解决Linux下Qt编译出现"cannot find -lGL"以及无法安装libgl1-mesa-dev的问题
在Linux系统下安装好Qt5,打开Qt Creator新建一个最简单的工程,编译却出现"cannot find -lGL"错误. 在网上搜索解决方法,找到的方案基本上是安装lib ...
- BZOJ1588 [HNOI2002]营业额统计 set
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1588 题意概括 给出数列,求 ∑F[i],其中F[1] = a[1] , F[i] = min( ...
- T9 HDU1298
就是字典树加dfs 把所有操作封在结构体里面 #include <cstdio> #include <cstring> #include <algorithm> # ...
- 6-8 树 uva548
read 的方式值得学习 当不知道每一行有多少个输入的时候 getline 在弄成stringstream!一个一个处理 用built递归的方式化大为小进行建立树 dfs 遍历整个树来求最值 变量的 ...
- 050 sqoop的使用
一:导入 mysql-->hdfs 1.准备 2.导入数据 可以看到在跑yarn. 3.在HDFS上看结果 默认的地址:hdfs的家目录. 4.在HDFS上指定目录 5.指定map的个数,相同 ...