跳至內容
出自 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 帖子

另見