ImageMagick 範例 --
裁剪和加邊框

索引
ImageMagick 範例 前言和索引
裁剪 (以自由形式裁切影像)
新增/移除影像邊緣
新增/移除行、列和邊緣
進階裁剪技巧
修剪,「自動裁剪」操作
在這裡,我們將探討 ImageMagick 操作,這些操作允許您對影像進行裁剪,並在影像周圍添加框架和邊框。也就是說,我們將探討在不縮放影像內容的情況下改變影像尺寸的操作。您可能會認為這是一個簡單的操作,的確如此。它非常簡單,以至於 IM 提供了大量的方法來實際執行此任務。方法之多,以至於我需要專門用一個頁面來演示它們。

裁剪(將影像裁剪到所需尺寸)

裁剪和畫布頁面

-crop」影像操作只會在您透過其幾何參數指定的尺寸和位置裁剪當前序列中所有影像的部分。

  magick rose:                   rose.gif
  magick rose: -crop 40x30+10+10  crop.gif
  magick rose: -crop 40x30+40+30  crop_br.gif
  magick rose: -crop 40x30-10-10  crop_tl.gif
  magick rose: -crop 90x60-10-10  crop_all.gif
  magick rose: -crop 40x30+90+60  crop_miss.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
為了讓您可以準確檢查發生的情況,以下是上述裁剪結果的「magick identify」輸出。

  magick identify rose: crop.gif crop_br.gif crop_tl.gif \
                 crop_all.gif crop_miss.gif
[IM Text]
請注意,顯示影像的大小(其虛擬畫布)並未受到「-crop」操作的影響。實際影像本身已被裁剪,並且可能會變小,但是顯示 GIF 影像的畫布大小仍然與原始畫布相同。您還會注意到,產生的實際影像大小可能與您從裁剪中要求的實際大小不同。它可能會比您預期的要小得多,因為裁剪本身可能部分或完全位於要裁剪的實際影像區域之外。您還會注意到,在許多情況下,虛擬畫布上影像的「偏移量」也發生了變化,以便裁剪後的影像像素仍然與原始影像中的位置完全相同。也就是說,即使實際影像本身較小,影像內容本身也不會移動。這表示如果您現在修改較小的影像,然後將影像(使用影像圖層運算子)疊回原始影像上,它將完全符合子影像最初來源的位置。也就是說,IM 會保留影像的「虛擬畫布」、「頁面」或「圖層」資訊,以便保存以供日後使用。這對於正確處理 GIF 動畫尤其重要。有關這方面的更多資訊,請參閱解構 GIF 動畫
GIF 影像會積極使用 IM 裁剪的影像中的「頁面」或「虛擬畫布」、大小和偏移量資訊。如果您不想要此資訊,請在「-crop」之後立即使用「+repage」將其移除。

請注意,許多影像格式不會儲存此虛擬頁面/畫布資訊,因此儲存為此類格式會自動將其移除。JPEG 就是移除此資訊的典型格式範例。

PNG 格式不會大量使用頁面/畫布資訊(多 PNG (MNG) 格式除外),但它會儲存頁面偏移量資訊(甚至是負偏移量)。IM 還會添加少量中繼資料,以保留虛擬畫布大小,以便其他 IM 命令日後使用。

由於這種保留,我強烈建議您即使在儲存為 JPEG 或其他無頁面影像格式時,仍然應用「+repage」,以作為預防措施,並明確表示您不需要該資訊。

請注意,裁剪行為可能會受到這些定義的影響

