ImageMagick 範例 --
裁剪和加邊框
- 索引
-
ImageMagick 範例 前言和索引
-
裁剪 (以自由形式裁切影像)
-
新增/移除影像邊緣
-
新增/移除行、列和邊緣
-
進階裁剪技巧
-
修剪,「自動裁剪」操作
- 使用修剪
- 使用特定顏色修剪
- 僅修剪影像的一側
- 修剪「模糊」影像 -- 低品質 JPEG 影像
- 修剪「雜訊」影像 -- 掃描或影片影像
裁剪(將影像裁剪到所需尺寸)
裁剪和畫布頁面
「-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
|
![[IM Output]](rose.gif)

![[IM Output]](crop.gif)
![[IM Output]](crop_br.gif)
![[IM Output]](crop_tl.gif)
![[IM Output]](crop_all.gif)
![[IM Output]](crop_miss.gif)
magick identify
」輸出。請注意,顯示影像的大小(其虛擬畫布)並未受到「-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
" 操作錯過了它要裁剪的實際圖片,因此它產生了這個特殊的「遺漏」圖片,以及一些資訊性的警告訊息...輸出圖片或「遺漏」圖片是一個最小圖片,大小為 1 個像素,偏移量為 0,但具有原始圖片的頁面或畫布大小,以及圖片可能關聯的任何其他中繼資料。在這裡,它代表了應該由 "-crop
" 返回的「空白」或「零大小」圖片,但由於沒有圖片格式可以輸出「零」維度的圖片,因此改用單一透明像素圖片。為了讓您看得更清楚,以下是遺漏圖片的 "identify
" 輸出,以及該單一像素圖片的「IM 像素列舉」,顯示它只包含一個單一透明像素。這個「遺漏」圖片基本上與建立 "null:
" 圖片相同,但設置了原始來源圖片的頁面或虛擬畫布大小(但沒有設置其偏移量),以及所有其他圖片中繼資料,例如 GIF 動畫時間延遲。但是,GIF 處置方法可能會修改,以確保在裁剪後動畫保持正確。基本上,您需要記住 "-crop
" 和其他類似的相關運算子可能會產生特殊的「遺漏」圖片。因此,在使用 IM 編寫腳本時,如果可能出現這種最小圖片並可能導致問題,您應該計劃查找警告訊息或這個特殊的「遺漏圖片」。如果您不想要警告訊息(例如,您預期並處理偶爾出現的「遺漏」圖片),您可以將 "-quiet
" 操作控制設定 添加到命令列。這會告訴 IM 不要輸出資訊性警告訊息,只輸出真正的錯誤。目前沒有方法可以從目前的圖片序列中移除任何「遺漏」或 "null:
" 圖片。但是,已經針對未來版本的 IM 提出了這樣的方法。如果您發現需要這種方法,請寫信給我。裁剪具有現有虛擬畫布的圖片
如果圖片已經具有現有的 虛擬畫布(例如 GIF 動畫的影格),則 "-crop
" 操作將應用於虛擬畫布,而不是實際圖片。也就是說,它會嘗試保留裁剪後的圖片在畫布上的實際像素資料偏移量。也就是說,裁剪前的特定像素在裁剪後應該仍然位於相對於虛擬畫布的相同偏移量處。通過這種方式,即使「畫布」本身沒有被裁剪,分層圖片或 GIF 動畫的裁剪也將繼續正常工作。在這裡,我們在頁面畫布上建立了一個居中的圖片,並以各種方式裁剪它。和以前一樣,操作不會修改畫布大小本身。
|
![[IM Output]](paged.gif)

![[IM Output]](crop_page.gif)
![[IM Output]](crop_page_tl.gif)
![[IM Output]](crop_page_br.gif)
![[IM Output]](crop_page_all.gif)
![[IM Output]](crop_page_miss.gif)
![]() |
-quiet
" 設定抑制了來自 IM 的正常警告訊息。為了讓您清楚地看到發生了什麼,讓我們仔細看看圖片右下角的頁面裁剪。在這裡,我在被裁剪的區域上繪製了一個半透明的正方形。
magick paged.gif -page 64x64+32+32 -size 32x32 xc:'#fff8' \ -alpha set -background none -mosaic crop_area_br.png |
![[IM Output]](paged.gif)

![[IM Output]](crop_area_br.png)

