ImageMagick

出自 ArchWiki


根据 维基百科

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

常用操作

注意: 选项前的符号很重要。可以使用加号代替减号来执行相反的操作。

在图像格式之间转换

此功能的基本用法是将现有图像格式和所需图像格式指定为文件扩展名。例如,要获取给定 .png 图像的 .jpg 表示,请使用

$ magick image.png image.jpg

追加

将多张图片合并为一张

$ magick -append input.pngs output.png

裁剪、切除

要裁剪多张图像的一部分并将其转换为另一种格式

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

其中 WIDTHHEIGHT 是裁剪后的输出图像大小,XY 是相对于输入图像大小的偏移量。

也可以使用 -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 可以指定延迟,在此期间您可以例如放下一些窗口。

注意: 如果您更喜欢 graphicsmagick 替代方案,只需在前面加上 "gm",例如 $ gm import -window root screenshot.jpg

多 X 屏幕截图

如果您运行 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
注意: 如果某些程序(例如 zathura)的屏幕截图显示空白,请尝试附加 -frame 或从 xdotool 命令中删除 -f

图像数据加密

要加密

$ echo pass_phrase | magick image.jpg -encipher - -depth 8 png24:image.png

可以使用以下命令解密

$ echo pass_phrase | magick image.png -decipher - image.jpg

强烈建议阅读 加密图像 中的讨论,了解此类命令的各种问题和建议。

具有 cipher 标签的图像格式的元数据可用于测试加密。但是,它可以被 EXIF 编辑程序删除或欺骗。

$ identify -verbose image.png

通常,测试光栅图像是否加密可以通过检查像素分量的分布来完成。如果超过某个阈值,则数据可以被认为是随机的,并且可能是加密的候选对象。但是,伪阳性的一个例子是使用 Diamond-square 算法 创建的图像。

从图像创建 PDF

请参阅 PDF、PS 和 DjVu#从图像创建 PDF。有关一些背景知识,请参阅 stackexchange 线程

参见