trim:percent-background=X% 設定邊緣可容忍的背景數量。它以百分比表示。0% 表示不容忍任何背景。50% 表示邊緣最多可以包含 50% 的像素是根據模糊因素確定的背景。
trim:edges={north,east,south,west} 僅裁剪影像的指定邊緣。
trim:minSize=geometry 將裁剪限制為指定的大小。
type:features=string 添加要在複雜文字排版期間由 RAQM 代理使用的字體功能。這通常用於開啟預設情況下未啟用的可選字體功能,但也可以用於關閉預設字體功能。功能包括控制字距調整、連字和阿拉伯語的功能。
type:hinting=false 停用字體提示。正確的字形渲染需要透過通常稱為提示的操作,將縮放的點沿著目標裝置像素網格對齊。其主要目的之一是確保在整個字體中都遵守重要的寬度和高度。(例如,通常希望「I」和「T」字形的中心垂直線具有相同的像素寬度。提示還管理著筆畫和超出的功能,這些功能在像素尺寸較小時可能會導致問題。

遺失的影像 (裁剪錯誤所致)

上面範例中的最後一張圖片(例如:"crop_miss.gif")也會產生特殊的空白圖片。這些圖片可能由產生空白或無意義結果的操作產生,例如 裁剪修剪圖層比較,甚至是 GIF 動畫最佳化。例如,在上面的前一個範例中,"-crop" 操作錯過了它要裁剪的實際圖片,因此它產生了這個特殊的「遺漏」圖片,以及一些資訊性的警告訊息...
[IM Text]
輸出圖片或「遺漏」圖片是一個最小圖片,大小為 1 個像素,偏移量為 0,但具有原始圖片的頁面或畫布大小,以及圖片可能關聯的任何其他中繼資料。在這裡,它代表了應該由 "-crop" 返回的「空白」或「零大小」圖片,但由於沒有圖片格式可以輸出「零」維度的圖片,因此改用單一透明像素圖片。為了讓您看得更清楚,以下是遺漏圖片的 "identify" 輸出,以及該單一像素圖片的「IM 像素列舉」,顯示它只包含一個單一透明像素。

  magick identify crop_miss.gif
[IM Text]

  magick crop_miss.gif  crop_miss_data.txt
[IM Text]
這個「遺漏」圖片基本上與建立 "null:" 圖片相同,但設置了原始來源圖片的頁面或虛擬畫布大小(但沒有設置其偏移量),以及所有其他圖片中繼資料,例如 GIF 動畫時間延遲。但是,GIF 處置方法可能會修改,以確保在裁剪後動畫保持正確。基本上,您需要記住 "-crop" 和其他類似的相關運算子可能會產生特殊的「遺漏」圖片。因此,在使用 IM 編寫腳本時,如果可能出現這種最小圖片並可能導致問題,您應該計劃查找警告訊息或這個特殊的「遺漏圖片」。如果您不想要警告訊息(例如,您預期並處理偶爾出現的「遺漏」圖片),您可以將 "-quiet" 操作控制設定 添加到命令列。這會告訴 IM 不要輸出資訊性警告訊息,只輸出真正的錯誤。目前沒有方法可以從目前的圖片序列中移除任何「遺漏」或 "null:" 圖片。但是,已經針對未來版本的 IM 提出了這樣的方法。如果您發現需要這種方法,請寫信給我。

裁剪具有現有虛擬畫布的圖片

如果圖片已經具有現有的 虛擬畫布(例如 GIF 動畫的影格),則 "-crop" 操作將應用於虛擬畫布,而不是實際圖片。也就是說,它會嘗試保留裁剪後的圖片在畫布上的實際像素資料偏移量。也就是說,裁剪前的特定像素在裁剪後應該仍然位於相對於虛擬畫布的相同偏移量處。通過這種方式,即使「畫布」本身沒有被裁剪,分層圖片或 GIF 動畫的裁剪也將繼續正常工作。在這裡,我們在頁面畫布上建立了一個居中的圖片,並以各種方式裁剪它。和以前一樣,操作不會修改畫布大小本身。

  magick rose: -shave 12x0 -repage 64x64+9+9  paged.gif
  magick paged.gif -crop 32x32+16+16  crop_page.gif
  magick paged.gif -crop 32x32+0+0    crop_page_tl.gif
  magick paged.gif -crop 32x32+32+32  crop_page_br.gif
  magick paged.gif -crop 60x60+2+2    crop_page_all.gif
  magick paged.gif -quiet -crop 32x32+56+56  crop_page_miss.gif

magick identify paged.gif crop_page.gif crop_page_tl.gif crop_page_br.gif \ crop_page_all.gif crop_page_miss.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
[IM Text]
上面最後一個例子當然是特殊的 遺漏圖片。請注意,我使用 "-quiet" 設定抑制了來自 IM 的正常警告訊息。為了讓您清楚地看到發生了什麼,讓我們仔細看看圖片右下角的頁面裁剪。在這裡,我在被裁剪的區域上繪製了一個半透明的正方形。

  magick paged.gif -page 64x64+32+32 -size 32x32 xc:'#fff8' \
          -alpha set  -background none  -mosaic    crop_area_br.png
[IM Output] ==> [IM Output] ==> [IM Output]
由此您可以看到發生了什麼事。儘管裁切區域完全包含在頁面畫布中,但裁切並沒有完全覆蓋實際圖像。結果是實際圖像比使用者預期的要小,但仍然定位在更大的畫布或頁面上。

從結果中移除虛擬畫布

如果不需要這個 虛擬畫布 資訊,則可以使用特殊的「+repage」運算子來重設頁面畫布和位置,使其與實際裁切後的圖像相符。

  magick rose: -crop 40x30+10+10  +repage  repage.gif
  magick rose: -crop 40x30+40+30  +repage  repage_br.gif
  magick rose: -crop 40x30-10-10  +repage  repage_tl.gif
  magick rose: -crop 90x60-10-10  +repage  repage_all.gif
  magick rose: -quiet  -crop 40x30+90+60  +repage  repage_miss.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
這當然是 IM 的新使用者通常期望從「-crop」運算子獲得的結果。這實際上是一件很常見的事情,您可以將其稱為經驗法則。
在任何類似「crop」的操作之後,請務必使用「+repage」。
除非您真的需要保留該資訊。
上面最後一張圖像當然是特殊的 裁切遺漏圖像,但我使用「-quiet」操作設定抑制了警告訊息。
對於 IM 5 版及更早版本,「+repage」操作是由「-page +0+0」參數序列處理的,通常是在保存為使用虛擬畫布和偏移資訊的格式(例如 GIF)之前。但這僅在將圖像讀取或寫入檔案時可用,無法在多個圖像處理操作之間使用。在 IM 6 版中,命令列重構,「-page」選項變成了純粹的圖像讀取/建立設定,用於建立 GIF 動畫圖層。因此,添加了單獨的「-repage」和「-set page」運算子,允許使用者設定或更改虛擬畫布資訊。

使用虛擬畫布調整進行視口裁切

從 ImageMagick 6.2.4-5 版開始,您可以在「-crop」參數中添加一個新的特殊標誌。這個標誌「!」將指示裁切調整返回圖像的 虛擬畫布 資訊,使其相對於裁切區域。換句話說,無論裁切後實際圖像的大小如何,返回圖像的畫布和偏移量都將調整為與您請求裁切的區域相符。您可以將此標誌視為將圖像裁切為與裁切區域的「視窗」或「視口」相匹配。即使一半的圖像在該「視窗」中不可見,返回部分的虛擬畫布和偏移量也將與該「視口」相符。例如...

  magick rose: -crop 40x30+10+10\!  crop_vp.gif
  magick rose: -crop 40x30+40+30\!  crop_vp_br.gif
  magick rose: -crop 40x30-10-10\!  crop_vp_tl.gif
  magick rose: -crop 90x60-10-10\!  crop_vp_all.gif
  magick rose: -quiet -crop 40x30+90+60\!  crop_vp_miss.gif

  magick identify rose.gif  crop_vp.gif crop_vp_br.gif crop_vp_tl.gif \
              crop_vp_all.gif  crop_vp_miss.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
[IM Text]
!」字元對某些 UNIX shell(如「csh」)具有特殊含義,即使放在引號內也必須使用反斜線進行跳脫。
請注意,返回圖像的畫布大小現在如何與裁切圖像的區域相符。對於完全在實際圖像內的圖像裁切,結果將等同於在裁切後使用「+repage」。但是,任何部分或遺漏的圖像裁切,結果都將是一個更大的畫布和可能對應圖像的偏移量。因此,這不能替代在裁切後執行「+repage」以重設頁面/畫布資訊。但是,您可以在「視口裁切」之後使用 拼合 來用真實像素「填充」圖像的新虛擬畫布。也就是說,您將獲得一張大小保證與請求裁切大小相同的圖像,並且任何「遺漏」的區域都將使用當前的「-background」顏色「視口」填充。
例如在 填充圖像 時。

  magick rose: -crop 100x100-15-25\! -background skyblue -flatten \
          crop_viewport.gif
[IM Output]
在視口裁剪後壓平圖像,實際上等同於使用「範圍運算符」(見下文)來提供「填充裁剪」。在裁剪 GIF 動畫時,「視口裁剪」標記也非常重要,因為它不僅會調整畫布大小,還會確保所有圖像幀在裁剪區域內仍正確定位。如果沒有這個選項,裁剪 GIF 動畫將非常困難,需要對圖像畫布大小和偏移量進行外部校正。有關這方面的一個示例,請參閱「動畫裁剪,畫布過大」。在許多方面,「視口裁剪」與「視口扭曲設定」密切相關,因為兩者都表現為結果圖像的「窗口」。兩者都可以用作「裁剪」方法。
生成多圖像「平鋪裁剪」或等面積平鋪裁剪時,不能使用「!」標記,因為它具有不同的含義。請參閱下面的相應章節。

相對於重心裁剪

默認情況下,「-crop」的偏移位置是相對於圖像左上角的。但是,通過設置「-gravity」設定,您可以告訴「-crop」相對於圖像的中心、角落或邊緣裁剪圖像。重力裁剪最常見的用途是裁剪圖像的「center」。

  magick rose: -gravity Center  -crop 32x32+0+0 +repage  crop_center.gif
[IM Output]
-gravity」設定不僅會影響裁剪的初始「零」位置,還會影響裁剪偏移的方向。例如,如果您使用「-gravity」的「South」和「+0+5」的偏移,則會向上偏移裁剪區域,而不是像通常那樣向下偏移。

  magick rose: -gravity South  -crop 20x20+0+5   crop_south.gif
[IM Output]
請注意上面裁剪範例的位置。我特意省略了「+repage」操作,以便您可以看到裁剪區域是如何從圖像的底部邊緣移出的。另請注意,裁剪區域不僅相對於底部(南)邊緣,而且該區域是「對齊」的中心,位於底部邊緣的中間。所有受重力影響的操作都是這樣完成的。

裁剪影像的百分比

-crop」運算符還了解如何將圖像裁剪為其原始大小的一定百分比。例如,這將圖像的大小減半。

  magick rose:  -crop 50%x+0+0      crop_half.gif
[IM Output]
如果只給出一個大小數字,則該值將用於寬度和高度百分比,並且將要裁剪的區域的最終大小將四捨五入到最接近的整數。偏移量不是可選的。
請注意,雖然大小可以是百分比,但偏移量始終以像素為單位。您不能以圖像大小的百分比形式提供偏移量。

  magick rose:  -crop 50%x+30+20      crop_percent.gif
[IM Output]
當給出帶有偏移量的裁剪時,您必須在參數中提供一個「x」符號,以便可以正確解釋該參數。當只為裁剪區域的寬度和高度提供一個數字時,這一點尤其重要。

因此,您不能使用「50%+30+20」這樣的參數,這是一個錯誤,並且將導致裁剪靜默地不執行任何操作。
更常見的情況是,從圖像的中心進行百分比裁剪。

  magick rose: -gravity Center -crop 50x80%+0+0  crop_percent_center.gif
[IM Output]
百分比符號「%」可以出現在參數中的任何位置,如果給定的話,它將引用寬度和高度數字。它只是一個標記,用於聲明「圖像大小」部分是圖像虛擬畫布或頁面大小的百分比分數。偏移量始終以像素為單位給出。
您還可以使用帶有百分比裁剪的「視口裁剪」標記,將畫布大小和裁剪的偏移量自動設置為要裁剪的區域。

  magick rose: -gravity Center -crop 50%\!  crop_percent_vp.gif
[IM Output]
您不能將百分比大小用於平鋪裁剪(請參閱下一節)。因此,如果未提供偏移量,並且給定了百分比大小(如上所示),則假定偏移量為 +0+0。

!」旗標表示不需要「+repage」。但是,對於可能也具有虛擬畫布大小和偏移量的輸入圖像,仍建議謹慎使用。

拼貼裁剪,將一張影像分割成多張影像

裁剪更有用的方面之一是,當您沒有為裁剪命令指定特定位置時。也就是說,您給定了一個大小,而不是要裁剪的圖像內的位置。在這種情況下,裁剪不會只生成一個圖像,而是生成一系列圖像。


magick rose: -shave 12x0 -repage 64x64+9+9 paged.gif
magick paged.gif +gravity -crop 32x32 tiles_%d.gif
magick identify paged.gif tiles_?.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output]
[IM Text]
如果您只想從圖像中提取特定數量的平鋪,請查看下面的裁剪成大致相等的尺寸劃分
最好使用「+gravity」關閉重力。這是因為在一種特殊情況下(居中百分比裁剪),重力設置可以關閉平鋪裁剪。重力對平鋪裁剪的其他影響也未定義。
通過使用「-mosaic」或「-flatten」圖像分層運算符(請參閱圖層拼合),您可以將這些圖像全部疊加在一起,恢復原始圖像。

  magick tiles_[0-3].gif -background white -mosaic  tiles_mosaic.gif