![[IM Output]](crop_page_br.gif)
從結果中移除虛擬畫布
如果不需要這個 虛擬畫布 資訊,則可以使用特殊的「+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]](rose.gif)

![[IM Output]](repage.gif)
![[IM Output]](repage_br.gif)
![[IM Output]](repage_tl.gif)
![[IM Output]](repage_all.gif)
![[IM Output]](repage_miss.gif)
-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
|
![[IM Output]](rose.gif)

![[IM Output]](crop_vp.gif)
![[IM Output]](crop_vp_br.gif)
![[IM Output]](crop_vp_tl.gif)
![[IM Output]](crop_vp_all.gif)
![[IM Output]](crop_vp_miss.gif)
![]() |
![]() ![]() |
「! 」字元對某些 UNIX shell(如「csh 」)具有特殊含義,即使放在引號內也必須使用反斜線進行跳脫。 |
+repage
」。但是,任何部分或遺漏的圖像裁切,結果都將是一個更大的畫布和可能對應圖像的偏移量。因此,這不能替代在裁切後執行「+repage
」以重設頁面/畫布資訊。但是,您可以在「視口裁切」之後使用 拼合 來用真實像素「填充」圖像的新虛擬畫布。也就是說,您將獲得一張大小保證與請求裁切大小相同的圖像,並且任何「遺漏」的區域都將使用當前的「-background
」顏色「視口」填充。例如在 填充圖像 時。
|
![]() |
![]() ![]() |
生成多圖像「平鋪裁剪」或等面積平鋪裁剪時,不能使用「! 」標記,因為它具有不同的含義。請參閱下面的相應章節。 |
相對於重心裁剪
默認情況下,「-crop
」的偏移位置是相對於圖像左上角的。但是,通過設置「-gravity
」設定,您可以告訴「-crop
」相對於圖像的中心、角落或邊緣裁剪圖像。重力裁剪最常見的用途是裁剪圖像的「center
」。
|
![]() |
-gravity
」設定不僅會影響裁剪的初始「零」位置,還會影響裁剪偏移的方向。例如,如果您使用「-gravity
」的「South
」和「+0+5
」的偏移,則會向上偏移裁剪區域,而不是像通常那樣向下偏移。
|
![]() |
+repage
」操作,以便您可以看到裁剪區域是如何從圖像的底部邊緣移出的。另請注意,裁剪區域不僅相對於底部(南)邊緣,而且該區域是「對齊」的中心,位於底部邊緣的中間。所有受重力影響的操作都是這樣完成的。 裁剪影像的百分比
「-crop
」運算符還了解如何將圖像裁剪為其原始大小的一定百分比。例如,這將圖像的大小減半。
|
![]() |
![]() ![]() |
如果只給出一個大小數字,則該值將用於寬度和高度百分比,並且將要裁剪的區域的最終大小將四捨五入到最接近的整數。偏移量不是可選的。 |
|
![]() |
![]() ![]() |
當給出帶有偏移量的裁剪時,您必須在參數中提供一個「x 」符號,以便可以正確解釋該參數。當只為裁剪區域的寬度和高度提供一個數字時,這一點尤其重要。因此,您不能使用「 50%+30+20 」這樣的參數,這是一個錯誤,並且將導致裁剪靜默地不執行任何操作。 |
|
![]() |
![]() ![]() |
百分比符號「% 」可以出現在參數中的任何位置,如果給定的話,它將引用寬度和高度數字。它只是一個標記,用於聲明「圖像大小」部分是圖像虛擬畫布或頁面大小的百分比分數。偏移量始終以像素為單位給出。 |
|
![]() |
![]() ![]() |
您不能將百分比大小用於平鋪裁剪(請參閱下一節)。因此,如果未提供偏移量,並且給定了百分比大小(如上所示),則假定偏移量為 +0+0。 |
!
」旗標表示不需要「+repage
」。但是,對於可能也具有虛擬畫布大小和偏移量的輸入圖像,仍建議謹慎使用。 拼貼裁剪,將一張影像分割成多張影像
裁剪更有用的方面之一是,當您沒有為裁剪命令指定特定位置時。也就是說,您給定了一個大小,而不是要裁剪的圖像內的位置。在這種情況下,裁剪不會只生成一個圖像,而是生成一系列圖像。
|
![[IM Output]](paged.gif)

