如何用 ImageMagick 处理图片

花火田丁 花火田丁 2019-08-10 12:44:26 +0000

题图来自于NextDay


对于大多数程序员而言,可以用命令行解决的事情,一般不会用图形化界面的工具,主要是因为命令行比较方便快捷,图形化界面的工具虽然比较傻瓜式,但有些打开一个界面要 Loading 老半天的实在不能忍受。

还有一点,就显得比较酷😄,看看很多电影里表示高科技的画面就知道,恨不得满屏幕都滚动着二进制的数字,至于这些画面里的代码真正是什么意思,就不要用放大镜去看了,多半……没什么特别的意思( ̄∇ ̄)

图片来自网络,版权归原作者所有

前面铺垫了那么多,是想说,命令行是个好东西,一些原本手工操作需要好多工序的工作,也许只需要几行命令就可以了,而且学习起来并不困难,人人都可以掌握。

今天要继 如何用 ffmpeg 处理视频 之后,继续介绍一个命令行工具,ffmpeg 是用来处理视频文件,而今天要介绍的 ImageMagick 则是用来处理图像文件的。我起初用 ImageMagick 是工作中有个项目需要用到,比如生成缩略图、压缩图片、加白框等等,可以直接集成到代码中实现自动化处理,非常方便。

先看看官网的一段介绍:

Use ImageMagick® to create, edit, compose, or convert bitmap images. It can read and write images in a variety of formats (over 200) including PNG, JPEG, GIF, HEIC, TIFF, DPX, EXR, WebP, Postscript, PDF, and SVG. Use ImageMagick to resize, flip, mirror, rotate, distort, shear and transform images, adjust image colors, apply various special effects, or draw text, lines, polygons, ellipses and Bézier curves.

From https://imagemagick.org

用了这么久,还真的没仔细看过官方介绍,从介绍中可以看出不仅仅是图片,PDF、SVG 这些格式也支持,具体没用过,我猜是可以把其中的图片给抓取出来,有兴趣的可以去官网查阅相关资料。今天的重点还是先来看看 ImageMagick 可以对图片做哪些处理,它支持的命令可以在首页点击菜单栏 Command-line 查看,以下内容也基本上翻译自官方文档。

在开始以下内容之前,强烈建议在电脑上装好 ImageMagick,安装方法见 Download,Mac 参考「Mac OS X Binary Release」章节,Windows 参考「Windows Binary Release」

边看边尝试自己跑跑看命令,有趣的事情即将发生。

我们先来看一个最简单的命令

magick image.jpg image.png

这条命令相信很多人都看得懂,即便没有编程背景的,这是将一张 JPG 图片转换为 PNG 格式,当然这个功能有很多替代方式,比如用 Windows 下的画图或者 Mac 下的预览,都可以实现图片的格式转换。这个命令主要用来说明命令行工具的一个基本格式,给没有用过命令行(比如 Windows 的 CMD、Mac 的 Terminal)稍微普及下基本概念,第一个单词「magick」是具体的命令,随后跟着的「image.jpg」是输入,「image.png」是输出,基本意思就是告诉计算机「请用某个命令把我提供输入转换为我想要的输出」。

接下来我们看一个复杂一点的命令

magick label.gif +matte \

\( +clone -shade 110x90 -normalize -negate +clone -compose Plus -composite \) \

\( -clone 0 -shade 110x50 -normalize -channel BG -fx 0 +channel -matte \) \

-delete 0 +swap -compose Multiply -composite button.gif");

这段命令里,反斜杠起到的作用是将长的命令换行,增加可读性。这是在 Unix 下的写法,Windows 下将反斜杠替换成 ^ 这个符号即可。这个命令里,好像除了 magick 命令、输入、输出,还多了很多 - 开头的单词,这些单词可以是一些 options,可以理解成属性、开关甚至是小功能,将这些 option 组合在一起可以实现非常强大的功能。ImageMagick 支持的 option 主要包括以下这几类,每个类别下面有几个到几十个不等的 option,具体可参见 Command-line Options 下的介绍。

回到这个复杂的命令,它究竟实现了什么呢,我们看一下输入输出的效果,简单来说,它把一个二维的图片转换成了一个带三维立体效果的图片,是不是很有意思?