[IM Output]
但是,正如您所見,圖像的虛擬畫布已由「-mosaic」填充了背景顏色。另一種方法是使用「-layers merge」(請參閱圖層合併),它將多個圖層圖像合併到一個新的圖層圖像中,該圖像的大小足以容納所有給定的圖像。也就是說,虛擬畫布沒有被填充,就像「-mosaic」或「-flatten」分層方法那樣。

  magick tiles_[0-3].gif -background none -layers merge  tiles_layered.gif
  magick identify tiles_layered.gif
[IM Output]
  [IM Text]
如果您使用「+repage」重置了畫布和偏移量信息,則圖像不再包含裁剪位置的偏移量,也不再包含源圖像的原始大小。在這種情況下,您可以使用「magick montage」的特殊「concatenation」模式將所有圖像重新連接在一起。您需要告訴 montage 從原始圖像中提取了多少行或列圖像。

  magick rose: -crop 20x20  +repage  +adjoin  rose_tiles_%02d.gif
  montage -mode concatenate -tile 4x  rose_tiles_*.gif   rose_rejoined.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
==> [IM Output]
請注意,單個圖像的名稱是從「rose_tiles_00.gif」到「rose_tiles_11.gif」,這僅僅是平鋪在內存中的順序號。這不太好,因為文件名不能輕鬆地指示每個平鋪所屬的實際位置,或者每行和每列的平鋪總數。從 IM v6.4.8-4 開始,您還可以使用特殊的文件名百分比轉義符在輸出文件名中生成和包含特殊的標籤。將其與FX 百分比轉義符一起使用,您可以為每個圖像計算不同的「平鋪位置」。例如...

  magick rose: -crop 20x20 \
          -set filename:tile "%[fx:page.x/20+1]_%[fx:page.y/20+1]" \
          +repage +adjoin "rose_tile_%[filename:tile].gif"
[IM Output] ==> ==> [IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
將生成平鋪圖像文件名「rose_tile_1_1.gif」到「rose_tile_4_3.gif」,這是一個更好的文件命名方案。很棘手,但確實有效。不幸的是,您不能格式化百分比轉義符生成的數字,以包含用零填充或指定確切的小數位數。至少目前還不行。

居中平鋪裁剪

在一個IM 論壇討論中,有人提出將區塊裁剪置中,以便將「剩餘影像」均勻分佈在邊緣。透過這種方式,我們可以將完整的區塊放置在影像中央,以最大限度地發揮其效果。當然,您最終也會得到更多不完整的邊緣區塊。解決方案是將輸入影像置中於一個虛擬畫布上,該畫布是所需區塊大小的倍數。例如,要將「rose:」影像(大小為 70x46 像素)裁剪為最大數量的完整 30x20 區塊,並將其置於影像中央(並以剩餘區塊包圍),您可以執行以下操作。
  1. 首先,透過將影像大小相除來計算您可以從影像中獲得的完整區塊數量...
    70x46 / 30x20 => 2x2 full tiles + remainder
  2. 現在,再新增 2 個行和列來容納剩餘影像(如果需要)。
    2x2 + 2x2 => 4x4 tile images
  3. 將區塊大小乘以這個數字,即可獲得虛擬畫布大小。
    30x20 * 4x4 => 120x80 canvas size
  4. 減去原始影像大小,然後除以 2,即可得到置中偏移量。
    ( 120x80 - 70x46 ) / 2 => +25+17
因此,虛擬畫布和置中偏移量為 120x80+25+17。在這裡,我們使用上述計算結果來執行置中區塊裁剪...

  magick rose: -repage 120x80+25+17 -crop 30x20 +repage rose_30x20_%02d.gif
[IM Output] ==> ==> [IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
如果您想保留區塊的原始偏移位置,但移除置中偏移,可以使用「-repage -25-17\!」(將上述內容中的「+repage」替換掉)來進行相對偏移調整。如果您沒有在區塊數量中添加兩行和兩列,因此產生了負偏移,則可以有效地忽略剩餘的邊緣區塊,並且只輸出影像中存在的完整區塊。

  magick rose: -repage 60x40-5-3 -crop 30x20 +repage rose_ctiles_%d.gif
[IM Output] ==> ==> [IM Output] [IM Output]
[IM Output] [IM Output]
基本上,由於剩餘部分現在位於計算出的虛擬畫布「外部」,因此「-crop」運算子不知道它們的存在並忽略它們。同樣,將上述內容中的「+repage」替換為使用否定偏移值的相對偏移調整「-repage +5+3\!」,將恢復裁剪區塊的原始偏移位置。置中區塊裁剪並忽略剩餘部分的另一種方法是,只需將虛擬畫布設置替換為適當的裁剪即可。

  magick rose: -gravity center -crop 60x40+0+0 +gravity +repage \
          -crop 30x20 +repage rose_ctiles2_%d.gif
[IM Output] ==> ==> [IM Output] [IM Output]
[IM Output] [IM Output]
以上方法更容易理解,但速度也稍慢,因為您現在正在執行兩次裁剪。但是,所需的計算量較少。但是,如果您想恢復原始區塊偏移,您仍然需要計算所需的相對偏移,在這種情況下,您不妨使用影像虛擬畫布,透過前一種更快的方法來完成任務。

條狀裁剪,裁剪掉行和列

在 IM 6.1.1 版中,「-crop」得到了增強,因此如果缺少其中一個大小參數或將其設置為零,則缺少的大小參數將設置為影像畫布/頁面的大小。在大多數情況下,如果相關偏移量也設置為零,則此大小足以覆蓋位於畫布上的影像。這一微小的變化允許您輕鬆地從影像中剪切單行或單列,而無需使用「999999」這樣的大數字來覆蓋影像的大小。例如,在這裡,我們從「分頁」的玫瑰影像中提取一個簡單的行和列。


magick rose: -shave 12x0 -repage 64x64+9+9 paged.gif
magick paged.gif -crop 20x0+30+0 strip_column.gif
magick paged.gif -crop 0x20+0+30 strip_row.gif
magick identify paged.gif strip_column.gif strip_row.gif
[IM Output] ==> [IM Output] [IM Output]
  [IM Text]
如果同時移除兩個偏移量以及一個大小參數,則可以將影像劃分為一系列條帶或列,而不是區塊。


magick rose: -crop 40x30+10+10 crop.gif
magick crop.gif -quiet -crop 20x strips_%d.gif
magick identify crop.gif strips_?.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output]
  [IM Text]
請注意,圖塊裁剪,無論是條狀裁剪還是其他裁剪方式,都是針對整個圖像頁面的畫布進行的,因此是與該畫布對齊,而**不是**僅與實際圖像對齊。這就是為什麼在上面的示例中,生成的第一個和最後一個實際圖像的寬度僅為 10 個像素。當然,如果某個特定圖塊(在本例中為「列」)在虛擬畫布上遺漏了實際圖像(例如上面示例中的最後一個圖像),則會生成裁剪遺漏圖像。使用「-quiet」設定可以抑制 IM 通常會產生的警告。除非您預期會發生這種情況並已做好準備(例如在腳本中),否則不建議這樣做。
圖像的位置可能會導致其在其自身的頁面或虛擬畫布上根本不顯示,或者圖像太大而導致頁面畫布只能包含圖像的一小部分或窗口。

在這種罕見的情況下,如果在沒有任何尺寸參數的情況下進行條狀裁剪,則會導致圖像子區域劃分錯誤,並分別產生遺漏圖像或僅包含虛擬畫布邊界內部分的較小圖塊。

但是,「-crop」運算符不會被修正來處理這些罕見的特殊情況,因為這樣做會妨礙其在其他情況下的使用,例如以下示例中的情況。

如果這對您來說是個問題,請在裁剪之前使用「+repage」清理圖像的頁面偏移量,以便在嘗試生成圖塊圖像之前移除虛擬畫布。
作為將圖像分割成單獨行的另一種方法,請查看特殊腳本「divide_vert」。此程式允許您根據單一純色的水平「間隙」分割圖像。例如,如果給定一個簡單的文字圖像,它會將其分割成交替的「行」和「間隙」圖像。一個簡單的選項可讓您移除這些間隙。

象限,圍繞單一點裁剪

如果缺少任何裁剪尺寸數值,則會將其替換為要裁剪的圖像畫布尺寸。在大多數情況下,這會導致該維度上的整個圖像成為裁剪結果的一部分。通過謹慎使用這些參數,您可以將圖像裁剪成圍繞特定點的四分之一(將該特定像素放置為左下象限圖像的右上角像素)。您無需知道圖像的大小即可執行此操作。例如,這裡我將圖像圍繞點 30,40 裁剪成四分之一。


magick rose: -shave 12x0 -repage 64x64+9+9 paged.gif
magick paged.gif -crop 30x40+0+0 quadrant_tl.gif
magick paged.gif -crop 0x40+30+0 quadrant_tr.gif
magick paged.gif -crop 30x0+0+40 quadrant_bl.gif
magick paged.gif -crop +30+40 quadrant_br.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output]
當然,如果您要裁剪的點遺漏了實際圖像,則生成的四個象限圖像中的兩個甚至三個將是特殊的裁剪遺漏錯誤圖像。