![[IM Output]](tiles_0.gif)
![[IM Output]](tiles_1.gif)
![[IM Output]](tiles_2.gif)
![[IM Output]](tiles_3.gif)
![]() |
![]() ![]() |
最好使用「+gravity 」關閉重力。這是因為在一種特殊情況下(居中百分比裁剪),重力設置可以關閉平鋪裁剪。重力對平鋪裁剪的其他影響也未定義。 |
-mosaic
」或「-flatten
」圖像分層運算符(請參閱圖層拼合),您可以將這些圖像全部疊加在一起,恢復原始圖像。
|
![]() |
-mosaic
」填充了背景顏色。另一種方法是使用「-layers merge
」(請參閱圖層合併),它將多個圖層圖像合併到一個新的圖層圖像中,該圖像的大小足以容納所有給定的圖像。也就是說,虛擬畫布沒有被填充,就像「-mosaic
」或「-flatten
」分層方法那樣。
|
![]() |
|
|
+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 |
![]() |
![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
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" |
![]() |
![]() |
![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
rose_tile_1_1.gif
」到「rose_tile_4_3.gif
」,這是一個更好的文件命名方案。很棘手,但確實有效。不幸的是,您不能格式化百分比轉義符生成的數字,以包含用零填充或指定確切的小數位數。至少目前還不行。 居中平鋪裁剪
在一個IM 論壇討論中,有人提出將區塊裁剪置中,以便將「剩餘影像」均勻分佈在邊緣。透過這種方式,我們可以將完整的區塊放置在影像中央,以最大限度地發揮其效果。當然,您最終也會得到更多不完整的邊緣區塊。解決方案是將輸入影像置中於一個虛擬畫布上,該畫布是所需區塊大小的倍數。例如,要將「rose:
」影像(大小為 70x46
像素)裁剪為最大數量的完整 30x20
區塊,並將其置於影像中央(並以剩餘區塊包圍),您可以執行以下操作。- 首先,透過將影像大小相除來計算您可以從影像中獲得的完整區塊數量...
70x46 / 30x20 => 2x2 full tiles + remainder
- 現在,再新增 2 個行和列來容納剩餘影像(如果需要)。
2x2 + 2x2 => 4x4 tile images
- 將區塊大小乘以這個數字,即可獲得虛擬畫布大小。
30x20 * 4x4 => 120x80 canvas size
- 減去原始影像大小,然後除以 2,即可得到置中偏移量。
( 120x80 - 70x46 ) / 2 => +25+17
120x80+25+17
。在這裡,我們使用上述計算結果來執行置中區塊裁剪...如果您想保留區塊的原始偏移位置,但移除置中偏移,可以使用「-repage -25-17\!
」(將上述內容中的「+repage
」替換掉)來進行相對偏移調整。如果您沒有在區塊數量中添加兩行和兩列,因此產生了負偏移,則可以有效地忽略剩餘的邊緣區塊,並且只輸出影像中存在的完整區塊。基本上,由於剩餘部分現在位於計算出的虛擬畫布「外部」,因此「-crop
」運算子不知道它們的存在並忽略它們。同樣,將上述內容中的「+repage
」替換為使用否定偏移值的相對偏移調整「-repage +5+3\!
」,將恢復裁剪區塊的原始偏移位置。置中區塊裁剪並忽略剩餘部分的另一種方法是,只需將虛擬畫布設置替換為適當的裁剪即可。
magick rose: -gravity center -crop 60x40+0+0 +gravity +repage \ -crop 30x20 +repage rose_ctiles2_%d.gif |
![]() |
![]() |
![]() |
![]() ![]() ![]() ![]() |
條狀裁剪,裁剪掉行和列
在 IM 6.1.1 版中,「-crop
」得到了增強,因此如果缺少其中一個大小參數或將其設置為零,則缺少的大小參數將設置為影像畫布/頁面的大小。在大多數情況下,如果相關偏移量也設置為零,則此大小足以覆蓋位於畫布上的影像。這一微小的變化允許您輕鬆地從影像中剪切單行或單列,而無需使用「999999
」這樣的大數字來覆蓋影像的大小。例如,在這裡,我們從「分頁」的玫瑰影像中提取一個簡單的行和列。
|
![[IM Output]](paged.gif)

![[IM Output]](strip_column.gif)
![[IM Output]](strip_row.gif)
|
|
![[IM Output]](crop.gif)

![[IM Output]](strips_0.gif)
![[IM Output]](strips_1.gif)
![[IM Output]](strips_2.gif)
![[IM Output]](strips_3.gif)
|
-quiet
」設定可以抑制 IM 通常會產生的警告。除非您預期會發生這種情況並已做好準備(例如在腳本中),否則不建議這樣做。![]() ![]() |
圖像的位置可能會導致其在其自身的頁面或虛擬畫布上根本不顯示,或者圖像太大而導致頁面畫布只能包含圖像的一小部分或窗口。 在這種罕見的情況下,如果在沒有任何尺寸參數的情況下進行條狀裁剪,則會導致圖像子區域劃分錯誤,並分別產生遺漏圖像或僅包含虛擬畫布邊界內部分的較小圖塊。 但是,「 -crop 」運算符不會被修正來處理這些罕見的特殊情況,因為這樣做會妨礙其在其他情況下的使用,例如以下示例中的情況。如果這對您來說是個問題,請在裁剪之前使用「 +repage 」清理圖像的頁面偏移量,以便在嘗試生成圖塊圖像之前移除虛擬畫布。 |
divide_vert
」。此程式允許您根據單一純色的水平「間隙」分割圖像。例如,如果給定一個簡單的文字圖像,它會將其分割成交替的「行」和「間隙」圖像。一個簡單的選項可讓您移除這些間隙。象限,圍繞單一點裁剪
如果缺少任何裁剪尺寸數值,則會將其替換為要裁剪的圖像畫布尺寸。在大多數情況下,這會導致該維度上的整個圖像成為裁剪結果的一部分。通過謹慎使用這些參數,您可以將圖像裁剪成圍繞特定點的四分之一(將該特定像素放置為左下象限圖像的右上角像素)。您無需知道圖像的大小即可執行此操作。例如,這裡我將圖像圍繞點 30,40 裁剪成四分之一。
|
![[IM Output]](paged.gif)

![[IM Output]](quadrant_tl.gif)
![[IM Output]](quadrant_tr.gif)
![[IM Output]](quadrant_bl.gif)
![[IM Output]](quadrant_br.gif)
使用負偏移量,移除底部或左側邊緣
沒有理由不能在「-crop
」中使用負偏移量。事實上,有時它會帶來非常明顯的好處。例如,讓我們使用我們的分頁玫瑰圖像,並使用更大的負偏移量逐步裁剪它。我們不會為「-crop
」參數提供圖像尺寸,因此它將預設為圖像畫布尺寸。
|
![[IM Output]](paged.gif)

![[IM Output]](neg_offset_1.gif)
![[IM Output]](neg_offset_2.gif)
![[IM Output]](neg_offset_3.gif)
![[IM Output]](neg_offset_4.gif)
![[IM Output]](neg_offset_5.gif)
-chop
”運算符,但沒有“-gravity
”設置。請參閱裁剪,移除邊緣。當然,通過使用“-crop
”,您可能需要使用“+repage
”運算符來調整畫布/頁面信息,而“-chop
”會自動執行此類調整。這就是生活。裁剪成大致相等的尺寸
平鋪裁剪的最大問題是您只能定義每個平鋪的最終大小。當圖像大小是所需平鋪大小的精確倍數時,這非常有效,但正如您所見,如果不是這種情況,您最終可能會在右側和底部邊緣出現“短”平鋪。例如,讓我們再次分割內置的玫瑰圖像,但嘗試將其分成 3x3 的平鋪。原始圖像為 70x46 像素,因此除以 3 後,每個平鋪為 23x15 像素...嗯,正如您所見,這不起作用,因為玫瑰圖像無法完全分割成 3 個大小相等的平鋪。在這種情況下,您最終會得到一個“短”1 個像素的平鋪。即使您將平鋪的大小擴展到 24x16 像素,您仍然會得到一個比其他平鋪“短”2 個像素的平鋪。隨著所需平鋪數量的增加,這種情況會變得更糟。例如,嘗試將長度為 100 的線段細分為 30 個平鋪。這是不可能的。您可以使用長度為 3 並獲得 34 個平鋪,或者使用長度為 4 並獲得 25 個平鋪。獲得正好 30 個大小相等的平鋪是不可能的!從 IM v6.5.8-9 開始,您現在可以在“-crop
”參數中添加特殊的“@
”標誌。此標誌告訴“-crop
”運算符盡力將圖像平均分成給定的平鋪數量。例如...結果是圖像被分割成大小略有不同的平鋪。但是,平鋪大小最多只會相差 1 個像素!快來看看吧!此外,您還可以對圖像進行細分,以便每個平鋪与其相鄰的平鋪“重疊”。您可以通過不僅使用“@
”標誌,還指定所需的重疊像素數來做到這一點。例如,讓我們將玫瑰分成四等份,但重疊 20 個像素。同樣,所有區塊的尺寸最多只會相差一個像素!雖然在這種情況下,由於玫瑰圖可以被 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 這種特殊情況。請注意,此細分邊緣上的圖像比中間的圖像略短。這就是為什麼這種特殊的運作「模式」不是默認模式,儘管它實際上比以前的間隔圖塊類別更簡單。另請注意,當同時使用「@
」和「!
」標記時,單個圖塊裁切(在本例中為垂直)没有任何效果,因為圖塊的頂部和底部都是「邊緣」,因此没有要移除的「邊緣空間」。同樣,透過對重疊使用負值,您可以告訴 IM 不要在圖塊裁切結果中包含重疊(間距)區域。
![]() ![]() |
「! 」字元對某些 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]](border.gif)
![[IM Output]](border_default.gif)
![[IM Output]](border_sides.gif)
![[IM Output]](border_topbot.gif)
![[IM Output]](border_none.gif)
none
」,但要使其按預期工作,我们需要確保圖像實際上包含「遮罩」或「alpha」通道。另請注意,如果垂直和水平邊框大小相同,則可以省略邊框中的第二個數字,僅使用一個數字。![]() ![]() |
如上所示,「-border 」運算符使用的默認顏色為淺灰色,因为它與 WWW 上網頁的默認灰色頁面顏色非常匹配。 |
|
![]() |
-border
」所做的是建立一個大小合適的新圖像,然後將原始源圖像疊加在此新背景上。這本身在 ImageMagick 中是一個非常有用的操作,用於設定透明和半透明圖像的背景。也就是說,看似無用的「-border 0
」操作在 IM 版本 6 中是一個非常有用的操作。例如...當然,還有很多其他方法可以 移除 Alpha 透明度。![]() ![]() |
為具有透明度的圖像添加邊框,默認情況下也會填充圖像的透明背景,這一事實引發了 IM 用戶和開發團隊之間的一些爭論。有關此爭論的摘要,請參閱 邊框、框架和 BorderColor 的使用。 |
邊框和 Alpha 合成
圖像疊加到邊框顏色畫布上的方式由「-compose
」設定控制,預設設定為「Over
」alpha 合成。如果設定為其他設定,「-border
」操作可能會產生意外結果。例如,以下是一些將「-compose
」與「-border
」圖像運算子一起使用時,應用於包含一些透明區域的圖像的更有趣用途。選擇使用「Over
」還是「Copy
」基本上決定了您是否要保留圖像中的透明度。例如,以下是具有透明度的相同「星形」圖像,但這次添加邊框時沒有破壞圖像的透明度。
|
![]() |
-bordercolor
」設定為何,「Src
」合成都會將透明邊框添加到圖像(如果它具有 Alpha 色板)。基本上,產生的背景畫布「-border
」會被忽略。「Dst
」看起來可能不是很有用,但可以用於產生與原始圖像大小相同(或稍大)的畫布。原始圖像僅用於確定畫布的最終大小。如需更多範例,請參閱調整為現有圖像大小的畫布。如需各種「-compose
」方法的更多資訊,請參閱Alpha 合成範例。邊框和虛擬畫布
當「-border
」應用於包含虛擬畫布的圖像時,它仍然會在該虛擬畫布上的實際圖像周圍添加邊框,而不是圍繞整個畫布。請注意,虛擬畫布的大小也會增加兩倍的邊框粗細,以容納添加的邊框。當然,這意味著您不能簡單地將邊框直接添加到典型的 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]](frame.gif)
![[IM Output]](frame_wierd.gif)
![[IM Output]](frame_blue.gif)
![[IM Output]](frame_red.gif)
![[IM Output]](frame_rasied.gif)
![[IM Output]](frame_rasied_part.gif)
![[IM Output]](frame_sunken_part.gif)
![[IM Output]](frame_sunken.gif)
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]](frame_normal.gif)
![[IM Output]](frame_popped.gif)
![[IM Output]](frame_pressed.gif)
![[IM Output]](frame_inverted.gif)
![]() ![]() |
預設的「-mattecolor 」比「-bordercolor 」的預設設定稍微暗一些的灰色。這也使其能夠與 WWW 上網頁的預設灰色相匹配(由「mosaic 」和「netscape 」等早期瀏覽器使用)。(見下文) |
![]() ![]() |
雖然「-frame 」可能會實際使用「-mattecolor 」顏色,但它也會從這個基礎生成另外四種額外顏色,用於繪製邊框。也就是說,可能會在圖像中添加五種相關顏色,而不僅僅是一種。 |
magick montage
」的框架圖像,並帶有文字標籤。
|
![]() |
-mattecolor
」作為邊框「-frame
」,然後在下面放置一個有趣的圖案(例如碎形等離子畫布),以產生更豐富多彩的邊框。
|
![]() |
邊框和 Alpha 合成
邊框與「-border
」運算子密切相關。不僅邊框是使用「-mattecolor
」繪製的,而且此運算子還將使用「-bordercolor
」設定來定義最初繪製邊框的背景。現在,對於沒有透明度的圖像,「-bordercolor
」將不可見,因為它被圖像本身覆蓋。但對於確實包含一些透明區域的圖像,背景顏色會變得可見。
|
![]() |
-frame
」的作用就像您將圖像放在具有純色背景的相框上一樣。因此,圖像中任何透明的部分都將被「-bordercolor
」替換,默預設情況下為淺灰色。![]() ![]() |
將邊框添加到具有透明度的圖像時,默認情況下也會使用邊框顏色填充圖像的透明背景,這一事實引發了 IM 用戶和開發團隊之間的一些爭論。有關此爭論的摘要,請參閱邊框、框架和邊框顏色的使用。 |
-bordercolor
」,例如「none
」。
|
![]() |
Copy
」的特殊「-compose
」方法來完成的。
|
![]() |
![]() ![]() |
將「-bordercolor」用作「-border 」和「-frame 」的背景圖像是在 IM 6.1.4 版中添加的。在此之前,生成的背景畫布由黑色畫布組成,邊框或框架繪製在該畫布上。這種黑色畫布的使用對於「 magick montage 」命令來說尤其糟糕,該命令在其內部處理中大量使用了內部「-frame 」函數。(請參閱蒙太奇背景和透明度處理) |
-frame
」運算子和「-border
」一樣,也使用「-compose
」設定來定義原始圖像如何疊加到背景框架上。如果您还想在「magick montage」框架中使用「-bordercolor
」設定,那麼使用「-compose
」設定為「Copy
」就變得非常重要。有關更多詳細資訊,請參閱蒙太奇背景和透明度處理。 框架和虛擬畫布
與邊框和虛擬畫布一樣,框架也是應用在虛擬畫布上實際圖像的周圍,而不是整個畫布的周圍。
|
![[IM Output]](paged.gif)

