ImageMagick
根据 维基百科
- ImageMagick 是一套自由和开源的软件套件,用于显示、转换和编辑栅格图像和矢量图像文件。它可以读取和写入超过 200 种图像文件格式。
安装
安装 imagemagick 软件包。或者安装 graphicsmagick 以使用 GraphicsMagick,它是 ImageMagick 的一个分支,强调 API 和命令行界面的稳定性。
用法
参见 ImageMagick(1),或者 gm(1) (对于 GraphicsMagick)。
- ImageMagick 位于
/usr/share/doc/ImageMagick-7/www/index.html
- GraphicsMagick 位于
/usr/share/doc/GraphicsMagick/www/index.html
常用操作
在图像格式之间转换
此功能的基本用法是将现有和所需的图像格式指定为文件扩展名。例如,要获取给定 .png 图像的 .jpg 表示,请使用
$ magick image.png image.jpg
追加
将多张图片合并为一张
$ magick -append input.pngs output.png
裁剪,切除
要裁剪多张图像的一部分并将其转换为另一种格式
$ mogrify -crop WIDTHxHEIGHT+X+Y -format jpg *.png
其中 WIDTH 和 HEIGHT 是裁剪后的输出图像大小,X 和 Y 是相对于输入图像大小的偏移量。
也可以使用 -chop
从图像上切掉单条边,并使用 gravity 来选择该边。这样做更简单,因为涉及的数字或试错法更少。
$ magick frame_red.gif -gravity South -chop 0x10 chop_bottom.gif
限制存储大小
为了在给定的存储大小下获得合理的质量
$ magick image.jpg -define jpeg:extent=3000KB image_small.jpg
希望这将缩短传输时间。注意 -quality
,例如
$ magick image.jpg -quality 85% image_small.jpg
当质量和存储大小之间的相关性不明确时,更难使用。
截屏
截取当前系统屏幕截图的一个简单方法是使用 import(1) 命令
$ import -window root screenshot.jpg
不带 -window
选项运行 import
允许交互式选择窗口或任意区域。使用 -pause
你可以指定一个延迟,在此期间你可以例如降低一些窗口。
$ gm import -window root screenshot.jpg
。多显示器截屏
如果你运行 twinview 或 dualhead,只需截取两次屏幕截图并使用 imagemagick
将它们粘贴在一起
$ import -window root -display :0.0 -screen /tmp/0.png $ import -window root -display :0.1 -screen /tmp/1.png $ convert +append /tmp/0.png /tmp/1.png screenshot.png $ rm /tmp/{0,1}.png
单独 Xinerama 显示头截屏
基于 Xinerama 的多显示器设置只有一个虚拟屏幕。如果物理屏幕的高度不同,你会在屏幕截图中发现空白区域。在这种情况下,你可能需要单独截取每个物理屏幕的屏幕截图。只要 Xinerama 信息可以从 X 服务器获得,以下方法就有效
#!/bin/sh xdpyinfo -ext XINERAMA | sed '/^ head #/!d;s///' | while IFS=' :x@,' read i w h x y; do import -window root -crop ${w}x$h+$x+$y head_$i.png done
活动/焦点窗口截屏
以下脚本截取当前焦点窗口的屏幕截图。它适用于兼容 EWMH/NetWM 的 X 窗口管理器。为了避免覆盖以前的屏幕截图,当前日期用作文件名。
#!/bin/sh activeWinLine=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)") activeWinId=${activeWinLine:40} import -window "$activeWinId" /tmp/$(date +%F_%H%M%S_%N).png
或者,无论是否支持 EWMH,以下方法都应该有效
$ import -window "$(xdotool getwindowfocus -f)" /tmp/$(date +%F_%H%M%S_%N).png
图像数据加密
加密
$ echo pass_phrase | magick image.jpg -encipher - -depth 8 png24:image.png
这可以通过以下方式解密
$ echo pass_phrase | magick image.png -decipher - image.jpg
强烈建议阅读 Encrypting Images 的讨论,了解此类命令的各种问题和建议。
具有 cipher
标签的图像格式的元数据可用于测试加密。但是,它可以被 EXIF 编辑程序删除或欺骗。
$ identify -verbose image.png
一般来说,测试栅格图像是否被加密可以通过检查像素分量的分布来完成。如果它超过某个阈值,则数据可能被认为是随机的,并且可能是加密的候选对象。但是,误报的一个例子是用 Diamond-square 算法创建的图像。
从图像创建 PDF
参见 PDF, PS 和 DjVu#从图像创建 PDF。有关一些背景知识,请参阅 stackexchange 帖子。
参见
- ImageMagick 网站,其中包含大量选项、示例和展示。
- 应用程序列表/多媒体#图像处理
- Fred's ImageMagick Scripts,包含大量 ImageMagic 脚本