使用負偏移量,移除底部或左側邊緣

沒有理由不能在「-crop」中使用負偏移量。事實上,有時它會帶來非常明顯的好處。例如,讓我們使用我們的分頁玫瑰圖像,並使用更大的負偏移量逐步裁剪它。我們不會為「-crop」參數提供圖像尺寸,因此它將預設為圖像畫布尺寸。


magick rose: -shave 12x0 -repage 64x64+9+9 paged.gif
magick paged.gif -crop -10-10 neg_offset_1.gif
magick paged.gif -crop -20-20 neg_offset_2.gif
magick paged.gif -crop -30-30 neg_offset_3.gif
magick paged.gif -crop -40-40 neg_offset_4.gif
magick paged.gif -crop -50-50 neg_offset_5.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
如您所見,穩定地將偏移量減小到更大的負值會慢慢導致底部和右側邊緣被“切掉”,最後一個示例幾乎錯過了實際圖像。如果我們更進一步,將生成遺漏圖像。這有點像使用“-chop”運算符,但沒有“-gravity”設置。請參閱裁剪,移除邊緣。當然,通過使用“-crop”,您可能需要使用“+repage”運算符來調整畫布/頁面信息,而“-chop”會自動執行此類調整。這就是生活。

裁剪成大致相等的尺寸

平鋪裁剪的最大問題是您只能定義每個平鋪的最終大小。當圖像大小是所需平鋪大小的精確倍數時,這非常有效,但正如您所見,如果不是這種情況,您最終可能會在右側和底部邊緣出現“短”平鋪。例如,讓我們再次分割內置的玫瑰圖像,但嘗試將其分成 3x3 的平鋪。原始圖像為 70x46 像素,因此除以 3 後,每個平鋪為 23x15 像素...

  magick rose: -crop 23x15  +repage  +adjoin  rose_23x15_%02d.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
嗯,正如您所見,這不起作用,因為玫瑰圖像無法完全分割成 3 個大小相等的平鋪。在這種情況下,您最終會得到一個“短”1 個像素的平鋪。即使您將平鋪的大小擴展到 24x16 像素,您仍然會得到一個比其他平鋪“短”2 個像素的平鋪。隨著所需平鋪數量的增加,這種情況會變得更糟。例如,嘗試將長度為 100 的線段細分為 30 個平鋪。這是不可能的。您可以使用長度為 3 並獲得 34 個平鋪,或者使用長度為 4 並獲得 25 個平鋪。獲得正好 30 個大小相等的平鋪是不可能的!從 IM v6.5.8-9 開始,您現在可以在“-crop”參數中添加特殊的“@”標誌。此標誌告訴“-crop”運算符盡力將圖像平均分成給定的平鋪數量。例如...

  magick rose: -crop 3x3@  +repage  +adjoin  rose_3x3@_%d.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output]
結果是圖像被分割成大小略有不同的平鋪。但是,平鋪大小最多只會相差 1 個像素!快來看看吧!此外,您還可以對圖像進行細分,以便每個平鋪与其相鄰的平鋪“重疊”。您可以通過不僅使用“@”標誌,還指定所需的重疊像素數來做到這一點。例如,讓我們將玫瑰分成四等份,但重疊 20 個像素。

  magick rose: -crop 2x2+20+20@  +repage  +adjoin  rose_2x2+20+20@_%d.gif
[IM Output] ==> [IM Output] [IM Output]
[IM Output] [IM Output]
同樣,所有區塊的尺寸最多只會相差一個像素!雖然在這種情況下,由於玫瑰圖可以被 2 整除,所以產生的圖像尺寸相同。但是,如果重疊或圖像尺寸為奇數,則情況就不是這樣。在這種情況下,較大的元素將沿頂部和左側邊緣放置。但是,如果有三個區塊,則較大(或較小)的元素將放置在中間!您甚至可以使用負重疊在區塊之間「跳過」正好這麼多像素!您應該如何應用運算符,取決於您想要「重疊」或「跳過」哪些像素。這取決於圖像的「邊緣」特性(請參閱下方分離間隔排列的區塊圖像)。與「-crop」運算符的任何使用一樣,建議您使用「+repage」來移除不需要的「頁面」偏移量。但是,裁剪後的圖像偏移量信息可能非常有用,這就是為什麼要保留它的原因。例如,您可以使用它來命名輸出文件,或找出 IM 計算出的區塊的大小和位置。請注意,等尺寸區塊裁剪是「-crop」運算符在確定圖像的哪一部分被裁剪時忽略圖像的實際虛擬畫布的唯一情況。也就是說,區塊裁剪的計算基於實際圖像尺寸而不是虛擬畫布尺寸。即使如此,最終的區塊偏移量仍然相對於原始的虛擬畫布。此裁剪選項也可以用作修剪運算符的替代方法,用於「分頁」圖像。
在 IM 版本 v6.6.1-0 之前,具有虛擬畫布偏移量的圖像的等尺寸區塊裁剪功能已損壞。

分隔間隔排列的拼貼影像

通常,您會遇到這樣一種圖像:它具有固定大小的區塊,這些區塊之間由固定數量的空間隔開。新的「@」標誌裁剪運算符將讓您更輕鬆地裁剪出這些區塊,包括或跳過周圍的空間。然而,主要問題是,雖然「區塊」圖像周圍有固定數量的空間,但邊緣周圍的空間量通常不是那麼固定。這會為一組「間隔」圖像產生三種基本樣式的邊緣特性。每種類型都需要略微不同的處理方式。 蒙太奇區塊在這裡,原始圖像只是在拼接在一起之前給予了固定大小的邊框。結果是您在區塊之間始終會有偶數個像素間距。更重要的是,「邊緣間距」正好是放置在區塊之間的間距的一半。這實際上就是「montage」如何分隔區塊「單元格」的方式,並且使用此命令生成了如下所示的示例圖像。由於圖像只是簡單地拼接在一起,因此您可以使用普通的區塊裁剪(如果您知道區塊大小)或等尺寸裁剪(如果您知道區塊數量)來分離子圖像和周圍的邊框。區塊之間基本上沒有重疊,並且可以使用簡單的修剪運算符從生成的區塊中移除該邊框。

  magick montage.gif -crop 5x1@ +repage +adjoin montage_%d.gif
  magick montage_?.gif -shave 3x3 montage-3_%d.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
邊緣周圍間距相同在這裡,子圖像不僅「間隔」了 6 個像素,而且邊緣周圍也有 6 個像素的間距,使其看起來整潔有序。這是通過使用默認的等尺寸裁剪和適當數量的像素「重疊」來處理的。例如...

  magick edged.gif -crop 5x1+6+6@ +repage +adjoin edged+6_%d.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
請注意,運算符如何分離圖像,以便它們保持相同的大小,但有 6 個像素的重疊。這正是它被設計用來做的事情。通過使用負偏移量,您告訴 IM 不應在最終結果中包含重疊區域(間距部分)。

  magick edged.gif -crop 5x1-6-6@ +repage +adjoin edged-6_%d.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
如果我進一步減去更多像素,我什至可以從上述數字中修剪掉一些白色邊框。

  magick edged.gif -crop 5x1-8-8@ +repage +adjoin edged-8_%d.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
您甚至可以將此作為 裁切運算子 的替代方法,只需指定 1 個圖塊裁切即可...

  magick edged+6_0.gif -crop 1x1-6-6@ +repage tile-shave.gif