![[IM Output]](paged_framed.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]](border.gif)

![[IM Output]](shave.gif)
![[IM Output]](shave_sides.gif)
![[IM Output]](shave_topbot.gif)
-chop
」運算子。(請參閱下面的裁剪範例)。和以前一樣,所有運算子「-border
」、「-frame
」和「-shave
」僅影響虛擬畫布上的實際圖像,而不影響虛擬畫布本身。
|
![[IM Output]](paged.gif)

![[IM Output]](paged_border.gif)

![[IM Output]](paged_frame.gif)

![[IM Output]](paged_shave.gif)
-shave
」不同,它不會修改結果圖像的畫布大小。
![]() ![]() |
在 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]](extent_enlarge.gif)
![[IM Output]](extent_shrink.gif)
![[IM Output]](extent_wider.gif)
![[IM Output]](extent_taller.gif)
-background
」顏色填充任何新區域。![]() ![]() |
在 IM 版本 v6.3.2 之前,「-extent 」只是將任何新區域的記憶體清除為零,或者直接清除為黑色。它沒有使用「-background 」顏色填充這些區域。 |
-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]](extent_north.gif)
![[IM Output]](extent_south.gif)
![[IM Output]](extent_east.gif)
![[IM Output]](extent_west.gif)
![[IM Output]](extent_center.gif)
![[IM Output]](extent_center2.gif)
-repage
」,不過它會使用目前的「-background
」顏色來「平面化」影像。您甚至可以使用偏移量,這基本上意味著 Extent 運算子 只是一個簡單的 Crop,並帶有背景填色,而不用管位置。
|
![]() |
-extent
」的工作原理是使用與 Border 和 Frame 運算子相同的「覆蓋」技術。因此,默認情況下,將其用於包含透明度的影像將會使用目前的「-background
」顏色替換透明度。
|
![]() |
-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]](rose.gif)

