没有什么能像命令行工具这样适合于处理大批量的任务,对于图像处理也不例外。Web 开发人员和管理员会喜欢轻松处理大量文件的能力,无论是使用命令行还是脚本。程序员 Michael Still 给出了更多关于 ImageMagick 套件的示例,这一次向您示范了如何将圆角、徽标或者边框和边添加到您的图像中,以及如何与多页文件格式 (包括 Adobe PDF 格式)进行转换。

圆角

如果您看一看 Mac OS/X,以及很多 Web 站点,那些图片有非常漂亮的圆角。您怎样才能用 ImageMagick 实现这一效果?好的,我们将展示一些使用 composite 命令来生成这种效果的灵活方法。

不过,在我们达到目的之前,让我们先谈一下我们将要运用的策略。如果您考虑一下,可以通过将一些标准预制的角叠加到原始图像上来制作出具有圆角的图像。甚至不需要是圆的角 —— 我们可以用尖角,或者是更有趣的东西。

记住将角的多余部分设置为透明的。这一透明特性可以让我们要叠加角的图像仍可以显示出来。这可能会让人有些迷惑,因为有一些图像浏览器,比如 xview,将以黑色或者其他颜色来表示透明。

GIMP

GIMP,即 GNU Image Manipulation Package,是一个非常有用的光栅图形编辑器,很像 Adobe Photoshop。它很适于调节图像,或者创建您自己的新图片。查看本文的 参考资料 部分以查找关于 Gimp 和 Gimp 参考资料的链接。

图 1. 用 xview 显示的圆角

实际的角图像被叠加到一个图像上之后会变得更为清晰,所以让我们来继续做下去。我有一张以前在堪培拉的一个湖岸边拍摄的小图片。在没有圆角时,这张小图片看起来是这样的:

图 2. Burley Griffin 湖

您可以使用 composite 命令将一个图像叠加到另一个图像上。让我们只叠加一个角,来看看发生了什么:

composite -gravity NorthEast rounded-ne.png lake.png lake-1.png

其中 gravity 参数定义了在图像何处放置叠加的图像 —— 在我们的示例中是圆角。这一特定的命令让我们得到了下面的图像:

图 3. 有一个圆角的 Burley Griffin 湖

下面我们再来处理其他的角:

composite -gravity NorthEast rounded-ne.png lake.png lake-1.png 
composite -gravity NorthWest rounded-nw.png lake-1.png lake-2.png 
composite -gravity SouthEast rounded-se.png lake-2.png lake-3.png 
composite -gravity SouthWest rounded-sw.png lake-3.png lake-4.png 

这将带给我们最终的图像:

图 4. 圆角的 Burley Griffin 湖

依我拙见,这看起来有一些酷。您还应该注意到,这些角图像不必是圆的。如果您对尖角或者类似的东西感兴趣,那些同样是可能的 —— 只需要在位图编辑器中改变角的图像。实际上,您甚至可以用您的徽标取代角来叠加到图像上。

如果您想使用我的圆角,可以访问在本文末尾参考资料部分列出的链接。

最后,下面是一个小脚本,让您可以将指定目录下的所有 png 图像的角变为圆角:

for img in *.png do composite -gravity NorthEast rounded-ne.png $img.png $img-1.png 
composite -gravity NorthWest rounded-nw.png $img-1.png $img-2.png 
composite -gravity SouthEast rounded-se.png $img-2.png $img-3.png 
composite -gravity SouthWest rounded-sw.png $img-3.png $img-4.png 
done

为图像添加边框

有一些读者提出的另一个问题是如何给图像添加边框。同样,通过 ImageMagick 可以轻松完成。

凸边或凹边

我将要介绍的第一类边框是凸边或凹边。这个效果是通过调节图像边缘的颜色而实现的,看起会感觉图像像是从周围表面凸起或者凹下。为实现这个效果,您需要指定一个尺寸,首先是水平尺寸,然后是垂直尺寸。这些尺寸的大小必须满足这样一个规则,尺寸的二倍必须小于或等于在那个方向上图像的尺寸大小。例如,您不可以指定边框垂直尺寸大于图像垂直尺寸的一半 —— 其实这主要是说您不可以制作一个比原图还要大的边框。

使用 -raise 命令行参数来创建凸边。例如,为创建一个 5 像素乘 5 像素的边,我们执行:

convert -raise 5x5 tree.png tree-raised.png

这将给出最终的图像:

