跳转到内容
来自 Arch Linux 中文维基

根据英文维基百科

ImageMagick is a free and open-source software suite for displaying, converting, and editing raster image and vector image files. It can read and write over 200 image file formats.
(译文)ImageMagick 是一款自由及开放源代码的软件套件,用于显示、转换及编辑位图图像和矢量图像文件。它能够读写超过 200 种不同的图像文件格式。

安装

安装 imagemagick。或者通过 graphicsmagick 安装 GraphicsMagick⸺ImageMagick 的分支,强调 API 和命令行界面的稳定性。

使用方法

参见 ImageMagick(1),或使用 gm(1) 查看 GraphicsMagick 的手册页。

提示:安装软件包后,可在本地访问官方 HTML 文档:
  • ImageMagick 的文档路径为 /usr/share/doc/ImageMagick-7/www/index.html
  • GraphicsMagick 的文档路径为 /usr/share/doc/GraphicsMagick/www/index.html

常见操作

注意:参数前的符号非常重要。用“+”代替“-”可以执行相反操作。

格式转换

ImageMagick 通过文件扩展名确定格式。例如,要将给定的 .png 图像转换为 .jpg 格式,需要使用:

$ magick 图像.png 图像.jpg

拼接

将多张图片拼接为一张:

$ magick -append 输入1.png 输入2.png ... 输出.png

裁剪与切除

对多张图像进行裁剪并转换格式:

$ mogrify -crop x+X+Y -format jpg *.png

其中表示裁剪后的输出图像尺寸,XY 表示相对于输入图像的偏移量。

也可使用 -chop,通过 -gravity 参数切除指定单侧边框,这种方式无需复杂坐标计算,操作更简便:

$ magick 红色边框.gif -gravity South -chop 0x10 切除底部.gif

限制文件大小

在指定文件大小下获得合理画质:

$ magick 图像.jpg -define jpeg:extent=3000KB 压缩图像.jpg

这有助于缩短传输时间。注意 -quality 参数(如以下用法:)

$ magick 图像.jpg -quality 85% 压缩图像.jpg

当画质与文件大小的对应关系不明确时难以使用。

截屏

使用 import(1) 命令便捷截取当前系统屏幕:

$ import -window root screenshot.jpg

若不带 -window 参数运行 import,可交互式地选择窗口或其它任意区域。使用 -pause 参数设置延时,在此期间可执行操作(例如最小化某些窗口)。

注意:若需使用 graphicsmagick 的等效功能,只需在命令前添加 "gm",例如 $ gm import -window root screenshot.jpg

在 X11 中进行多屏幕截屏

若使用双屏模式(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 截屏.png
$ rm /tmp/{0,1}.png

使用 Xinerama 时截取单个物理屏幕

使用 Xinerama 进行的多显示器配置仅存在单个虚拟屏幕。当物理屏幕高度不一致时,截图会产生无效区域。此时可单独截取每个物理屏幕(需确保 X 服务器提供 Xinerama 信息):

#!/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 显示屏$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
注意:如果某些程序(例如 zathura英语zathura)的截图显示为空白,请尝试在 xdotool 命令后添加 -frame 或移除 -f

加密图像数据

加密方法:

$ echo 密码词组 | magick 图像.jpg -encipher - -depth 8 png24:图像.png

解密方法:

$ echo 密码词组 | magick 图像.png -decipher - 图像.jpg

有关此类命令可能遇到的各种问题及优化建议(如加密后文件格式的指定),参见官方文档 Encrypting Image Data

一些图像格式的元数据支持 cipher 标签,可用于检测图像是否加密,但该标签可能被 EXIF 编辑工具移除或伪造。

$ identify -verbose image.png

通用的检测方法可通过分析像素分量分布实现:若其熵值超过特定阈值,数据可视为随机(即可能经过加密)。但需注意菱形平方算法生成的图像也会产生类似特征,属于典型误判案例。

用图像创建 PDF

参见 PDF、PS 与 DjVu#用图像创建 PDF。有关背景信息,参见此 Stack Exchange 帖子

另见