[IM Output] ==> [IM Output]
簡單間隔圖塊最簡單的間隔圖塊圖像沒有邊緣間距,或者已經從圖像中 修剪 了該邊緣間距。但是,要處理此問題,您需要透過包含「@」和「!」標記來告知 IM 這種特殊情況。

  magick spaced.gif -crop 5x1+6+6@\! +repage +adjoin spaced+6_%d.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
請注意,此細分邊緣上的圖像比中間的圖像略短。這就是為什麼這種特殊的運作「模式」不是默認模式,儘管它實際上比以前的間隔圖塊類別更簡單。另請注意,當同時使用「@」和「!」標記時,單個圖塊裁切(在本例中為垂直)没有任何效果,因為圖塊的頂部和底部都是「邊緣」,因此没有要移除的「邊緣空間」。同樣,透過對重疊使用負值,您可以告訴 IM 不要在圖塊裁切結果中包含重疊(間距)區域。

  magick spaced.gif -crop 5x1-6-6@\! +repage +adjoin spaced-6_%d.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
!」字元對某些 UNIX shell(如「csh」)具有特殊含義,即使放在引號內也必須使用反斜線進行跳脫。
使用這些公式,您現在應該能夠對形成網格的圖像進行圖塊裁切,即使圖像重疊或間隔也是如此。即使您的特定問題並没有完全屬於上述情況之一,您也應該能夠適當地添加或移除邊緣像素,以便圖像確實屬於上述間隔圖像類別之一。

添加/移除圖像邊緣

邊框,在圖像周圍添加空間

通常,您只想在圖像邊緣周圍添加一點工作空間,但您不希望需要或依賴於知道圖像的大小來做到這一點。現在,除了直接添加空間之外,還有很多方法可以為圖像添加額外空間,包括 附加空白圖像或標籤組合「Src」疊加層,甚至只是 將圖像放置在更大的畫布上。但這些方法通常至少需要了解您正在處理的圖像實際有多大。最簡單的圖像空間添加形式之一是「-border」運算。添加的空間顏色為「-bordercolor」設定。以下是一些簡單的例子..

  magick rose: -bordercolor SkyBlue    -border 10x10 border.gif
  magick rose:                         -border 15x6  border_default.gif
  magick rose: -bordercolor LimeGreen  -border 10x0  border_sides.gif
  magick rose: -bordercolor Tomato     -border  0x10 border_topbot.gif
  magick rose: -alpha set -bordercolor none -border 10    border_none.gif
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
請注意上面最後一個示例圖像。邊框顏色設定為透明顏色「none」,但要使其按預期工作,我们需要確保圖像實際上包含「遮罩」或「alpha」通道。另請注意,如果垂直和水平邊框大小相同,則可以省略邊框中的第二個數字,僅使用一個數字。
如上所示,「-border」運算符使用的默認顏色為淺灰色,因为它與 WWW 上網頁的默認灰色頁面顏色非常匹配。
您可以將邊框指定為圖像大小的百分比...

  magick rose: -border 10%x10%  border_percent.jpg
[IM Output]
實際上,「-border」所做的是建立一個大小合適的新圖像,然後將原始源圖像疊加在此新背景上。這本身在 ImageMagick 中是一個非常有用的操作,用於設定透明和半透明圖像的背景。也就是說,看似無用的「-border 0」操作在 IM 版本 6 中是一個非常有用的操作。例如...

  magick star.gif -bordercolor LimeGreen -border 0  star_background.gif
[IM Output] ==> [IM Output]
當然,還有很多其他方法可以 移除 Alpha 透明度
為具有透明度的圖像添加邊框,默認情況下也會填充圖像的透明背景,這一事實引發了 IM 用戶和開發團隊之間的一些爭論。有關此爭論的摘要,請參閱 邊框、框架和 BorderColor 的使用

邊框和 Alpha 合成

圖像疊加到邊框顏色畫布上的方式由「-compose」設定控制,預設設定為「Over」alpha 合成。如果設定為其他設定,「-border」操作可能會產生意外結果。例如,以下是一些將「-compose」與「-border」圖像運算子一起使用時,應用於包含一些透明區域的圖像的更有趣用途。

  magick star.gif -bordercolor LimeGreen \
                   -compose {operation} -border 5  {result}
[IM Output]
選擇使用「Over」還是「Copy」基本上決定了您是否要保留圖像中的透明度。例如,以下是具有透明度的相同「星形」圖像,但這次添加邊框時沒有破壞圖像的透明度。

  magick star.gif  -bordercolor LimeGreen   -compose Copy \
                     -border 5     star_border_copy.gif
[IM Output]
無論目前的「-bordercolor」設定為何,「Src」合成都會將透明邊框添加到圖像(如果它具有 Alpha 色板)。基本上,產生的背景畫布「-border」會被忽略。「Dst」看起來可能不是很有用,但可以用於產生與原始圖像大小相同(或稍大)的畫布。原始圖像僅用於確定畫布的最終大小。如需更多範例,請參閱調整為現有圖像大小的畫布。如需各種「-compose」方法的更多資訊,請參閱Alpha 合成範例

邊框和虛擬畫布

當「-border」應用於包含虛擬畫布的圖像時,它仍然會在該虛擬畫布上的實際圖像周圍添加邊框,而不是圍繞整個畫布。


magick rose: -shave 12x0 -repage 64x64+9+9 paged.gif
magick paged.gif -border 5x5 paged_border.gif
[IM Output] ==> [IM Output]
請注意,虛擬畫布的大小也會增加兩倍的邊框粗細,以容納添加的邊框。當然,這意味著您不能簡單地將邊框直接添加到典型的 GIF 動畫中,除非您想實際識別動畫的各個子影格(例如,請參閱指令碼動畫影格蒙太奇,它使用此作為選項來「框住」疊加圖像)。如果要添加邊框,則應先合併動畫,以移除它可能具有的任何影格最佳化

影格,添加類似 3D 的邊框

-frame」運算子與「-border」非常相似,如果您查看下面產生的第一個範例圖像,您會發現它會產生完全相同的結果,只是它使用的是「-mattecolor」而不是「-bordercolor」。請注意,「-bordercolor」仍然用於生成帶框圖像,請參見下文。要正確使用「-frame」,您需要為指令提供四個參數,而不仅仅是 2 個。額外的參數指定要生成的影格的「外部」和「內部」斜面的寬度。以下是一些使用具有各種設定的「-frame」運算子的範例。

  magick rose:                    -frame 10x10      frame.gif
  magick rose:                    -frame 15x6+2+2   frame_wierd.gif
  magick rose: -mattecolor SkyBlue -frame 6x6+2+2    frame_blue.gif
  magick rose: -mattecolor Tomato  -frame 10x10+5+5  frame_red.gif

  magick rose:   -frame 10x10+10+0    frame_rasied.gif
  magick rose:   -frame 10x10+6+0     frame_rasied_part.gif
  magick rose:   -frame 10x10+0+6     frame_sunken_part.gif
  magick rose:   -frame 10x10+0+10    frame_sunken.gif
[IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
使用多個影格操作也可以產生更奇怪的影格樣式。

  magick rose:      -frame 10x10+3+3                    frame_normal.gif
  magick rose:      -frame 3x3+3+0      -frame 7x7+3+0  frame_popped.gif
  magick rose:      -frame 7x7+0+3      -frame 3x3+0+3  frame_pressed.gif
  magick rose: -frame 3x3+3+0 -frame 4x4 -frame 3x3+0+3  frame_inverted.gif
[IM Output] [IM Output] [IM Output] [IM Output]
預設的「-mattecolor」比「-bordercolor」的預設設定稍微暗一些的灰色。這也使其能夠與 WWW 上網頁的預設灰色相匹配(由「mosaic」和「netscape」等早期瀏覽器使用)。(見下文)
雖然「-frame」可能會實際使用「-mattecolor」顏色,但它也會從這個基礎生成另外四種額外顏色,用於繪製邊框。也就是說,可能會在圖像中添加五種相關顏色,而不僅僅是一種。
透過一些努力,您甚至可以複製一個「magick montage」的框架圖像,並帶有文字標籤。

  magick rose:  -mattecolor grey  -background grey  -frame 3x3+0+3 \
          -gravity South -splice 0x15 -annotate 0x0 'A Red Rose' \
          -frame 6x6+3+0    frame_montage.gif
[IM Output]
您甚至可以使用半透明的「-mattecolor」作為邊框「-frame」,然後在下面放置一個有趣的圖案(例如碎形等離子畫布),以產生更豐富多彩的邊框。


magick rose: -alpha set -mattecolor '#CCC6' -frame 10x10+3+4 \ \( -size 100x100 plasma:fractal -normalize -blur 0x1 \) \ -compose DstOver -composite frame_plasma.gif
[IM Output]
或者,您可以單獨為邊框著色(使用特殊的「Dst」合成設定產生),然後在為邊框著色後將圖片覆蓋到邊框中。但这確實變得非常棘手。有關使用邊框的更進階技巧,請參閱邊框技巧

邊框和 Alpha 合成

邊框與「-border」運算子密切相關。不僅邊框是使用「-mattecolor」繪製的,而且此運算子還將使用「-bordercolor」設定來定義最初繪製邊框的背景。現在,對於沒有透明度的圖像,「-bordercolor」將不可見,因為它被圖像本身覆蓋。但對於確實包含一些透明區域的圖像,背景顏色會變得可見。

  magick star.gif  -frame 6x6+2+2 star_framed.gif
[IM Output]
換句話說,「-frame」的作用就像您將圖像放在具有純色背景的相框上一樣。因此,圖像中任何透明的部分都將被「-bordercolor」替換,默預設情況下為淺灰色。
將邊框添加到具有透明度的圖像時,默認情況下也會使用邊框顏色填充圖像的透明背景,這一事實引發了 IM 用戶和開發團隊之間的一些爭論。有關此爭論的摘要,請參閱邊框、框架和邊框顏色的使用
如果您想在為圖像添加邊框時保留其透明度,您有兩種解決方案。第一種是使用透明的「-bordercolor」,例如「none」。

  magick star.gif -bordercolor none  -frame 6x6+2+2  star_framed_none.gif
[IM Output]
另一種解決方案,也是首選方法,是在將圖像添加到邊框時確保保留透明像素。這是通過使用稱為「Copy」的特殊「-compose」方法來完成的。

  magick star.gif -compose Copy  -frame 6x6+2+2  star_framed_copy.gif
[IM Output]
將「-bordercolor」用作「-border」和「-frame」的背景圖像是在 IM 6.1.4 版中添加的。在此之前,生成的背景畫布由黑色畫布組成,邊框或框架繪製在該畫布上。

這種黑色畫布的使用對於「magick montage」命令來說尤其糟糕,該命令在其內部處理中大量使用了內部「-frame」函數。(請參閱蒙太奇背景和透明度處理
如您所見,「-frame」運算子和「-border」一樣,也使用「-compose」設定來定義原始圖像如何疊加到背景框架上。

  magick star.gif -bordercolor LimeGreen \
          -compose {operation} -frame 6x6+2+2  {result}
[IM Output]
如果您还想在「magick montage」框架中使用「-bordercolor」設定,那麼使用「-compose」設定為「Copy」就變得非常重要。有關更多詳細資訊,請參閱蒙太奇背景和透明度處理

框架和虛擬畫布

邊框和虛擬畫布一樣,框架也是應用在虛擬畫布上實際圖像的周圍,而不是整個畫布的周圍。


magick rose: -shave 12x0 -repage 64x64+9+9 paged.gif
magick paged.gif -frame 5x5+2+2 paged_framed.gif
[IM Output] ==> [IM Output]
請注意,虛擬畫布的大小也增加了兩倍的邊框厚度,以容納添加的框架。這當然意味著您不能簡單地將框架直接添加到典型的 GIF 動畫中,除非您想實際識別動畫的各個子影格(例如,請參閱動畫影格蒙太奇)。如果要添加邊框,則應先合併動畫以移除它可能具有的任何影格優化

裁剪,從圖像中移除邊緣

-border」或「-frame」運算子的反向操作是「-shave」,如果給定相同的參數,它將移除這些命令添加的空間。

  magick border.gif -shave 10x10 shave.gif
  magick border.gif -shave 10x0  shave_sides.gif
  magick border.gif -shave  0x20 shave_topbot.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output]
關於這三個運算子,需要記住的主要一點是,它們是在圖像的*相對*兩側添加和移除空間,而不僅僅是一側或相鄰兩側。如果只想移除圖像的一條邊緣,則需要改用「-chop」運算子。(請參閱下面的裁剪範例)。和以前一樣,所有運算子「-border」、「-frame」和「-shave」僅影響虛擬畫布上的實際圖像,而不影響虛擬畫布本身。


magick rose: -shave 12x0 -repage 64x64+9+9 paged.gif
magick paged.gif -border 5x5 paged_border.gif
magick paged_border.gif -frame 5x5+2+2 paged_frame.gif
magick paged_frame.gif -shave 10x10 paged_shave.gif
[IM Output] ==> [IM Output] ==> [IM Output] ==> [IM Output]
使用裁剪的另一種方法是使用新的等尺寸平鋪裁剪運算子。這個運算子的優點是,與「-shave」不同,它不會修改結果圖像的畫布大小。

  magick paged_frame.gif   -crop  1x1-10-10@     paged_tile_shave.gif
[IM Output] ==> [IM Output]
在 IM 版本 v6.6.1-0 之前,具有畫布偏移量的圖像(例如上面的圖像)的等尺寸平鋪裁剪功能已損壞。

範圍,直接圖像大小調整

經過一些討論,在 IM 版本 6.2.4 中添加了一個直接調整圖像最終大小的運算子。「-extent」運算子。如果圖像大小增加,則空間將添加到圖像的右邊緣或底邊緣。如果它減小,則圖像數據將被丟棄或裁剪以適應新的圖像大小。在這兩種情況下,圖像的左上角區域很可能保持不變。

  magick rose: -background skyblue -extent 100x60     extent_enlarge.gif
  magick rose: -background skyblue -extent  40x40     extent_shrink.gif
  magick rose: -background skyblue -extent 100x40     extent_wider.gif
  magick rose: -background skyblue -extent  40x60     extent_taller.gif
[IM Output] [IM Output] [IM Output] [IM Output]
如您所見,它將使用添加到圖像的任何新區域的「-background」顏色填充任何新區域。
在 IM 版本 v6.3.2 之前,「-extent」只是將任何新區域的記憶體清除為零,或者直接清除為黑色。它沒有使用「-background」顏色填充這些區域。
同樣在 IM v6.3.2 之後,「-extent」將使用「-gravity」來定義添加/移除區域相對於原始影像的位置。

  magick rose: -gravity north  -extent 100x80 extent_north.gif
  magick rose: -gravity south  -extent 100x80 extent_south.gif
  magick rose: -gravity east   -extent 100x80 extent_east.gif
  magick rose: -gravity west   -extent 100x80 extent_west.gif
  magick rose: -gravity center -extent 100x80 extent_center.gif
  magick rose: -gravity center -extent  40x80  extent_center2.gif
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
上面最後一個範例顯示 extent 也可以進行中心裁剪,但不需要使用「-repage」,不過它會使用目前的「-background」顏色來「平面化」影像。
您甚至可以使用偏移量,這基本上意味著 Extent 運算子 只是一個簡單的 Crop,並帶有背景填色,而不用管位置。

  magick rose: -background skyblue -extent 100x100-15-25 extent.png
[IM Output]
這種根據重心裁剪和擴展影像的能力,使該運算子非常適合於填充或裁剪影像,使其符合特定大小的區域,例如,請參閱 將縮略圖填充到適合的大小 請注意,「-extent」的工作原理是使用與 BorderFrame 運算子相同的「覆蓋」技術。因此,默認情況下,將其用於包含透明度的影像將會使用目前的「-background」顏色替換透明度。

  magick star.gif  -background LimeGreen  -extent 80x80-10-10  star_extent.gif
[IM Output]
同樣,解決方案是設定適當的「-compose」方法,或將「-background」顏色設定為「None」。

添加/移除行、列和邊緣

拼接,添加行、列和邊緣

-splice」運算子是 IM 版本 6 中新增的,請參閱 拼接,建立新影像運算子的範例。它基本上提供了將一行、一列空格添加到影像中間或一個邊緣的功能。插入空格的顏色來自「-background」顏色設定。

  magick rose: -background blue  -splice 20x10+40+30  splice.gif
  magick rose: -background blue  -splice 20x0+40+0    splice_column.gif
  magick rose: -background blue  -splice 0x10+0+30    splice_row.gif
  magick rose: -background blue  -splice 20x10        splice_topleft.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output]
如果未設定背景顏色,IM 將嘗試從影像本身確定此值。這意味著對於某些影像,它可能是白色(正常的默認值),而在其他影像上,它可能是黑色,或者對於 GIF 格式,它可能是儲存該影像時設定的任何背景顏色。

這基本上意味著,如果您沒有設定「-background」顏色,則其默認值取決於影像,並且您可能會得到任何顏色。