图片来自官网截图,版权归原作者所有


更有意思的还在后面,再看一个更复杂的命令

magick -size 320x90 canvas:none -stroke snow4 -size 1x90 -tile gradient:white-snow4 \

-draw 'roundrectangle 16, 5, 304, 85 20,40' +tile -fill snow \

-draw 'roundrectangle 264, 5, 304, 85 20,40' -tile gradient:chartreuse-green \

-draw 'roundrectangle 16, 5, 180, 85 20,40' -tile gradient:chartreuse1-chartreuse3 \

-draw 'roundrectangle 140, 5, 180, 85 20,40' +tile -fill none \

-draw 'roundrectangle 264, 5, 304, 85 20,40' -strokewidth 2 \

-draw 'roundrectangle 16, 5, 304, 85 20,40' ( +clone -background snow4 \

-shadow 80x3+3+3 ) +swap -background none -layers merge \( +size -pointsize 90 \

-strokewidth 1 -fill red label:'50 %' -trim +repage \( +clone -background firebrick3 \

-shadow 80x3+3+3 ) +swap -background none -layers merge \) -insert 0 -gravity center \

-append -background white -gravity center -extent 320x200 cylindershaded.png


强烈建议自己动手运行下这个命令,然后你会看到神奇的一刻

图片来自官网截图,版权归原作者所有


这两个例子展示了 ImageMagick 的部分能力,并不是全部,但基本上让我们认识到了它的强大,那么,接下来介绍几个比较实用的命令,日常就可以用起来了。

将多个 JPG 生成 GIF 文件

//同一个文件夹下有1.jpg, 2.jpg, 3.jpg, 4.jpg, 5.jpg 等文件

magick .jpg images.gif

//从一个TXT文件中读取需要 JPG 文件,并转换成 GIF

  • myimages.txt

frame001.jpg

frame002.jpg

frame003.jpg

magick @myimages.txt mymovie.gif


批量生成缩略图

//生成的缩略图文件名为thumbnail001.png, thumbnail002.png, thumbnail003.png …

magick '.jpg' -resize 120x120 thumbnail%03d.png


按比例压缩图片

magick convert rose.jpg -resize 50% rose.png

图片来自官网截图,版权归原作者所有


图片叠加

magick composite -gravity center smile.gif rose: rose-over.png

图片来自官网截图,版权归原作者所有


给图片加各种边框

convert rose: -bordercolor SkyBlue -border 10x10 border.gif

convert rose: -border 15x6 borderdefault.gif

convert rose: -bordercolor LimeGreen -border 10x0 bordersides.gif

convert rose: -bordercolor Tomato -border 0x10 \

bordertopbot.gif

convert rose: -matte -bordercolor none -border 10 bordernone.gif

图片来自官网截图,版权归原作者所有


这几个命令在 ImageMagick 功能里只能算是非常 easy 的级别,基本上你可以想到的图片处理都可以用它来实现,放上官网部分图片处理的例子感受下,油画、哈哈镜、颜色通道都不在话下,所有例子参见 examples

图片来自官网截图,版权归原作者所有

宝藏工具 ImageMagick,赶快来试试吧。


文中参考链接如下:

Command-line

https://imagemagick.org/script/command-line-processing.php

Download

https://imagemagick.org/script/download.php

Command-line Options

https://imagemagick.org/script/command-line-processing.php#option

examples

https://imagemagick.org/script/examples.php



关于「HOW TO」系列

这个系列的初衷,我在 回归初心 中提到的,因为平时写的关于「WHY」或者心理活动方面的文章,「HOW TO」系列更偏向于实用。另外一点在于,我发现,有些本行业内认为小儿科或者不值得一提的工具或者方法,对于大多数行业外的人来说,还是比较陌生的,本着「抛砖引玉」的想法,想让大家可以通过这些「砖」打开思路,也可以了解到一些平常不太接触得到的一些东西。


旧文参考:

如何用 iMovie 做看上去很高级的视频

如何用 Python 写一个最简单的爬虫

如何用 ffmpeg 处理视频

如何用 ifttt 做一些自动化提醒

撒欢吧
谈理想
聊人生
讲故事
相对论
花火田丁
微信号:huahuoding
花火田丁
不折腾不人生