图 5. 带有凸边的图像

只需要将命令行参数换为 +raise 就可以创建一个凹边。例如:

convert +raise 5x5 tree.png tree-lowered.png

这将得到一个稍有不同的图像:

图 6. 带有凹边的图像

一个简单的纯色边

如果您喜欢稍微简洁一些的风格,您可能对纯色的边感兴趣。ImageMagick 同样可以为您完成这一任务。

convert -bordercolor red -border 5x5 flower.png flower-border.png

这将创建:

图 7. 带有红边的图像

我们可以在命令行中为边指定哪些颜色?是这样,这个列表太长了以至于在本文中无法给出。执行下面这个命令可以得到列表的一个拷贝:

convert -list color

从桔黄色到原木色,从玉米色到贝壳白,有 683 种“基本”颜色可以选择 —— 更不用说您还可以使用以下方法来指定您自己的颜色了,这里 R 表示红色值,G 表示绿色值,B 表示蓝色值,A 是 alpha(透明度)值:

  • #RGB - (R,G,B 是十六进制数,每个 4 位)
  • #RRGGBB - (每个 8 位)
  • #RRRGGGBBB - (每个 12 位)
  • #RRRRGGGGBBBB - (每个 16 位)
  • #RGBA - (每个 4 位)
  • #RRGGBBAA - (每个 8 位)
  • #RRRGGGBBBAAA - (每个 12 位)
  • #RRRRGGGGBBBBAAAA - (每个 16 位)
  • rgb(r,g,b) - (r,g,b 是十进制数)
  • rgba(r,g,b,a) - (r,g,b,a 是十进制数)

构建一个更复杂的边框

接下来让我们用 -frame 命令行参数构建一个更为复杂的边框。首先我们将添加一个和前面的示例中构建的边相同(只是颜色不同)的边框。

convert -mattecolor black -frame 5x5 beach.png beach-frame.png

用参数 -mattcolor 和 -frame 替换了 -bordercolor 和 -border,不过其余部分与 border 命令相同。

图 8. 简单的黑色边

现在我们可以做一些更复杂的事情,添加一些类似于用 -raise 命令得到的阴影。

convert -mattecolor black -frame 5x5+2 beach.png beach-frame2.png

现在是这样了:

图 9. 同一张图片,不过有一些更多的修饰

最后,我们可以添加一些更多的修饰,以达到我期望的最终效果:

convert -mattecolor black -frame 5x5+2+2 beach.png beach-frame3.png

最后我们得到:

图 10. 完成的边框

如果您正在寻找为您的图像制作漂亮的边框的方法,那么我建议您花一些时间来研究 -frame 命令的参数。例如,这里有一些有趣的边框,加在了澳大利亚 King’s Canyon 的岩石图片上。

要深入了解可用的各种不同边框,请参考 convert 的手册页。

convert -mattecolor gray -frame 25x25+0+25 rock.png rock-frame1.png

convert -mattecolor gray -frame 25x25+25+0 rock.png rock-frame2.png

图 11. 两个边框

同时处理多个图像

在我的上一篇文章中,我已经给出了同时转换多个图像的代码。正如一些人所指出的,我给出的代码并不是最好的方法。

下面是我以前给出的代码:

清单 1. 生成当前目录下所有 JPEG 图片的缩略图


for img in `ls *.jpg`
doconvert -sample 25%x25% $img thumb-$img
done

现在已经证明这是不好的 bash 风格,因为它没有很好地处理文件名中的空格(每个词将被认为是一个单独的文件名)。取而代之,一个更好的方法是:

清单 2. 生成当前目录下所有 JPEG 图片的缩略图,具有更好的 bash 风格


for img in *.jpg
doconvert -sample 25%x25% $img thumb-$img
done

这将更好地处理文件名中的空格。

不过,结果证明这两个方案 ImageMagick 都不需要 —— 我们可以只使用 mogrify 命令。 mogrify 命令用于转换一系列文件(虽然它同样可以处理单一的图像)。

前面的代码片断将变成:

mogrify -sample 25%x25% *.jpg

注意,这将会导致原始图像被新图像所覆盖。很难指定输出文件名,这是 mogrify 的局限性之一。 指定输出文件名的惟一的方法是,改变输出文件相对于输入文件的格式。这样的结果是新的图像具有了不同的扩展名。例如:

mogrify -format png -sample 25%x25% *.jpg

这将创建一系列输出文件,这些文件的末尾的 jpg 将由 png 所取代,同时伴随着文件格式的改变。