在使用使用它的運算子之前,請務必設定「-background」。
現在,雖然向影像添加行和列很好,但「-splice」運算子非常適合僅向影像的一個邊緣添加空格。哪個邊緣由「-gravity」選項和拼接幾何設定決定。

  magick rose: -background blue  -splice 0x10  splice_top.gif
  magick rose: -gravity south \
                 -background blue  -splice 0x10  splice_bottom.gif
  magick rose: -background blue  -splice 20x0  splice_left.gif
  magick rose: -gravity east \
                 -background blue  -splice 20x0  splice_right.gif
  magick rose: -gravity southeast \
                 -background blue  -splice 20x10  splice_botright.gif
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
拼接最常見的用途之一是添加用於繪製標籤的空格。(請參閱 標記影像

  magick rose: -gravity South  -background LimeGreen  -splice 0x15 \
           -annotate 0x0 'Rose'    splice_label.gif
[IM Output]

裁切,移除行、列和邊緣

-splice」的自然反義詞是歷史更悠久的「-chop」運算子。給定與「-splice」相同的參數和相同的「-gravity」設定,「-chop」將把影像恢復到其原始形式。

  magick splice.gif       -chop  20x10+40+30   splice_chop.gif
  magick splice_chop.gif  -chop  20x10+30+20   chop.gif
  magick chop.gif -background grey \
                           -splice 20x10+30+20   chop_splice.gif
[IM Output] ==> [IM Output] ==> [IM Output] ==> [IM Output]
我繼續處理上一個範例,展示如何反轉「-splice」和「-chop」的順序,以便在不使用繪製或覆蓋的情況下從影像中間「清除」一行或一列(或兩者)。Chop 更常用於從影像中裁剪單一邊緣,使用重力來選擇該邊緣。例如...

  magick frame_red.gif                 -chop  0x10  chop_top.gif
  magick frame_red.gif                 -chop 10x0   chop_left.gif
  magick frame_red.gif -gravity East   -chop 10x0   chop_right.gif
  magick frame_red.gif -gravity South  -chop  0x10  chop_bottom.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output]
作為使用「-chop」移除單一邊緣的替代方案,實際上可以使用更通用的「-crop」運算子。這不需要使用「-gravity」來獲取底部或右邊緣,但需要在之後「+repage」影像的畫布。

  magick frame_red.gif  -crop +0+10 +repage  crop_edge_top.gif
  magick frame_red.gif  -crop +10+0 +repage  crop_edge_left.gif
  magick frame_red.gif  -crop -10+0 +repage  crop_edge_right.gif
  magick frame_red.gif  -crop +0-10 +repage  crop_edge_bottom.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output]
這依賴於這樣一個事實:如果沒有給「-crop」指定要移除的影像區域,它將預設為影像畫布的大小(不是實際影像,而是影像的虛擬畫布)。這意味著您可以(對於簡單的影像)通過僅偏移要裁剪的區域來移除影像邊緣。使用「-crop」來「裁剪」影像邊緣的方法是由 Don Sheythe 發現和發表的,經過一些討論後,被認為是 IM 的「功能」,因此包含在此處。

進階裁剪技巧

裁剪至指定長寬比

您可以裁剪影像以適應特定的長寬比,但这很棘手,需要使用一些 DIY 的數學技巧。例如,您可以編寫腳本來進行計算,然後執行 裁剪。或者在 IM v6 中,您可以使用 扭曲視口 進行計算,以在 無操作扭曲 期間提取影像的所需部分,如 中心正方形裁剪 中所述。但是,在 ImageMagick 版本 7 中,您現在可以直接在「-crop」和「-extent」等指令中進行數學計算,從而繞過對誤用「-distort」的需求。這在 IM 開發者論壇的 裁剪到長寬比 中有詳細討論。

修剪,「自動裁剪」運算子

-trim」運算子與上面 討論 的高度通用的「-crop」運算子密切相關。但是,此運算子不是提供參數,而是嘗試移除影像中顏色或透明度沒有變化的任何邊框或邊緣。換句話說,它會移除影像周圍「無聊」的部分。
請注意,在 ImageMagick 版本 5 及更早版本中,自動裁剪操作是通過對「-crop」運算子使用「0x0」參數來實現的。現在情況不再如此,因為裁剪中的「零」大小參數現在表示「無限」或「到影像大小的限制」。

因此,現在對裁剪使用「0x0」參數實際上意味著將影像裁剪為拼貼,拼貼的大小與原始影像畫布的大小相同。換句話說,在 IM v6 中,結果將與原始影像相同,或者說是「無操作」。

例如,在這裡,我們以 IM 標誌為例,我們對其進行調整大小,並「修剪」或「自動裁剪」標誌周圍的所有額外空間。

    magick logo: -resize 30%    -trim     trim.gif
從上面我們可以注意到兩件事。首先,就像 "-crop" 一樣, "-trim" 會保留圖像的畫布大小。這意味著可以提取修剪的數值參數,以便進一步處理或調整圖像處理(請參閱修剪「雜訊」圖像 以獲取執行此操作的範例)。
[IM Output]
在這裡我們修剪圖像,但只列出圖像哪一部分被修剪的結果,而不是實際修剪後的圖像。

  magick logo: -resize 30%   -trim  info:-
[IM Text]
但是,如果您不關心此訊息,只需使用 "+repage" 運算符重置圖像的頁面訊息,或保存為不保存畫布訊息的格式(例如 JPEG 格式)即可將其刪除。在這裡,我們同時執行了這兩項操作,以表明我們正在刪除畫布訊息。

  magick logo: -resize 30%    -trim +repage    trim_repage.jpg
[IM Output]
第二件要注意的事情是,修剪並沒有真正修剪到最終圖像的最邊緣。這在標誌圖像的右下角尤為明顯,我們可以看到腳及其陰影與修剪邊緣之間存在明顯的間隙。在這個角落裡,這裡的顏色在數值上與圖像的背景顏色不同。因此,即使我們在圖像中看不到任何真正的變化, "-trim" 運算符也會看到細微的顏色變化,因此它並沒有像我們預期的那樣靠近圖像進行修剪。如果圖像是單一顏色的,則 "-trim" 會將圖像修剪為最小的單像素透明 遺漏圖像。這是合乎邏輯的,並且可以防止如果圖像保持原樣會出現更嚴重的問題。

使用特定顏色修剪

"-trim" 最令人擔憂的問題之一,尤其是在自動圖像處理腳本中,是修剪可能有點不可預測。例如,它不限於特定顏色,甚至不限於一種顏色。因此,您應該可以輕鬆修剪比預期多得多的內容。例如,讓我們對條紋顏色的簡單圖像進行簡單修剪。

  magick -size 32x32 xc:red xc:green xc:blue +append stripes.gif
  magick stripes.gif  -trim +repage   stripes_trimmed.gif
如您所見, "-trim" 不僅修剪了一種顏色,還修剪了兩種顏色!在自動腳本中,這可能非常糟糕,並且會產生意想不到的結果。如果您知道要從圖像中修剪什麼顏色,那麼更好的方法是在圖像中添加該顏色的小於一個像素寬的 "-border"。在這種情況下,讓我們採用「red」。

  magick stripes.gif -bordercolor red -border 1x1 \
          -trim +repage   stripes_trim_red.gif
當然,像這樣使用 "-border" 也會改變 "-trim" 努力保留的畫布偏移量。因此,如果您在不刪除虛擬畫布訊息的情況下查看結果,您會看到圖像已移位。
[IM Output] ==> [IM Output] [IM Output] ==> [IM Output]

  magick stripes.gif -bordercolor red -border 1x1  -trim  \
           stripes_trim_red_shifted.gif
[IM Output]
因此,讓我們嘗試在修剪特定顏色時校正虛擬畫布大小(減去 border_widthx2 )和偏移量(減去 border_width)。

  magick stripes.gif -bordercolor red -border 1x1  -trim  \
           -set page '%[fx:page.width-2]x%[fx:page.height-2]+%[fx:page.x-1]+%[fx:page.y-1]' \
           stripes_trim_red_fix.gif
[IM Output]
請注意,我正在恢復原始圖像的畫布大小和偏移量,邊框運算符 在上面進行了放大和移位。 "-trim" 操作本身正確地保留了圖像位置。如您所見,這是一個相當笨拙的調整。或者,如果您不關心畫布大小(在分層圖像中很常見),則可以使用更簡單的 相對重新分頁 來僅調整圖像在放大畫布上的位置。

  magick stripes.gif -bordercolor red -border 1x1  -trim  \
           -repage -1-1\! stripes_trim_red_fix2.gif
[IM Output]

