跳转至内容

ImageMagick

来自 ArchWiki
(重定向自 Gm)


根据 Wikipedia

ImageMagick 是一个免费开源的软件套件,用于显示、转换和编辑光栅图像和矢量图像文件。它可以读取和写入超过 200 种图像文件格式。

安装

安装 imagemagick 包。或者安装 graphicsmagick 以获得 GraphicsMagick,它是 ImageMagick 的一个分支,强调 API 和命令行界面的稳定性。

用法

请参阅 ImageMagick(1),或 GraphicsMagick 的 gm(1)

提示 官方 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

合并 (Append)

将多张图片合并成一张

$ magick -append input.pngs output.png

裁剪 (Crop, chop)

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

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

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

也可以使用 -chop 来剪切图像的单个边缘,并使用重力来选择该边缘。这更简单,涉及的数字或试错更少。

$ 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

当质量与存储大小之间的相关性不清楚时,更难使用。

旋转 (Rotate)

顺时针旋转图像 90°

$ magick image.jpg -rotate 90 image_rotated.jpg

注意,如果旋转角度不是 90° 的倍数,并且不允许数据丢失,那么包含图像的最小矩形的大小将不可避免地增大,并且最小矩形的某个边缘应保持与地平面平行。为了确信,请想象或绘制一个包含一条垂直线的最小矩形,当该线旋转,例如,45° 时。

内置 GUI

display 命令默认安装,可以作为许多工具的 GUI。使用它可以在任何 X 服务器上显示图像或图像序列。在其窗口打开后,除非 X 服务器被有意配置为其他方式,否则按下鼠标左键会弹出一个菜单供您操作。

截图

使用 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 Window 管理器。为避免覆盖先前的屏幕截图,当前日期被用作文件名。

#!/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

强烈建议阅读 Encrypting Images 的讨论,了解此类命令的各种问题和建议。

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

$ identify -verbose image.png

总的来说,测试光栅图像是否被加密可以通过检查像素组件的分布来完成。如果它超过某个阈值,则数据可以被认为是随机的,并且可能是加密的候选者。然而,例如,使用 Diamond-square algorithm 创建的图像可能会产生误报。

从图像创建 PDF

请参阅 PDF, PS and DjVu#从图像创建 PDF。背景信息请参阅 stackexchange 线程

参见