引子
最近项目中, 我们需要管理很多的打印机, 根据机种的不同, 我们需要显示相应的打印机图片,
这其中包含着一定的规则(依赖于使用SNMP从打印机取到的返回值)
因为打印机图片很多, 加之有时候我们还要使用替代的图片,
所以经常, 我打开一个网页, 都不确定显示出来的图片是否是正确的,
通常的做法, 我会查看这个图片的连接,确认一下文件名是否正确,
可是每次为了查看这个图片的连接, 我总要多点那么一下,
我觉得不直观, 所以在开发的时候, 我希望给图片加上Label.
我的想法是: 针对下面这样的原始图片
把文件名显示在图片上, 形如下面这样:
这样一来, 显示出来的图片是否正确, 就一目了然了.
为了完成这个事儿, 我起初使用的Photoshop,
但很快我就感觉到, 每次启动Photoshop往上面一个个加文字, 也是个麻烦事儿.
显然我需要的是一个命令工具,
一个命令搞定所有图片的那种.
调查了一下, 发现ImageMagick是个好工具.
ImageMagick 的主页 在这.
他跨平台, 支持命令行操作, 提供了ruby, python, java, .net等等一票语言的接口, 而且功能强大(关于功能列表和它支持的更多语言接口, 详见他的主页)
很是对我的胃口
下载下来配置了一下:
实现上面的功能, 只需命令如下:
第一幅图的命令(文件名标签添加在中间)
convert printer.png -fill red -pointsize 30 -annotate +10+141 "PN298-H_3_M_F" printer_label_middle.png
如果想给文字加上方框, 像第二幅图那样,可以使用下面命令:
convert printer.png -fill "#00ffff" -draw "rectangle 5,128,114,145" -fill red -annotate +10+141 "PN298-H_3_M_F" printer_label_middle.png
第二幅图的命令(文件名标签添加在底部)
convert printer.png -background Khaki -pointsize 30 label:"Hello PN298-L_3" -gravity Center -append printer_label_bottom.png
最后写个脚本, 包一下上面的命令, 对一组图片批量执行上面命令,
至此, 这个问题算是满意解决.
ImageMagick的 安装和配置
在它的主页上面, 有一个Binary Releases 的link.注意, 这个二进制下载居然不在他的Download 页面里面,
(Download里面我选了几个镜像, 发现都只有source, 起初我还以为他只能自己编译了)
对于windows, 里面有带dll的, 有不带的, 有安装版的, 有免安装的.
我下载的是免安装版的, 解压到本地, 配置成path即可.
只是当我第一次运行convert.exe命令时, 它提示我说: "必须指定文件系统"
原来我把ImageMagic追加到了path的最后,
导致convert.exe最先匹配到的是"C:\Windows\System32\convert.exe",
将ImageMagic的安装路径提到path前面即可
ImageMagick的文档和资源
①官网上的文档已经很详尽,
同时官网上面也介绍了关于他的两个书:
<<The Definitive Guide to ImageMagick >>
<<ImageMagick Tricks: Unleash the power of ImageMagick with this fast, friendly tutorial and tips guide>>
当然, 也有社区.
②我做上面的例子的时候, 参考了下面这两个文档连接:
ImageMagick v6 Examples -- Annotating Images
ImageMagick v6 Examples -- Text to Image Handling
③搜索的时候, 发现这个链接也不错
5 ImageMagick command line examples – part 1
④关于convert命令的详细, 参考这个链接
ImageMagick Convert Command-line Tool
想说的一点是, 这个链接中参数介绍有这样一行
这个pointsize就是font size.
起初我想使用这个参数, 搜了个"font size", 结果没有匹配着, 致使我开始漏掉了这个参数.
⑤下面这个blog是对RMagick的一个介绍(ps,ruby还有其他wrapper)
Image Manipulation @The Bastards Book of Ruby
可以做为一个概览, 看一看.