前言

  前段时间一直在搞图形处理的研究,以前以为 Qt 框架的图像处理很强大,可以解决很多 Maya 处理图像的问题。
  但是自从认识了 ImageMagick 这款命令行处理工具之后,我才知道什么是小巫见大巫。

  ImageMagick 是个纯命令行开源图形处理工具,有服务器 PS 的美誉,用 C & C++ 语言编写,有多核性能的优化,扩展性非常强。
  最让我赞叹的是 ImageMagick 支持 PSD 等多种不同图片的格式,图片处理的功能内置形态学 API ,甚至可以自定义处理核函数,处理功能远在 Qt 框架之上。
  另外 Maya & PS 都内置了 imconvert.exe & convert.exe 可以直接调用。
  最新版本的 ImageMagick 甚至集成了 ffmpeg 视频处理功能,只可惜太大了,失去了老版本的精致小巧。
  Maya 的 imconvert 版本比较老,但是胜在大小不到 10 M 非常小巧,依然能够满足大多数的应用场景。

文档使用

https://legacy.imagemagick.org/Usage/

PS & Maya 处理

  PS 自带 convert.exe
  Maya 自带 imconvert.exe
  都在启动软件的目录里面可以找到,然而 Maya 的版本虽然比 PS 的老,但是处理渐变的效果比 PS 的要好很多。

参数详解

+dither 参数

https://legacy.imagemagick.org/Usage/quantize/#intro

alt

1
convert colorwheel.png -colors 32 color_quantize.gif

alt

1
convert colorwheel.png +dither -colors 32 color_quantize.gif

alt

使用案例剖析

官方提供两个大佬 的 案例&脚本

http://www.fmwconcepts.com/imagemagick/
https://im.snibgo.com/

缩略图处理

https://www.jianshu.com/p/9c7d53055adf

图片大小获取

1
2
3
convert input.png ^
-flatten ^
-format "%wx%h" info:

这个支持绝大多数的图片格式(包括 psd 格式),比起 Qt 的 QImage 还好
-flatter 可以将 psd 图层压缩到一层,否则会获取每个图层的大小信息 链接

Python 通过 subprocess.check_output 方法可以直接获取命令行的输出。

抗锯齿 半透明边缘 剔除

https://legacy.imagemagick.org/Usage/formats/#boolean_trans

1
2
3
convert input.png ^
-channel A -threshold 1% +channel -alpha extract -negate ^
output.png

使用 -channel A -threshold 1% 可以将大于 50% 半透的 转为 完全透明
可以剔除 anti-alias 引入的半透边缘

主颜色提取

https://legacy.imagemagick.org/discourse-server/viewtopic.php?t=28963

1
2
3
4
5
convert input.png ^
+dither -alpha off ^
-colors 16 -define histogram:unique-colors=true ^
-format "%c" histogram:info: ^
output.png

+dither 去除杂色
-alpha off 关闭透明通道
-colors 16 提取主要的 16 种颜色

输出会以命令行的方式输出

渐变生成

https://im.snibgo.com/islands.htm#grad