前面定义的所有转换也都可以用 mogrify 命令来完成,所以,如果您不在意原始文件被覆盖的话,这是一个很好的选择。如果您不希望原始文件被覆盖,那么您可以将它们拷贝到一个临时目录来对它们进行转换(mogrify),并改变它们的名字 —— 或者您继续使用 convert 和 bash。

PDF 处理

到现在为止我们所讨论过的示例(不管是本文的还是前文的),都是针对独立图像的简单转换。ImageMagick 还可以一次进行不止一个图像的有趣转换,值得关注。

最常见的示例是 ImageMagick 的 PDF 处理。让我们假想一个情形,您给出了一个包含一系列图像(每页一个)的 PDF 文件。ImageMagick 将为您导出那些图像到单独的文件中。例如,下面是一个 PDF 文档的屏幕截图,其中有一些我最近到 linux.conf.au 旅游的图片(顺便说一句,实在是太美了):

图 12. 带有几个图像的 PDF 样例

让我们假定上面的 PDF 是一个朋友发给您的。您希望将图像导出以进行进一步的处理。

convert 当然可以将这些图像从 PDF 文档中导出:

convert foo.pdf pages.png

这将是我们想要做的 —— 每一页被导出为自己的 PNG 文件。不过,有一个命名方面的意外的副作用。

清单 3. 检查文件名


mikal@deathstar:~/foo$ convert foo.pdf pages.png
mikal@deathstar:~/foo$ ls pages*
pages.png.0  pages.png.1  pages.png.2  pages.png.3  pages.png.4
mikal@deathstar:~/foo$

由于命令创建了不只一个 PNG 文件,所以文件名被附加了一个惟一的编号。如果您接下来尝试使用基于文件扩展名来判断文件类型的代码或者脚本,那么将会受到影响。

作为一个友好的工具, convert 让我们可以更好地指定文件名。前面的命令实际上应该是像这样:

清单 4. 从 PDF 文档中导出页,赋以更好的文件名


mikal@deathstar:~/foo$ convert foo.pdf pages-%03d.png
mikal@deathstar:~/foo$ ls pages*
pages-000.png  pages-001.png  pages-002.png  pages-003.png  pages-004.png
mikal@deathstar:~/foo$

%03d 是 printf风格的格式说明符。对于这种用法您需要了解的只是 %d代表一个十进制数,而且您还可以通过向序列中插入一个 0<number> 来引入一组前导零。数字指定了显示的值应该占用的位数。

还应该注意的是,您可以导出包含文本的 PDF 页。实际上其幕后机制是 ImageMagick 使用 Ghostscript 来呈现页,然后将其转换为您所选择的图像格式。不过没有进行光学字符识别 —— 您得到的是位图。

您还可以用 convert 将多个图像文件转换为 PDF。实际上前面的示例中的 PDF 是通过下面这个命令构建的:

convert dsc* foo.pdf

只需要向 convert 传递图像文件的一个列表,并确保最后一个文件名是您要将它们放入的 PDF 文档的名字。

支持每个文件多个图像的其他格式

当与 ImageMagick 一起使用时,还有其他 45 种文件格式可以存储不止一个图像,本文的 参考资料 部分有一个链接指向其完全列表。

所有这些的处理方式都与提到的 PDF 示例相同。其中一些也很有趣。能将 postscript 文件的页导出为图像(例如,考虑将您发表的论文作成缩略图放在您的 Web 站点上),或者能将您刚收到的多页传真的所有页作成一个 TIFF 图像,这些都是很方便的。

您甚至可以从 MPEG 影片中导出帧,不过那需要更深入地讨论,已经不在本文的范围之内。

转载于:https://www.cnblogs.com/zhongbin/p/3147651.html

