ImageMagick 版本 7 • 高動態範圍成像 • 像素通道 • Alpha • 灰階 • 遮罩 • MagickCore API • 標頭檔 • 已移除的已棄用功能 • 命令列介面 • 效能改進 • 版本 7 變更摘要
ImageMagick 的設計是一個演進過程,設計和實作工作會相互影響和引導進一步的進展。在 ImageMagick 版本 7 中,我們根據從版本 6 實作中汲取的教訓改進了設計。ImageMagick 最初設計用於將 RGB 影像顯示到 X Windows 伺服器。隨著時間的推移,我們擴展了對 RGBA 影像的支援,然後擴展到 CMYK 和 CMYKA 影像格式。在 ImageMagick 版本 7 中,我們將支援擴展到具有任意數量的像素通道的任意色彩空間。此外,ImageMagick 7 將像素通道儲存為浮點數,允許帶外值(例如負值)並減少捨入誤差。還有許多其他設計增強功能在本文中有描述。
為了在 MagickCore API 中支援可變像素通道,在取得或設定像素通道時,像素處理已更改。您可以將通道作為陣列 pixel[i] 訪問,或使用訪問器方法(例如 GetPixelRed() 或 SetPixelRed())。MagickCore 和 MagickWand API 有一些小的變化。Magick++ 和 PerlMagick API 沒有變化,與 ImageMagick 版本 6 相符。
ImageMagick 版本 7 的 shell API(命令列)進行了重大改進,特別強調了不僅可以從命令列讀取「選項」,還可以從腳本和檔案流讀取「選項」。這允許使用「協同處理」程式設計技術或使用「守護程式/伺服器後端」甚至多機分散式處理來執行影像處理。
隨著 shell API 的改進,還進行了其他改進,包括:更好地報告哪些選項失敗、選項的合併和棄用,以及更多地全局使用「影像屬性」(在選項參數中更常稱為「百分比轉義」)。
ImageMagick 版本 7 現在可以作為 正式版 使用。
現在 ImageMagick 版本 7 已經發布,我們將繼續支援版本 6 至少 10 年。對版本 6 的支援主要限於錯誤修復和安全修補程式,幾乎沒有增強功能。
高動態範圍成像
ImageMagick 版本 7 預設啟用 高動態範圍成像 (HDRI)。HDRI 準確地表示真實場景中發現的廣泛強度級別,從最亮的直射陽光到最深的陰影。此外,影像處理結果更加準確。缺點是它需要更多記憶體,並且可能會導致處理時間變慢。如果您發現版本 6 命令列與版本 7 的結果存在差異,則可能是由於 HDRI 造成的。您可能需要在命令列中添加 -clamp 以將像素限制在 0 .. QuantumRange 範圍內,或者在構建 ImageMagick 版本 7 時禁用 HDRI。要禁用 HDRI(建議用於智慧型手機版本,例如 iOS 或效能至關重要的生產站點),只需在構建 ImageMagick 時在 configure 腳本命令列中添加 --disable-hdri。
像素通道
像素由一個或多個顏色值或 通道 組成(例如,紅色像素通道)。
舊版的 ImageMagick(4-6)支援 4 到 5 個像素通道(RGBA 或 CMYKA)。前 4 個通道可透過 PixelPacket 資料結構存取。該結構包含 4 個 Quantum 類型(通常為 16 位元)的成員,分別代表紅色、綠色、藍色和不透明度。黑色通道或調色盤索引則由另一個方法和結構 IndexPacket 支援。例如,以下程式碼片段取自 ImageMagick 版本 6,它會反轉圖像像素的顏色分量(但不包括 Alpha 分量)
for (y=0; y < (ssize_t) image->rows; y++) { IndexPacket *indexes; PixelPacket *q; q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); if (q == (PixelPacket *) NULL) { status=MagickFalse; continue; } indexes=GetCacheViewAuthenticIndexQueue(image_view); for (x=0; x < (ssize_t) image->columns; x++) { if ((channel & RedChannel) != 0) q->red=(Quantum) QuantumRange-q->red; if ((channel & GreenChannel) != 0) q->green=(Quantum) QuantumRange-q->green; if ((channel & BlueChannel) != 0) q->blue=(Quantum) QuantumRange-q->blue; if (((channel & IndexChannel) != 0) && (image->colorspace == CMYKColorspace)) indexes[x]=(IndexPacket) QuantumRange-indexes[x]; q++; } if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) status=MagickFalse; }
ImageMagick 版本 7 支援從 1 到 64 個(甚至更多)的任意數量通道,並簡化了存取方式,只使用單一方法即可傳回 Quantum 類型的像素通道陣列。針對先前版本的 ImageMagick 編譯的原始碼需要重構才能與 ImageMagick 版本 7 搭配使用。我們將透過一個範例來說明。讓我們先簡單地重構上述版本 6 的程式碼片段,使其能與 ImageMagick 版本 7 API 搭配使用
for (y=0; y < (ssize_t) image->rows; y++) { Quantum *q; q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); if (q == (Quantum *) NULL) { status=MagickFalse; continue; } for (x=0; x < (ssize_t) image->columns; x++) { if ((GetPixelRedTraits(image) & UpdatePixelTrait) != 0) SetPixelRed(image,QuantumRange-GetPixelRed(image,q),q); if ((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0) SetPixelGreen(image,QuantumRange-GetPixelGreen(image,q),q); if ((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0) SetPixelBlue(image,QuantumRange-GetPixelBlue(image,q),q); if ((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0) SetPixelBlack(image,QuantumRange-GetPixelBlack(image,q),q); if ((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0) SetPixelAlpha(image,QuantumRange-GetPixelAlpha(image,q),q); q+=GetPixelChannels(image); } if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) status=MagickFalse; }
讓我們再做一次,但這次要充分利用新的可變像素通道支援
for (y=0; y < (ssize_t) image->rows; y++) { Quantum *q; q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); if (q == (Quantum *) NULL) { status=MagickFalse; continue; } for (x = 0; x < (ssize_t) image->columns; x++) { ssize_t i; if (GetPixelWriteMask(image,q) <= (QuantumRange/2)) { q+=GetPixelChannels(image); continue; } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel channel = GetPixelChannelChannel(image,i); PixelTrait traits = GetPixelChannelTraits(image,channel); if ((traits & UpdatePixelTrait) == 0) continue; q[i]=QuantumRange-q[i]; } q+=GetPixelChannels(image); } if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) status=MagickFalse; }
請注意,我們如何使用 GetPixelChannels() 前進到下一組像素通道。
調色盤索引和黑色像素通道(適用於 CMYK 色彩空間)不再儲存在索引通道中,先前是透過 GetAuthenticIndexQueue() 和 GetCacheViewAuthenticIndexQueue() 存取。現在,它們已成為第一類像素通道,可以作為像素陣列的成員(例如 pixel[4])或透過方便的像素存取器方法 GetPixelIndex()、SetPixelIndex()、GetPixelBlack() 和 SetPixelBlack() 進行存取。
由於對可變像素通道使用陣列結構,自動向量化編譯器有更多機會可以加速像素迴圈。
IMv6 中的 `sync` 通道實際上是一個標記,而不是一個通道。在 IMv7 中,我們改用標記:-define compose:sync=false。
像素存取器
您可以將像素通道作為陣列元素存取(例如 pixel[1]),或使用方便的存取器來取得或設定像素通道
GetPixela() SetPixela() GetPixelAlpha() SetPixelAlpha() GetPixelb() SetPixelb() GetPixelBlack() SetPixelBlack() GetPixelBlue() SetPixelBlue() GetPixelCb() SetPixelCb() GetPixelCr() SetPixelCr() GetPixelCyan() SetPixelCyan() GetPixelGray() SetPixelGray() GetPixelGreen() SetPixelGreen() GetPixelIndex() SetPixelIndex() GetPixelL() SetPixelL() GetPixelMagenta() SetPixelMagenta() GetPixelReadMask() SetPixelReadMask() GetPixelWriteMask() SetPixelWriteMask() GetPixelMetacontentExtent() SetPixelMetacontentExtent() GetPixelOpacity() SetPixelOpacity() GetPixelRed() SetPixelRed() GetPixelYellow() SetPixelYellow() GetPixelY() SetPixelY()
您可以在標頭檔 MagickCore/pixel-accessor.h 中找到這些存取器的定義
像素特性
每個像素通道都包含一或多個以下特性
- 未定義
- 此像素通道沒有關聯的特性
- 複製
- 不要更新此像素通道,只需複製它
- 更新
- 更新此像素通道
- 混合
- 如果已啟用 Alpha 遮罩,則將此像素通道與 Alpha 遮罩混合
我們提供以下方法來設定和取得像素特性
GetPixelAlphaTraits() SetPixelAlphaTraits() GetPixelBlackTraits() SetPixelBlackTraits() GetPixelBlueTraits() SetPixelBlueTraits() GetPixelCbTraits() SetPixelCbTraits() GetPixelChannelTraits() SetPixelChannelTraits() GetPixelCrTraits() SetPixelCrTraits() GetPixelGrayTraits() SetPixelGrayTraits() GetPixelGreenTraits() SetPixelGreenTraits() GetPixelIndexTraits() SetPixelIndexTraits() GetPixelMagentaTraits() SetPixelMagentaTraits() GetPixelRedTraits() SetPixelRedTraits() GetPixelYellowTraits() SetPixelYellowTraits() GetPixelYTraits() SetPixelYTraits()
為了方便起見,您可以使用通道遮罩和以下方法為一組像素通道設定活動特性
SetImageChannelMask()
先前 MagickCore 方法具有通道類比,例如 NegateImage() 和 NegateImageChannels()。通道類比方法不再是必要的,因為像素通道特性會指定是要對特定像素通道採取行動,還是要與 Alpha 遮罩混合。例如,不要使用
NegateImageChannel(image,channel);
我們使用
channel_mask=SetImageChannelMask(image,channel); NegateImage(image,exception); (void) SetImageChannelMask(image,channel_mask);
像素使用者通道
在版本 7 中,我們引入了像素使用者通道。傳統上我們使用 4 個通道:紅色、綠色、藍色和 Alpha。對於 CMYK,我們還有一個黑色通道。使用者通道旨在包含對您的應用程式有意義的任何其他通道資訊。一些範例包括 TIFF 或 PSD 圖像中的額外通道,或者您可能需要一個包含像素紅外線資訊的通道。您可以將特性與使用者通道關聯,以便在圖像處理演算法(例如模糊)對其進行操作時,像素會被複製、由演算法處理,甚至與 Alpha 通道混合(如果這樣做有意義)。
像素中繼內容
在版本 7 中,我們引入了像素中繼內容。中繼內容是關於內容的內容。因此,它不是內容本身,而是描述內容或與內容相關聯的內容。這裡的內容是像素。像素中繼內容供您專屬使用(在內部,資料只會被複製,不會被修改),並且可以使用以下 MagickCore API 方法進行存取
SetImageMetacontentExtent() GetImageMetacontentExtent() GetVirtualMetacontent() GetAuthenticMetacontent() GetCacheViewAuthenticMetacontent() GetCacheViewVirtualMetacontent()
Alpha
我們現在支持 Alpha,取代先前的 Opacity。使用 Alpha 時,值 0 表示像素没有任何覆盖信息且是透明的;也就是說,由於幾何形狀沒有重疊此像素,因此没有任何幾何形狀的顏色貢獻。值 QuantumRange 表示像素是不透明的,因為幾何形狀完全重疊了像素。因此,在版本 7 中,PixelInfo 結構成員 Alpha 已取代先前的 Opacity 成員。另一個結果是,十六進制符號中 sRGB 值的 Alpha 部分現在是相反的(例如,#0000 是完全透明的)。
色彩空間
不再支持 Rec601Luma 和 Rec709Luma 色彩空間。請改用指定 gray 色彩空間並從以下強度選項中選擇
Rec601Luma Rec601Luminance Rec709Luma Rec709Luminance
舉例來說:
magick myImage.png -intensity Rec709Luminance -colorspace gray myImage.jpg
灰階
以前,灰階影像是 Rec601Luminance 並佔用 4 個通道:紅色、綠色、藍色和 Alpha。在版本 7 中,灰階只佔用 1 個通道,因此所需的資源少得多。
遮罩
版本 7 支持大多數影像運算符的遮罩。讀取遮罩中的白色像素會忽略影像中對應的像素,而寫入遮罩中的白色像素會保護影像中對應的像素。在命令列中,可以使用 -read-mask 和 -write-mask 選項將遮罩與影像關聯。此極性與 ImageMagick 版本 6 中的遮罩相符,以便輕鬆移植您的工作流程。為了方便起見,我們在版本 7 中繼續支持 -mask 選項,以匹配版本 6 的行為。
在此範例中,我們計算遮罩重建影像的失真
compare -metric rmse -read-mask hat_mask.png hat.png wizard.png difference.png
在這裡,我們保護某些像素不被更改
magick rose: -write-mask rose_bg_mask.png -modulate 110,100,33.3 +write-mask rose_blue.png
與影像關聯的遮罩會持續存在,直到被修改或移除為止。這可能會在複雜的命令列中產生意外結果。在這裡,我們只想在應用 Alpha 選項時裁剪,而不是調整大小
convert -density 300 -colorspace srgb image.eps -alpha transparent -clip -alpha opaque +clip -resize 1000x1000 -strip image.png
MagickCore API
以下是 MagickCore API 的變更清單
- 現在幾乎所有影像處理演算法都具有通道感知能力。
- MagickCore API 為版本 6 中缺少它的方法添加了 ExceptionInfo 參數,例如 NegateImage(image,MagickTrue,exception)
- 所有方法通道類比都已移除(例如 BlurImageChannel()),它們不再需要,請改用像素特徵。
- 公用和私有 API 呼叫現在使用 GCC 可見性屬性聲明。MagickCore 和 MagickWand 動態程式庫現在只匯出公用結構和函數聲明。
- InterpolatePixelMethod 列舉現在是 PixelInterpolateMethod。
- IntegerPixel 儲存類型已移除(請改用 LongPixel),並添加了 LongLongPixel
- 影像簽章已更改,以考慮可變像素通道。
- 所有顏色封包結構,PixelPacket、LongPacket 和 DoublePacket,都合併為單一顏色結構 PixelInfo。
- ChannelMoments 結構成員 I 現在是 invariant。I 與 complex.h 標頭衝突。
- 我們在 FormatMagickSize() 中添加了一個長度參數,以允許可變長度緩衝區。
MagickWand API
以下是 MagickWand API 的變更清單
- 現在幾乎所有影像處理演算法都具有通道感知能力。
- DrawMatte() 方法現在稱為 DrawAlpha()。
- 不再支持 MagickSetImageBias() 和 MagickSetImageClipMask() 方法。
Magick++ API
以下是 Magick++ API 的變更清單
- 現在幾乎所有影像處理演算法都具有通道感知能力。
- 舉例來說,使用此構造可避免對 Alpha 通道進行操作
image.negateChannel(Magick::ChannelType(Magick::CompositeChannels ^ Magick::AlphaChannel));
標頭檔案
先前版本的 ImageMagick (4-6) 將 ImageMagick 標頭檔案引用為 magick/ 和 wand/。ImageMagick 7 則分別使用 MagickCore/ 和 MagickWand/。舉例來說:
#include <MagickCore/MagickCore.h> #include <MagickWand/MagickWand.h>
已移除不建議使用的功能
ImageMagick 版本 6 中所有不建議使用的功能已在版本 7 中移除。這些功能包括 Magick-config 和 Wand-config 設定公用程式。請改用
MagickCore-config MagickWand-config
FilterImage() 方法已被移除。請改用 ConvolveImage()。
此外,所有已棄用的 MagickCore 和 MagickWand 方法在版本 7 中不再可用。
Bessel 濾鏡已被移除,因為它是 Jinc 的別名。請改用 -filter Jinc。
殼層 API 或命令列介面
如前所述,殼層 API 或命令列介面變更的主要重點是抽象化,以便不僅可以從命令列參數中讀取 選項,還可以從檔案(腳本)或檔案串流(互動式命令或協同處理)中讀取。
為此,需要重新編寫 CLI 解析器,以便始終以嚴格的「所見即所得」順序執行所有選項。在 IMv6 中,選項以前是按組執行的(稱為「FireOptions」),現在這種 awkwardness 已不復存在。但是,嚴格的順序意味著您不能再在提供要操作的影像之前提供操作。否則會產生錯誤。
錯誤報告現在會準確報告是哪個選項(根據命令列上的參數計數,或腳本中的行、列)導致了「異常」。這項功能尚未完成,但正在改進中。此外,「regard-warnings」處理或其替代方案也尚未完成,這將允許您忽略報告的錯誤並繼續處理(視錯誤而定)協同處理或互動式使用。
使用由 `magick` 工具啟動的 IMv7 解析器,設定會依序套用至記憶體中的每個影像(如果有的話)。雖然選項:只需要在全域套用一次。直接使用其他工具,或作為 `magick` CLI 的參數(例如 `magick`)會使用舊版解析器。
用於將當前影像清單和影像設定(例如:'(' 和 ')')「推送」到堆疊的括號選項現在有一個完全獨立的影像設定堆疊。也就是說,括號「推送/拉取」影像清單,而大括號(例如:'{' 和 '}')將「推送/拉取」影像設定。
當然,由於先前報告的底層通道處理變更,幾乎所有選項都會產生許多副作用。以下是一些具體的例子
大多數演算法會更新紅色、綠色、藍色、黑色(對於 CMYK)和 Alpha 色板。大多數運算子會將 Alpha 與其他顏色通道混合,但其他運算子(和情況)可能需要停用此混合,目前的方法是透過 -channel 選項從活動通道中移除 Alpha。(例如 magick castle.gif -channel RGB -negate castle.png)。
讀取灰階影像會產生只有一個通道的影像。如果該影像要接受顏色,則需要套用 -colorspace 設定,將一個通道擴展為獨立的 RGB(或其他)通道。
以前,命令列參數限制為 4096 個字元,在 ImageMagick 版本 7 中,限制已增加到 131072 個字元。
命令變更
以下是 ImageMagick 命令的變更清單
- magick
- **重要提示:「magick」命令是殼層 API 的新主要命令,取代了舊的「convert」命令**。這允許您建立「magick 腳本」,格式為「#!/path/to/command/magick -script」,或將選項透過管道傳輸到命令「magick -script -」中,作為背景程序。
- magick-script
- 這與「magick」相同(只有命令名稱不同),但它有一個隱含的「-script」選項。這允許您在「env」樣式的腳本格式中使用它。也就是說,magick 腳本以「#!/usr/bin/env magick-script」的「she-bang」行開頭,允許在使用者命令「PATH」的任何位置找到腳本直譯器。這是為了避免大多數 UNIX 系統(包括 Linux,但不包括 MacOSX)上常見的「單一參數 she-bang 錯誤」所必需的。
- animate、compare、composite、conjure、convert、display、identify、import、mogrify、montage、stream
- 為了減少命令列工具的占用空間,這些工具是指向 magick 工具的符號連結。在 Windows 上,這些工具作為單獨的可執行檔安裝,並且不再包含舊版 convert 可執行檔。您也可以從 magick 工具中呼叫它們,例如,使用 magick logo: logo.png 呼叫 magick 工具。(換句話說,通過在這些工具前面加上 magick 來呼叫它們,例如 magick compare、magick identify、magick mogrify、magick montage 等。不要使用 magick convert。它就是 magick)
行為變更
影像設定會套用至命令列上的每個影像。若要將設定與特定影像關聯,請使用括號來消除歧義。在此範例中,我們為每個影像指定一個唯一的頁面偏移量
magick \( -page +10+20 first.png \) \( -page +100+200 second.png \) ...
根據預設,捲積等影像操作會將 Alpha 與每個通道混合。若要獨立捲積每個通道,請停用 Alpha 通道,如下所示
magick ... -alpha discrete -blur 0x1 ...
若要從影像中移除 Alpha 值,請使用 -alpha off。如果您想要保留 Alpha 通道,但不要混合某些影像處理操作的 Alpha 像素,請改用 -alpha deactivate。
ImageMagick 版本 7 中的某些選項已變更。這些選項包括
- -channel
- 預設值是更新 RGBA 通道,而在 IMv6 中,預設值是 RGB。如果您得到的結果與 IMv6 不同,您可能需要在命令列上指定 -channel RGB(例如 -channel RGB -negate)。
- +combine
- 此選項現在需要一個參數,即影像色彩空間(例如 +combine sRGB)。
- -format
- 不再支援 %Z 影像屬性。
- -gamma
- 不再支援多個 Gamma 參數(例如 -gamma 1,2,3),請改用 -channel(例如 -channel blue -gamma 2))。
- -region
- 此選項會為您定義的區域設定寫入遮罩。在 IMv6 中,會複製一個單獨的影像,然後對其進行操作,並將結果合成到原始影像。此外,繪製變換是相對於影像的左上角,而在 IMv6 中,它們是相對於區域的。
使用 -define morphology:showKernel=1 來發佈形態學或捲積核心。以前是 -define showKernel=1。
新增選項
ImageMagick 版本 7 支援這些新增選項,但大多數選項僅限於 "magick" 命令,或在 "magick" 腳本中使用。
- { ... }
- 儲存(和還原)目前的影像設定(內部稱為「image_info」結構)。如果已設定 "-regard-parenthesis",則會使用括號(例如:'(' 和 ')')自動完成此操作,就像在 IMv6 中一樣。建議小心使用,以防止出現不平衡大括號錯誤。
- --
- 選項結束,用於 IMv7 "mogrify" 命令中,明確區分要套用的操作和要「就地」處理的影像。(尚未實作)。但是,如果未提供,"-read" 仍然可以用於區分次要影像讀取(用於 Alpha 合成等)和正在處理的「就地」影像。在其他命令(例如 "magick")中,它等效於將下一個選項顯式 "-read"(見下文)作為影像(就像在 IMv6 中一樣)。
- -alpha activate/deactivate
- 分別啟用和停用 Alpha 通道,並具有持久性。這類似於 Imagemagick 6 中的 on/off。在 Imagemagick 7 中,-alpha off 將永久移除 Alpha 通道,因此 -alpha on 將無法重新啟用它。
- -alpha discrete
- 獨立處理 Alpha 通道(不混合)。
- -channel-fx expression
-
交換、提取或複製一個或多個影像通道。
運算式由一個或多個通道組成,可以是助記符或數字(例如紅色或 0,綠色或 1 等),並由以下特定運算符號分隔
<=> exchange two channels (e.g. red<=>blue) => copy one channel to another channel (e.g. red=>green) = assign a constant value to a channel (e.g. red=50%) , write new image with channels in the specified order (e.g. red, green) ; add a new output image for the next set of channel operations (e.g. red; green; blue) | move to the next input image for the source of channel data (e.g. | gray=>alpha)
例如,若要從影像的紅色、綠色和藍色通道建立 3 個灰階影像,請使用
-channel-fx "red; green; blue"
沒有運算符號的通道意味著分隔(即分號)。
在這裡,我們採用一張 sRGB 圖像和一張灰度圖像,並將灰度圖像注入 alpha 通道
magick wizard.png mask.pgm -channel-fx '| gray=>alpha' wizard-alpha.png
使用類似的命令定義讀取遮罩
magick wizard.png mask.pgm -channel-fx '| gray=>read-mask' wizard-mask.png
在 -channel-fx 選項之前添加 -debug pixel 以追蹤通道形態。
- -exit
- 在此時停止處理。在此選項之後,將不再處理任何其他選項。可以在腳本中使用此選項強制 "magick" 命令退出,而實際上並不關閉正在處理選項的管道。也可以在 "magick" 命令行的「最後」選項中使用此選項,而不是隱式輸出圖像,以完全防止任何圖像寫入。順帶一提:即使是 "NULL:" 編碼器也至少需要一張圖像才能「不寫入」!此選項完全不需要任何圖像。
- -read {image}
- 顯式讀取圖像,而不是隱式讀取。這使您可以從以「選項」字符開頭的文件名中讀取,否則這些文件名可能會被誤認為是選項(未知的或其他的)。這最終將在 "mogrify" 中使用,以允許讀取輔助圖像,並允許在該命令中使用圖像列表操作。
- -read-mask
- 防止更新遮罩指定的圖像像素
- -region
- 在 ImageMagick 7.0.2-6 及更高版本中支持
- -script {file}
- 在 "magick" 中,停止將命令行參數作為圖像操作進行處理,並從給定的文件或管道中讀取所有其他選項。
- -write-mask
- 防止像素被寫入。
已變更的選項
已知這些選項以某種方式發生了變化。
- -bias
- 不再識別該選項。請改用 -define convolve:bias=value。
- -draw
- matte 圖元現在是 alpha(例如 -draw 'alpha 0,0 floodfill')。
- -negate
- 目前會反轉所有通道,包括 alpha(如果存在)。因此,您可能需要使用 -channel 選項來防止 alpha 反轉(例如 -channel RGB -negate)。
- -preview
- 此選項現在是一個圖像運算符。PREVIEW 圖像格式已被移除。
已棄用警告,但仍可使用(目前)
- -affine
- 已替換為 -draw "affine ..."。(請參閱變換)
- -average
- 已替換為 -evaluate-sequence Mean。
- -box
- 已替換為 -undercolor。
- -deconstruct
- 已替換為 -layers CompareAny。
- -gaussian
- 已替換為 -gaussian-blur。
- -/+map
- 已替換為 -/+remap。
- -/+mask
- 已替換為 -/+read-mask、-/+write-mask。
- -/+matte
- 已替換為 -alpha Set/Off。
- -transform
- 已替換為 -distort Affine "..."。
已棄用警告,並被忽略(目前)
幾乎所有沒有任何作用的「加號」(+) 選項都已標記為已棄用,並且不做任何事情。它甚至沒有關聯的代碼。例如 "+annotate"、"+resize"、"+clut" 和 "+draw"。
- -affinity
- 已替換為 -remap。
- -maximum
- 已替換為 -evaluate-sequence Max。
- -median
- 已替換為 -evaluate-sequence Median。
- -minimum
- 已替換為 -evaluate-sequence Min。
- -recolor
- 已替換為 -color-matrix。
已移除/已替換的選項(「無此選項」錯誤並中止)
- -interpolate filter
- 移除緩慢且無用的插值方法
- -origin
- 舊選項,含義未知。
- -pen
- 已替換為 -fill。
- -passphrase
- 舊選項,含義未知
效能改進
對灰度圖像的操作得到了顯著改進,因為只需要一個通道。以前,灰度需要三個通道。
-fx 選項的效能提升了一到兩個數量級。
版本 7 變更摘要
此處總結了 ImageMagick 從版本 6 到版本 7 的變更
高動態範圍成像
- ImageMagick 版本 7 預設啟用 HDRI。預期在記憶體需求較高且處理時間可能較慢的情況下,影像處理結果會更加準確。您可以在資源受限的系統(例如手機)上停用此功能,但某些演算法(例如調整大小)的準確性會稍微降低。
像素
- 像素不再使用 PixelPacket 結構成員(例如紅色、綠色、藍色、不透明度)來定址,而是作為通道陣列(例如 pixel[PixelRedChannel])。
- 使用便利的巨集來存取像素通道(例如 GetPixelRed()、SetPixelRed())。
- CMYK 色彩空間的黑色通道不再儲存在索引通道中,以前可以使用 GetAuthenticIndexQueue() 和 GetCacheViewAuthenticIndexQueue() 來存取。現在,它是一個像素通道,可以使用便利的像素巨集 GetPixelBlack() 和 SetPixelBlack() 來存取。
- 彩色映射影像的索引通道不再儲存在索引通道中,以前可以使用 GetAuthenticIndexQueue() 和 GetCacheViewAuthenticIndexQueue() 來存取。現在,它是一個像素通道,可以使用便利的像素巨集 GetPixelIndex() 和 SetPixelIndex() 來存取。
- 使用 GetPixelChannels() 前進到下一組像素通道。
- 使用 metacontent 通道將中繼內容與每個像素相關聯。
- 所有顏色封包結構,PixelPacket、LongPacket 和 DoublePacket,都合併為單一顏色結構 PixelInfo。
Alpha
- 我們支援 Alpha 而不是不透明度(0 透明;QuantumRange 不透明)。
- 使用 GetPixelAlpha() 或 SetPixelAlpha() 來取得或設定 Alpha 像素通道值。
灰階
- 在 ImageMagick 版本 7 中,灰階影像會佔用一個像素通道。若要處理 RGB,請將色彩空間設定為 RGB(例如 -colorspace sRGB)。
遮罩
- ImageMagick 版本 6 僅在有限的情況下支援讀取遮罩。版本 7 支援讀取和寫入遮罩。大多數影像處理演算法都會採用讀取遮罩。
MagickCore API
- 現在幾乎所有影像處理演算法都具有通道感知能力。
- MagickCore 版本 7 在版本 6 中缺少 ExceptionInfo 引數的方法中新增了該引數,例如 NegateImage(image,MagickTrue,exception);
- 所有方法通道類比都已移除(例如 BlurImageChannel()),它們不再需要,請改用像素特徵。
- 公用和私有 API 呼叫現在使用 GCC 可見性屬性聲明。MagickCore 和 MagickWand 動態程式庫現在只匯出公用結構和函數聲明。
- InterpolatePixelMethod 列舉現在是 PixelInterpolateMethod。
- 為了說明可變像素通道,影像現在可能會傳回不同的簽章。
已淘汰的方法
- 所有 ImageMagick 版本 6 的 MagickCore 和 MagickWand 已淘汰的方法都已移除,並且在 ImageMagick 版本 7 中不再可用。
- 所有 MagickCore 通道方法類比都已移除(例如 NegateImageChannels())。對於版本 7,請改用像素特性。
- FilterImage() 方法已被移除。請改用 ConvolveImage()。