僅修剪圖像的一側

正如您在上方所見,「-trim」會盡可能地修剪多個邊緣。甚至可以從不同邊緣移除兩種不同的顏色(如果非常小心地排列,則可以移除四種顏色)。當您只想限制修剪單一邊緣時,這會讓操作變得有點困難。為了確保我們只修剪單一邊緣,我們需要在另一邊緣添加一些色條,以保護其他三個邊緣。以下是我們先前建立的「border」影像僅修剪「左」邊緣或「西」邊緣的步驟說明。我在此範例中使用了比實際需要更厚的色條,以便您能更清楚地看到它們。通常只需要一個像素寬度即可。

  magick border.gif  -gravity East \
                      -background white -splice 5x0 \
                      -background black -splice 5x0  trim_protect.gif
  magick trim_protect.gif     -trim +repage         trim_oneside.gif
  magick trim_oneside.gif  -gravity East -chop 5x0  trim_west.gif
請注意,我添加了兩種不同顏色的色條!這樣一來,如果其中一種顏色與影像周圍現有的邊框顏色匹配,則另一種顏色將繼續保護這三個邊緣。此外,也只會修剪其中一種顏色,而只留下一種顏色色條需要清理。以下是單一命令中單邊緣修剪的完整過程,但用於修剪頂部邊緣(色條會添加到底部邊緣或「南」邊緣)。
[IM Output] ==> [IM Output] ==> [IM Output] ==> [IM Output]

  magick border.gif -gravity South \
          -background white -splice 0x1  -background black -splice 0x1 \
          -trim  +repage -chop 0x1   trim_north.gif
[IM Output]
以下是僅限底部邊緣的修剪。當然,不需要使用上一個範例中使用的「-gravity」設定,且設定預設為影像的「North-West」(西北)設定。

  magick border.gif \
          -background white -splice 0x1  -background black -splice 0x1 \
          -trim  +repage -chop 0x1   trim_south.gif
[IM Output]
當然,與之前的邊框一樣,將額外的顏色拼接成影像將再次改變虛擬影像畫布大小和圖層影像偏移。同樣地,可以使用我們在上一節中介紹的相同方法來解決此問題,但这取决于您在哪个边缘添加了额外的颜色以保留这些边缘。

使用模糊顏色選擇進行修剪-- 低品質 JPEG 影像

由於 JPEG 是「有損」的,因此影像中的顏色通常不是單一顏色,而是略有不同的顏色帶。因此,「-trim」通常無法用於 JPEG 或真實世界的影像。*未來:在此處提供失敗範例* 因此,您需要告訴 ImageMagick,不完全相同但合理接近的顏色應被視為相同顏色。添加一個非常小的「-fuzz」設定即可做到這一點。

  magick image.jpg  -fuzz 1% -trim +repage  image_fuzzy_trim.jpg
指定您希望該模糊度相對於的特定顏色也是一個非常好的主意。這可以通過使用「-border」運算符專門添加該顏色的邊框來實現。當然,邊框的顏色將始終與要修剪的顏色匹配,因此始終會被「-trim」移除。*未來:在此處提供模糊邊框修剪範例*

修剪「雜訊」影像-- 掃描影像

掃描影像面臨著類似的問題,掃描器經常會產生細微的單像素錯誤,這是由灰塵、髒污、掃描器本身的些微差異,或僅僅是讀取器接收到的電子雜訊所引起的。然而,在這種情況下,像素誤差通常太大,無法透過小的 模糊係數 來克服,因此需要不同的技術來修剪此類影像。最簡單的解決方案(儘管通常最不切實際)是對同一影像進行多次掃描(或是在靜態影片序列中使用多個影格),然後對結果進行平均以減少干擾。然而,這並不能去除掃描器上的灰塵斑點,也無法在只有一個影像或影格可用的情況下提供幫助,這使得這種方法在多數情況下都不切實際。一種實際的解決方案是分兩步進行。使用影像的副本,以某種方式處理它,以降低單像素誤差或掃描器灰塵的影響,同時增強大塊高對比度色彩的效果。然後,透過對此副本使用「-trim」,並檢查其確切的作用,您可以對原始未修改的影像使用相同的數量進行「-crop」。減少單像素誤差的方法有很多種。這些方法包括「-blur」、「-median」,甚至使用 基本形態學運算器 來移除特定細節,例如文字和細線。這種「模糊」方法提供了兩個主要控制項
  • -blur」sigma 半徑,或「-median」捲積半徑,它決定了您要忽略的灰塵斑點的大小。請注意,這兩個值都可以是浮點數,因此您可以精細地控制套用的模糊量。有關模糊處理的更多資訊,請參閱 模糊影像
  • 第二個控制項是「-fuzz」顏色係數,它控制「-trim」運算器匹配的顏色變化量。也就是說,您希望修剪後的影像與目標影像的接近程度。
例如,讓我們使用一個較小的「logo:」影像。

  magick logo:   -resize 30%   noisy.jpg
在這個小圖像中,我們可以將圖像中的星星和標題視為我們想要修剪忽略的雜訊。上面星星的寬度約為 5 個像素,因此我們想要使用大約兩倍的值來讓修剪基本上忽略它們。
[IM Output]
結果如下。請注意,在這種情況下,我們不需要圖像,只需要圖像中的畫布資訊。

  magick noisy.jpg  -virtual-pixel edge -blur 0x15 -fuzz 15% -trim  info:
[IM Text]
您可能需要檢查 虛擬像素 設定,以確保您在模糊處理時獲得正確的「邊緣效果」。

或者,您可以在模糊處理和適當調整偏移結果之前,在圖像周圍添加相同背景色的寬邊框。這可能更有利於從「-blur」和「-trim」運算器獲得更準確的結果。
從上面的結果可以看出,「-trim」在內部使用了「-crop」參數「89x121+78+23」。這是修剪後影像的實際大小及其在虛擬畫布上的偏移量,並且可能是我們在影像中尋找的主要(單個)物件的位置。
然後,這可以用於尚未模糊的原始影像。

  magick noisy.jpg   -crop 89x121+78+23 +repage   noisy_trimmed.jpg
我們已經將影像修剪到只剩下巫師了!
[IM Output]
這可以使用一行命令完成,方法是使用一些額外的「UNIX shell 腳本」以及對第一個命令結果的一些格式化。

  magick noisy.jpg -crop \
    `magick noisy.jpg -virtual-pixel edge -blur 0x15 -fuzz 15% \
             -trim -format '%wx%h%O' info:`   +repage   noisy_trimmed_2.jpg
更多關於用來控制 "info:" 輸出結果的 "-format" 設定資訊,請參閱圖片屬性跳脫字元
[IM Output]
上述範例使用 UNIX 命令列 shell 的「命令替換」功能,以單引號 '`...`' 將產生的 "-crop" 參數插入外部的 "magick" 命令中。

您可以在 Windows 批次檔 中使用特殊的 FOR..DO 語法來完成此操作。詳情請參閱上述連結。
請注意,雖然巫師的手完全可見,但帽子的尖端卻沒有。這就是這個方法的缺點,它會忽略尖銳的點和精細的細節。但這也是我們一開始就要求它忽略的。
這個方法可以透過使用一些 FX 跳脫字元 來進行數學運算,將修剪區域向四個方向擴展少許(10 個像素)來改進...

  magick noisy.jpg -crop \
      `magick noisy.jpg -virtual-pixel edge -blur 0x15 -fuzz 15% -trim \
               -format '%[fx:w+20]x%[fx:h+20]+%[fx:page.x-10]+%[fx:page.y-10]' \
      info:` +repage   noisy_trimmed_3.jpg
[IM Output]
如果計算出的邊界超出原始圖片,crop 運算子 會自動將其限制在圖片邊界內。
在 IMv7(使用 "magick" 命令)中,您可以在一個命令中完成所有操作,並將計算出的修剪大小儲存在設定中以供稍後使用。

  magick noisy.jpg \
         \( +clone -virtual-pixel edge -blur 0x15 -fuzz 15% -trim \
            -set option:fuzzy_trim \
                     '%[fx:w+20]x%[fx:h+20]+%[fx:page.x-10]+%[fx:page.y-10]'\
            +delete \) \
         -crop %[fuzzy_trim] noisy_trimmed_4.jpg
[IM Output]
其他模糊修剪的方法是使用各種 形態學方法 來移除圖片中不需要的部分,然後再進行修剪以找到原始圖片中所需區域的邊界。使用者 HugoRune 需要將圖片修剪到一個對比度極高的區域以進行掃描。詳情請參閱 IM 論壇上的討論