使用ImageMagick 的提示与技巧相关推荐

  1. 提示和技巧:光线跟踪最佳实践

    提示和技巧:光线跟踪最佳实践 Tips and Tricks: Ray Tracing Best Practices 本文介绍了在游戏和其他实时图形应用程序中实现光线跟踪的最佳实践.我们尽可能简短地介 ...

  2. 25个增强iOS应用程序性能的提示和技巧 — 中级篇

    本文由破船译自:raywenderlich 转载请注明出处:BeyondVincent的博客 _____________ 在开发iOS应用程序时.让程序具有良好的性能是非常关键的.这也是用户所期望的. ...

  3. go 通道 返回_GCTT 出品 | Go 语言的缓冲通道:提示和技巧

    通道和 goroutine 是 Go 语言基于 CSP( communicating sequential processes ,通信顺序进程)并发机制的核心部分.阅读本文可以学到一些关于channe ...

  4. 21 个非常有用的 .htaccess 提示和技巧

    Apache Web 服务器可以通过 .htaccess 文件来操作各种信息,这是一个目录级配置文件的默认名称,允许去中央化的 Web 服务器配置管理.可用来重写服务器的全局配置.该文件的目的就是为了 ...

  5. [转]25个增强iOS应用程序性能的提示和技巧

    在开发iOS应用程序时,让程序具有良好的性能是非常关键的.这也是用户所期望的,如果你的程序运行迟钝或缓慢,会招致用户的差评.然而由于iOS设备的局限性,有时候要想获得良好的性能,是很困难的.在开发过程 ...

  6. 《Access 2007开发指南(修订版)》一一1.11 额外的提示和技巧

    本节书摘来自异步社区出版社<Access 2007开发指南(修订版)>一书中的第1章,第1.11节,作者: [美]Alison Balter,更多章节内容可以访问云栖社区"异步社 ...

  7. ssms2008 代码自动提示_使用 SSMS 的提示和技巧 - SQL Server Management Studio (SSMS) | Microsoft Docs...

    使用 SQL Server Management Studio (SSMS) 的提示和技巧Tips and tricks for using SQL Server Management Studio ...

  8. 查看这些有用的ECMAScript 2015(ES6)提示和技巧

    by rajaraodv 通过rajaraodv 查看这些有用的ECMAScript 2015(ES6)提示和技巧 (Check out these useful ECMAScript 2015 (E ...

  9. 8个有趣的Linux提示与技巧

    我们时不时给你带来关于Linux的提示与技巧.这里我们总结了8个最有趣的提示和技巧.推荐学习Linux视频教程. 以它们的大小列出文件 如果你想要一个基于它们大小排序的文件列表,你可以使用下面的命令. ...

最新文章

  1. java判断一个单向链表是否有环路
  2. (R)?ex 0.41.2 发布,软件配置和部署
  3. 【Leetcode | 1】3. 无重复字符的最长子串
  4. 多git帐号的SSH key切换
  5. 为并发而生的 ConcurrentHashMap,基于 Java8 分析
  6. python字符串函数的find方法_Python string模块 字符串函数方法操作教程
  7. LiveNVR高性能稳定RTSP、Onvif探测流媒体服务配置通道接入海康、大华等摄像机进行全终端无插件直播...
  8. 第一代90后IT毕业生调查:不想做IT民工,想做马云
  9. VS2008SP1使用入门
  10. 遗传算法和禁忌搜索解TSP
  11. Spring5全面详解
  12. java 事务控制_java中事务的管理
  13. 深度优先搜索与宽度优先搜索
  14. 钱颖一:从清华学生身上,我发现了这7个普遍现象……
  15. python调用google翻译_python调用百度翻译、谷歌翻译
  16. ecmall php5.4,ecmall2.3_PHP5.3_PHP5.4
  17. vrp量子遗传matlab,遗传算法求解VRP问题的技术报告
  18. 您尚未接受以下SDK组件的许可协议[重复]
  19. 【中信卡】数据挖掘分析笔试+面经
  20. BUG越改越多?微信团队用自动化测试化险为夷

热门文章

  1. Hbase配置项简介
  2. 内存有限的情况下 Spark 如何处理 T 级别的数据?
  3. Windows PE第九章 线程局部存储
  4. 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 二级指针排序 | 抽象业务逻辑函数 )
  5. 【OkHttp】OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 )
  6. 【Flutter】StatefulWidget 组件 ( FloatingActionButton 组件 | RefreshIndicator 组件 )
  7. 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 权限申请原理对话框操作回调接口 | 永久拒绝权限后引导设用户置权限 )
  8. 【计算机网络】网络层 : IPv4 地址 ( IP 地址分类 | 特殊 IP 地址 | 私有 IP 地址 | A 类、B 类、C 类 IP 地址网络号主机号数量 )★
  9. 【数据挖掘】贝叶斯信念网络 ( 马尔科夫假设 | 结构 | 有向无环图 | 参数 | 条件概率表 | 案例分析 )
  10. 【约束布局】ConstraintLayout 13 种相对定位属性组合 ( 属性组合 | 用法说明 )