IM 用C写了一系列的command,然后由这些command 配以各种参数,搭配出种类繁多的图像处理特效。
这样做的好处是:1)层次分明;2)上层逻辑实现简单快速。
坏处是:1)用shell脚本写的特效,不方便由C代码调用;2)Shell 脚本执行效率没有C原生的快
如果对某种特效,需要频繁调用,这时就要考虑将shell 脚本由C/C++ 重写了。以下将记录这方面的学习笔记。
曾经听说过Lua 脚本和C 代码关系比较密切,考虑将shell 脚本转成Lua脚本,然后将Lua脚本“自动转成C 代码”,后来发现,这是不可能的,太天真了!并且,如果由C 调用Lua 脚本,并且频繁跨越C/Lua 边界的话,效率也很低下。于是放弃Lua 思路,只有一条路:手工将Shell 脚本转成C 代码。于是要搞清楚以下问题:
- shell脚本中大量使用的convert 命令是怎么生成的,代码和Makefile 在哪?我们自己的C 代码该怎样模拟调用conert 命令?
- 对于众多的shell 脚本,怎样用一个统一的方法实现Shell 到C 的转换?
- 这些Shell 脚本是否具备“Linux 命令通道”的功能,即几个脚本串联,前一个的输出是后一个的输入?这样的串联用代码怎样高效实现?
- 怎样实现跨平台?
观察IM 的代码和安装后的文件,有以下发现:
1)貌似convert 命令是由wand/convert.h, wand/convert.c 生成的
2)安装了IM 之后,在 /usr/local/lib 中会有以下和IM 相关的库文件:
-rw-r--r--. 1 root root 4561412 Apr 21 20:00 libMagick++-6.Q16.a
-rwxr-xr-x. 1 root root 1123 Apr 21 20:00 libMagick++-6.Q16.la
lrwxrwxrwx. 1 root root 26 Apr 21 20:00 libMagick++-6.Q16.so -> libMagick++-6.Q16.so.1.0.0
lrwxrwxrwx. 1 root root 26 Apr 21 20:00 libMagick++-6.Q16.so.1 -> libMagick++-6.Q16.so.1.0.0
-rwxr-xr-x. 1 root root 2134069 Apr 21 20:00 libMagick++-6.Q16.so.1.0.0
-rw-r--r--. 1 root root 11540026 Apr 21 20:00 libMagickCore-6.Q16.a
-rwxr-xr-x. 1 root root 1075 Apr 21 20:00 libMagickCore-6.Q16.la
lrwxrwxrwx. 1 root root 28 Apr 21 20:00 libMagickCore-6.Q16.so -> libMagickCore-6.Q16.so.1.0.0
lrwxrwxrwx. 1 root root 28 Apr 21 20:00 libMagickCore-6.Q16.so.1 -> libMagickCore-6.Q16.so.1.0.0
-rwxr-xr-x. 1 root root 6309290 Apr 21 20:00 libMagickCore-6.Q16.so.1.0.0
-rw-r--r--. 1 root root 4