![[IM Output]](splice.gif)
![[IM Output]](splice_column.gif)
![[IM Output]](splice_row.gif)
![[IM Output]](splice_topleft.gif)
![]() ![]() |
如果未設定背景顏色,IM 將嘗試從影像本身確定此值。這意味著對於某些影像,它可能是白色(正常的默認值),而在其他影像上,它可能是黑色,或者對於 GIF 格式,它可能是儲存該影像時設定的任何背景顏色。
這基本上意味著,如果您沒有設定「 -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]](splice_top.gif)
![[IM Output]](splice_bottom.gif)
![[IM Output]](splice_left.gif)
![[IM Output]](splice_right.gif)
![[IM Output]](splice_botright.gif)
|
![]() |
裁切,移除行、列和邊緣
「-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]](splice.gif)

![[IM Output]](splice_chop.gif)

![[IM Output]](chop.gif)

![[IM Output]](chop_splice.gif)
-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]](frame_red.gif)

![[IM Output]](chop_top.gif)
![[IM Output]](chop_left.gif)
![[IM Output]](chop_right.gif)
![[IM Output]](chop_bottom.gif)
-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]](frame_red.gif)

![[IM Output]](crop_edge_top.gif)
![[IM Output]](crop_edge_left.gif)
![[IM Output]](crop_edge_right.gif)
![[IM Output]](crop_edge_bottom.gif)
-crop
」指定要移除的影像區域,它將預設為影像畫布的大小(不是實際影像,而是影像的虛擬畫布)。這意味著您可以(對於簡單的影像)通過僅偏移要裁剪的區域來移除影像邊緣。使用「-crop
」來「裁剪」影像邊緣的方法是由 Don Sheythe 發現和發表的,經過一些討論後,被認為是 IM 的「功能」,因此包含在此處。進階裁剪技巧
裁剪至指定長寬比
您可以裁剪影像以適應特定的長寬比,但这很棘手,需要使用一些 DIY 的數學技巧。例如,您可以編寫腳本來進行計算,然後執行 裁剪。或者在 IM v6 中,您可以使用 扭曲視口 進行計算,以在 無操作扭曲 期間提取影像的所需部分,如 中心正方形裁剪 中所述。但是,在 ImageMagick 版本 7 中,您現在可以直接在「-crop
」和「-extent
」等指令中進行數學計算,從而繞過對誤用「-distort
」的需求。這在 IM 開發者論壇的 裁剪到長寬比 中有詳細討論。修剪,「自動裁剪」運算子
「-trim
」運算子與上面 討論 的高度通用的「-crop
」運算子密切相關。但是,此運算子不是提供參數,而是嘗試移除影像中顏色或透明度沒有變化的任何邊框或邊緣。換句話說,它會移除影像周圍「無聊」的部分。![]() ![]() |
請注意,在 ImageMagick 版本 5 及更早版本中,自動裁剪操作是通過對「-crop 」運算子使用「0x0 」參數來實現的。現在情況不再如此,因為裁剪中的「零」大小參數現在表示「無限」或「到影像大小的限制」。
因此,現在對裁剪使用「 |
例如,在這裡,我們以 IM 標誌為例,我們對其進行調整大小,並「修剪」或「自動裁剪」標誌周圍的所有額外空間。
-crop " 一樣, "-trim " 會保留圖像的畫布大小。這意味著可以提取修剪的數值參數,以便進一步處理或調整圖像處理(請參閱修剪「雜訊」圖像 以獲取執行此操作的範例)。 |
![]() |
但是,如果您不關心此訊息,只需使用 "+repage " 運算符重置圖像的頁面訊息,或保存為不保存畫布訊息的格式(例如 JPEG 格式)即可將其刪除。在這裡,我們同時執行了這兩項操作,以表明我們正在刪除畫布訊息。
|
![]() |
-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
" 努力保留的畫布偏移量。因此,如果您在不刪除虛擬畫布訊息的情況下查看結果,您會看到圖像已移位。
![]() ![]() ![]() |
![]() ![]() ![]() |
|
|
![]() |
border_widthx2
)和偏移量(減去 border_width
)。
|
![]() |
-trim
" 操作本身正確地保留了圖像位置。如您所見,這是一個相當笨拙的調整。或者,如果您不關心畫布大小(在分層圖像中很常見),則可以使用更簡單的 相對重新分頁 來僅調整圖像在放大畫布上的位置。
|
![]() |
僅修剪圖像的一側
正如您在上方所見,「-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 |
![]() ![]() ![]() ![]() ![]() ![]() ![]() |
||
|
![]() |
-gravity
」設定,且設定預設為影像的「North-West
」(西北)設定。
|
![]() |
使用模糊顏色選擇進行修剪-- 低品質 JPEG 影像
由於 JPEG 是「有損」的,因此影像中的顏色通常不是單一顏色,而是略有不同的顏色帶。因此,「-trim
」通常無法用於 JPEG 或真實世界的影像。*未來:在此處提供失敗範例* 因此,您需要告訴 ImageMagick,不完全相同但合理接近的顏色應被視為相同顏色。添加一個非常小的「-fuzz
」設定即可做到這一點。
magick image.jpg -fuzz 1% -trim +repage image_fuzzy_trim.jpg |
-border
」運算符專門添加該顏色的邊框來實現。當然,邊框的顏色將始終與要修剪的顏色匹配,因此始終會被「-trim
」移除。*未來:在此處提供模糊邊框修剪範例* 修剪「雜訊」影像-- 掃描影像
掃描影像面臨著類似的問題,掃描器經常會產生細微的單像素錯誤,這是由灰塵、髒污、掃描器本身的些微差異,或僅僅是讀取器接收到的電子雜訊所引起的。然而,在這種情況下,像素誤差通常太大,無法透過小的 模糊係數 來克服,因此需要不同的技術來修剪此類影像。最簡單的解決方案(儘管通常最不切實際)是對同一影像進行多次掃描(或是在靜態影片序列中使用多個影格),然後對結果進行平均以減少干擾。然而,這並不能去除掃描器上的灰塵斑點,也無法在只有一個影像或影格可用的情況下提供幫助,這使得這種方法在多數情況下都不切實際。一種實際的解決方案是分兩步進行。使用影像的副本,以某種方式處理它,以降低單像素誤差或掃描器灰塵的影響,同時增強大塊高對比度色彩的效果。然後,透過對此副本使用「-trim
」,並檢查其確切的作用,您可以對原始未修改的影像使用相同的數量進行「-crop
」。減少單像素誤差的方法有很多種。這些方法包括「-blur
」、「-median
」,甚至使用 基本形態學運算器 來移除特定細節,例如文字和細線。這種「模糊」方法提供了兩個主要控制項例如,讓我們使用一個較小的「logo: 」影像。
|
![]() |
![]() ![]() |
您可能需要檢查 虛擬像素 設定,以確保您在模糊處理時獲得正確的「邊緣效果」。 或者,您可以在模糊處理和適當調整偏移結果之前,在圖像周圍添加相同背景色的寬邊框。這可能更有利於從「 -blur 」和「-trim 」運算器獲得更準確的結果。 |
-trim
」在內部使用了「-crop
」參數「89x121+78+23
」。這是修剪後影像的實際大小及其在虛擬畫布上的偏移量,並且可能是我們在影像中尋找的主要(單個)物件的位置。然後,這可以用於尚未模糊的原始影像。
|
![]() |
這可以使用一行命令完成,方法是使用一些額外的「UNIX shell 腳本」以及對第一個命令結果的一些格式化。
info: " 輸出結果的 "-format " 設定資訊,請參閱圖片屬性跳脫字元。 |
![]() |
![]() ![]() |
上述範例使用 UNIX 命令列 shell 的「命令替換」功能,以單引號 '`...` ' 將產生的 "-crop " 參數插入外部的 "magick " 命令中。您可以在 Windows 批次檔 中使用特殊的 FOR..DO 語法來完成此操作。詳情請參閱上述連結。 |
這個方法可以透過使用一些 FX 跳脫字元 來進行數學運算,將修剪區域向四個方向擴展少許(10 個像素)來改進...
|
![]() |