ImageMagick 範例 --
建立縮圖和相框

ImageMagick 範例前言和索引
縮圖儲存
一般縮圖建立
其他非 IM 技術
添加裝飾
相框技術
使用邊緣圖片製作相框
ImageMagick 最大的用途之一是為家庭相簿、運動和興趣頁面、目錄等建立縮圖。通常用於全球資訊網或照片 CD。此頁面提供了用於產生縮圖的範例和技術。

縮圖儲存

我想先從一個非常重要的觀點開始。來自攝影機和照片掃描的原始圖片應以原始格式保存在安全的地方,最好是非失真格式(不是 JPEG 圖片格式),不做任何修改大小調整或其他更改,可能只是更改檔案名稱。當然,掃描的圖片可以重新掃描,但最好重複使用原始來源,而不是稍後從已經降級的副本重新製作。這一點非常重要,因為任何形式的修改都意味著圖片中的一些資訊會遺失,並且提供了一個來源,您可以從中重新處理您的圖片以用於其他用途。原始圖片不必是您的工作圖片,工作圖片可能會調整大小或調整顏色以供顯示,只需確保將您的圖片儲存在安全的地方以備將來使用。接下來要做的是,甚至在建立任何縮圖之前,就要決定如何儲存相對於正常大小圖片格式的縮圖,然後堅持使用該方案。這對於網頁來說尤其重要。方案包括...
  • 以您想要或需要的尺寸將主要照片圖片儲存為失真 JPEG 格式,然後對產生的縮圖使用相同的名稱,但使用 GIF 圖片格式。例如,相同檔名但不同的格式和副檔名。主圖片:photo_name.jpg 縮圖:photo_name.gif
  • 將縮圖以相同的名稱儲存在一個子目錄中,例如「thumbs」或任何你方便的名稱。主圖像:photo_name.jpg 縮圖:thumbs/photo_name.jpg
  • 使用與原始圖像相同的格式,但在文件名中添加一個額外的字符串。典型的字符串添加包括「_tn」、「_small」、「_thumb」等...。主圖像:photo_name.jpg 縮圖:photo_name_tn.jpg
  • 以上方法的組合。沒有理由不能以不同的圖像格式保存縮圖,並在文件名中附加一個額外的圖像後綴,並保存在一個子目錄中!主圖像:images/photo_name.jpg 縮圖:thumbs/photo_name.jpg.gif 這在 WWW 上實際上相當常見,我甚至見過將兩個目錄存儲在完全不同的機器上!
第一種方案可以使用「magick mogrify」生成所有縮圖,而不會破壞原始圖像,方法是使用「-format」設置來指定輸出圖像格式。從 IM v3.2.0 開始,第二種方案現在也可以使用「magick mogrify」來完成,這要歸功於添加了一個特殊的「-path」設置,該設置指定了用於保存修改後圖像的不同目錄。例如,這會將 JPG 圖像轉換為剛剛創建的「thumbs」子目錄中的 GIF 縮圖。

  mkdir thumbs
  magick mogrify  -format gif -path thumbs -thumbnail 100x100 *.jpg
其他方法將要求您在運行「magick mogrify」之前先複製原始圖像,創建一個特殊的腳本來處理圖像,或者使用其他一些 DIY 方法。一些更簡單的非 IM 技術在批次處理 - 不使用「magick mogrify的示例部分的末尾有詳細說明。無論您選擇哪種方法,重要的是選擇一種縮圖存儲方案,然後堅持下去。通過對所有縮圖使用相同的方案,您可以編寫 shell 或 Perl 腳本來輕鬆生成縮圖,甚至生成 HTML 連結。稍後將詳細介紹。

縮圖格式的選擇

保存縮圖的格式會對其在磁盤上的最終大小和網頁的下載速度產生很大的影響。在這方面,我建議您研究各種常見文件格式的摘要。特別是您應該注意...
JPEG 壓縮率高且是有損的,但它是為大型真實世界圖像設計的,而不是為小型縮圖設計的。它也不允許任何形式的透明度。總之,這種格式適合於大型圖像,不適合於縮圖。請注意配置文件(請參閱下一節)。雖然不建議將 JPG 用於縮圖,但在 WWW 上查看圖像時,建議您使用較小的 800x600 像素圖像,並使用低得多的「-quality」百分比(例如 50 甚至 30%),儘管它看起來不會很好。還有人建議使用「-sampling-factor 2x1」也會產生較小的 JPEG 圖像大小。我不建議將完整的原始圖像直接放在網路上,除非是暫時地(在一個引用的位置)讓朋友下載。請記住不要鏈接到它(即使是通過目錄索引),而且不要超過一天,否則它可能會被 Google 搜索到。
GIF 適用於簡單的小圖像,並且壓縮效果不錯。它的顏色限制為 256 色,但對於小圖像來說,這幾乎不明顯。它也可以製作圖像的卡通動畫,除非您真的想要花俏,否則縮圖並不需要。問題是該格式只有布林值(開啟/關閉)透明度,這使得形狀圖像的邊緣看起來很糟糕。解決方案是將縮圖設計為僅使用布林值透明度,或將其排列為只能在特定背景顏色上使用。有關詳細信息,請參閱 背景顏色或圖案上的 GIF 上的範例。
PNG 是現代理想的縮圖格式。它具有良好的壓縮率和內部格式樣式。它不會造成損失,可以顯示所有顏色,而且現在幾乎所有瀏覽器都支援這種格式(不過對於 Microsoft Internet Explorer v7 之前的版本,需要在網頁中添加一些 Java 腳本)。更重要的是,這種格式支援半透明顏色,可以使陰影和邊緣清晰銳利,或者根據您的需要變得模糊。但是,此格式不支援動畫,不過相關的 MNG 格式可以。然而,似乎很少有瀏覽器支援該格式。對於縮圖,您可以通過減少深度和顏色數量以及為最終縮圖圖像設置更高的「bzip」壓縮品質(「-quality」中的第一個數字)來減小最終圖像的大小。例如,建議對不涉及透明度的小型 PNG 縮圖使用以下內容。

        -strip  -quality 95  PNG8:thumbnail.png
    
它使用較小的 8 位元或 256 色限制的 PNG 格式。您也可以通過輔助應用程序重新處理最終圖像(請參閱 非 IM PNG 處理),這些應用程序可以自動找到特定圖像的最佳 PNG 壓縮。還有一些程序可以在保留半透明顏色的同時將顏色減少到較小的內部 PNG 格式。這是 IM 目前無法處理的事情。
關於格式的最後說明... 無論您對縮圖使用何種格式,如果必須保存未完成的中間圖像,請使用 PNG(不進行任何顏色減少)或 MIFF 圖像格式。這樣做可以在中間階段保留盡可能多的圖像顏色信息。僅在絕對最後一步才進行顏色減少或保存為 GIF 或 JPEG 格式。這一點很重要,所以我重複一遍...
不要將 JPEG、PNG8 或 GIF 用於中間工作圖像!
最好使用 PNG 或 MIFF。

配置文件、清除和 JPEG 處理

許多來自數碼相機、掃描軟件和一些繪圖程序(Photoshop 尤其如此)的圖像會以配置文件的形式保存有關圖像的額外信息。這包括 JPEG、PNG、TIFF 等圖像格式,以及從 IM v6.2.4-1 開始的 GIF 格式。當然,IM 特定的格式 MIFF 也可以做到這一點。(有關更多詳細信息,請參閱 圖像配置文件)。這些配置文件的大小可能高達 60 Kb,因此會對文件大小產生很大影響,默認情況下,IM 會保留這些配置文件信息。縮圖不需要這些數據,甚至主圖像通常也不需要。您也可以使用 IM 命令從圖像中刪除配置文件...

  magick input.jpg  -strip output.jpg

  magick mogrify -strip  *.jpg
您也可以使用 "-profile '*'" 選項來移除描述檔。然而,建議您僅在修改影像時才移除描述檔,特別是在縮小影像尺寸以供網頁顯示或縮圖時。在調整大小時移除描述檔,特別是在產生較小的縮圖時非常常見,因此 "-resize" 和 "-strip" 已合併成一個新的操作,專門用於此目的。當然,這個調整大小的操作稱為 "-thumbnail"。例如...

  magick -define jpeg:size=240x180 image.jpg -thumbnail 120x90 thumbs/image.gif

  magick mogrify -path thumbs -format gif -define jpeg:size=240x180 -thumbnail 120x90 '*.jpg'
在 IM v6.5.4-7 之前,"-thumbnail" 會移除影像中的所有描述檔,包括 ICC 色彩描述檔。從此版本開始,將保留色彩描述檔。如果不需要色彩描述檔,請使用 "-strip" 移除所有描述檔。
"magick mogrify" 當然可以為整個目錄的 JPEG 影像產生縮圖,但請注意不要覆蓋您要保留的任何縮圖。有關使用其他非 IM 方法循環處理大量影像的資訊,請參閱 批次處理 - 不使用 Mogrify 的範例章節。對於非常大的影像,"-thumbnail" 調整大小運算子會先將影像縮小至最終縮圖大小的 5 倍,然後再執行實際的調整大小操作。這進一步加快了縮圖的產生速度。然而,對於 JPEG 影像的縮圖,可以使用一種更好的方法來限制初始影像大小,即一開始就不要將整個影像讀入記憶體。"-define jpeg:size=" 設定(如上例所示)是 JPEG 影像庫的一個特殊提示,用於減少從非常大的 JPEG 影像中讀取的資料量。請參閱 讀取 JPEG 檔案
在 IM v6.5.6-0 之前,此編碼器設定是從 "-size" 設定中提取的。這會導致使用者在使用 "-size" 建立影像時出現問題,但隨後 JPEG 讀取會產生意外結果。因此,已將其更改為特殊的編碼器設定。

在舊版的 IM 中,由於這種「雙重」角色,您可能需要在讀取 JPEG 影像之前使用 "+size" 重設設定。
從 IM 6.2.6-2 版本開始,新增了一個 讀取影像修飾符,允許您在讀取輸入影像後立即調整其大小。此選項適用於任何影像格式,而不僅僅是 JPEG 影像。然而,它不能取代 JPEG 影像的 "-define jpeg:size=" 設定。因此,調整任何輸入影像格式大小的建議方法現在是...

  magick -define jpeg:size=240x180 input.img'[120x90]' \
          -strip  output_thumbnail.gif
接下來是實際的 IM 縮圖範例...

一般縮圖建立

產生一般縮圖(特定高度)

讓我們將一張 大型範例 JPEG 影像 轉換為高度 90 像素的 GIF 縮圖,並自動調整寬度(在 250 像素的寬度限制內)以保持影像的長寬比。

  magick -define jpeg:size=500x180  hatching_orig.jpg  -auto-orient \
          -thumbnail 250x90   -unsharp 0x.5  thumbnail.gif
[IM Output]
請注意,我在上面使用了「-thumbnail」選項。這不僅可以調整影像大小,還會去除原始 JPEG 影像中可能存在的任何設定檔和註釋資訊。此外,由於它在最初縮小影像時使用了「-sample」調整大小運算子,因此速度更快,同時為小型縮圖產生合理的結果。我還為讀取的影像設定了最小「-define jpeg:size=」。這會傳遞給 JPEG 程式庫,該程式庫會傳回介於此大小和此大小兩倍之間的影像(如果可能),而不是整個非常大的原始影像。基本上,在不需要的情況下,不要使用巨大的影像佔用電腦記憶體。我使用的 JPEG 大小提示至少是最終縮圖的兩倍,這樣調整大小仍然會產生合理的結果。「-auto-orient」運算子可確保影像(如果來自數位相機)根據相機的方向正確旋轉。我正在使用的「桌面」影像不需要這樣做,但我將其包含在上面供數位相機使用者使用。但是請注意,方向仍然可能會出錯,尤其是在直接向下或向上拍攝照片時,例如在拍攝文件照片時。結果是一個特定高度但可變寬度的縮圖。我在我自己的網頁上使用這個縮圖,這樣一排影像的高度就會一致,形成整齊的外觀。上面 250 像素的寬度限制很重要。如果未設定(例如:使用「-thumbnail x90」),則 IM 在產生非常長且細的影像的縮圖時可能會出現問題,例如網頁線條影像中顯示的影像。在這種情況下,結果將是影像的非常非常長的「放大」,而不是一個小的縮圖。有些人(包括我自己)發現,雖然 IM 的調整大小是最好的實現之一(請參閱IM 調整大小與其他程式),但結果仍然有點模糊。因此,您可以通過在「-thumbnail」調整大小操作後稍微銳化影像(使用「-unsharp」)來改善上述結果。如需更多資訊,請參閱銳化調整大小後的影像 -- Photoshop 調整大小技術,但實際上這完全取決於個人喜好。
magick mogrify」版本與「magick」命令相同(沒有初始輸入影像),但會自動為當前目錄中的「每個」JPEG 影像產生縮圖。影像參數用引號括起來,以便 IM 本身會掃描目錄,而不是命令列 shell。這可以防止在包含大量影像的目錄上出現「行限制溢位錯誤」。

  magick mogrify  -format gif -define jpeg:size=500x180 -auto-orient \
                -thumbnail 250x90 -unsharp 0x.5  '*.jpg'
請注意,「magick mogrify」會盲目地建立縮圖,替換任何同名的現有影像。在這種情況下為 GIF 影像。使用此命令時,請務必格外小心。

建議在進行任何處理之前始終備份。
您可以使用「-path」設定來定義單獨的縮圖目錄,而不是指定不同的格式(使用「-format」)以防止「magick mogrify」覆寫原始來源影像。您可以同時使用這兩種輸出選項。
雖然「magick mogrify」可以用不同的後綴(「-format」)或目錄(「-path」)輸出新圖像,但這些是您使用此命令的唯一選項。如果您還想更改圖像的名稱,例如添加「_tn」或「_sm」來表示圖像的縮略圖或小版本,那麼我建議您創建一個 shell 腳本來為您完成這項工作,使用「magick」一次處理一個。  我寫了這樣一個腳本來做到這一點,同時也生成了 HTML 索引。

調整縮圖大小以適應

另一種自動生成縮略圖的形式是將圖像縮小以適應固定大小的框,比如說「100x100」,但保持圖像的縱橫比。這也是調整大小幾何設置的默認含義。
但是,我不想放大已經適合這樣一個盒子的圖像。為此,您需要在幾何字符串中添加一個「>」。

  magick -define jpeg:size=200x200 hatching_orig.jpg \
          -thumbnail '100x100>' rectangle.gif
[IM Output]
和以前一樣,圖像的縱橫比會被保留,因此縮略圖不太可能正好是 100 像素的正方形。但是,圖像的至少一個維度將是 100 像素。

填充縮略圖

下一個最常見的要求是生成縮略圖,用特定顏色的邊框填充圖像(通常是「黑色」或「透明」,但在這些示例中,我將使用「天藍色」),以便縮略圖的大小正好是您想要的。例如:一張 400x300 像素的圖像縮小以適應 100x100 像素的盒子,通常(使用上面的方法)將具有 100x75 像素的大小。我們想在圖像的頂部和底部(以及側面以確保)添加一些填充邊框,以使最終的縮略圖圖像始終為 100x100 像素大小。
有很多方法可以做到這一點,從 IM v6.3.2 開始,最好的方法是使用Extent 運算符

  magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail '100x100>' \
          -background skyblue -gravity center -extent 100x100 pad_extent.gif
[IM Output]
從 IM 版本 6.2.5 開始,您還可以使用視口裁剪,並將結果展平到背景顏色上。

  magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail '100x100>' \
          -gravity center  -crop 120x120+0+0\! \
          -background skyblue  -flatten    pad_view.gif
[IM Output]
使用Extent視口裁剪之間的關鍵區別在於您是要一個最小的虛擬畫布還是要將整個區域「填充」。另一種填充圖像的方法是將縮略圖覆蓋到具有正確大小的背景圖像(實際圖像、純色或平鋪畫布)上,在本例中為 128x128 的「granite:」內置圖像。

  magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail '100x100>' \
          granite: +swap -gravity center -composite pad_compose.gif
[IM Output]
這種方法可能是使用舊版本的 IM(例如 IM v5)的最佳方法,儘管「-composite」操作需要由單獨的「composite」命令來完成,而不是上面的單一命令方法。但是,從圖像處理的角度來看,以上所有方法實際上都在做同樣的事情。

裁剪縮圖以適應

另一種方法是,不是填充圖像以適應我們想要的特定縮略圖大小,而是切掉不適合最終大小的圖像部分。當然,這意味著您實際上會丟失原始圖像的某些部分,尤其是圖像的邊緣,但結果是圖像中心部分的放大縮略圖。這通常(但並非總是)是圖像的主要主題,因此這是一種實用的縮略圖創建方法。從 IM v6.3.8-3 開始,添加了特殊的調整大小選項標誌「^」以使這更容易。我們只需使用此標誌調整大小,然後切掉溢出所需大小的圖像部分。

  magick -define jpeg:size=200x200 hatching_orig.jpg  -thumbnail 100x100^ \
          -gravity center -extent 100x100  cut_to_fit.gif
[IM Output]
如您所見,圖像的縮略圖更大、更詳細,但代價是切掉了原始圖像的側面。有關此選項的更多信息,請參閱調整大小以填充給定區域
在 IM v6.3.8-3 加入這個特殊旗標之前,您需要一些非常複雜的技巧才能達成相同的結果。詳情請參閱調整大小以填滿指定空間

區域適應縮圖大小

最後兩種方法通常會使圖像非常小,並帶有很多額外的填充,或者會裁切掉圖像的大部分,以便完全填滿空間。但是,通過使用不同的調整大小旗標,可以獲得介於這兩種極端之間的縮略圖。例如,一個 100x100 像素的縮略圖有 10,000 個像素。現在,如果我們要求 resize 將圖像調整到接近該像素大小(使用調整大小 '@' 旗標),您將獲得一張需要一點填充和一點裁剪的圖像。這最大限度地提高了生成的縮略圖的大小,同時又不會裁剪掉太多內容。例如...

  magick -define jpeg:size=200x200 hatching_orig.jpg  -thumbnail 10000@ \
          -gravity center -background skyblue -extent 100x100  area_fit.gif
[IM Output]
如您所見,縮略圖有一些填充,圖像有一些裁剪,但結果可能是圖像與給定縮略圖空間的最佳匹配。

適應給定空間摘要

總之,以下是三種將圖像縮略圖化為特定大小區域的方法的結果。所有三種方法都使用完全相同的代碼,只是使用的調整大小參數/旗標略有不同。
[IM Output]
填充擬合
調整大小,無旗標
[IM Output]
區域擬合
調整大小,'@' 旗標
[IM Output]
裁剪擬合
調整大小,'^' 旗標

方形填充和裁剪

上述填充和裁剪方法假設您知道要擬合圖像的區域的最終大小。但情況並非總是如此。有時您只想簡單地“將圖像方形化”,方法是將其“填充”(外部方形)或“修剪”邊緣(內部方形)。從 IM 論壇上的方形圖像,開發了許多方法。
可以使用馬賽克通過旋轉圖像的副本來創建更大的背景畫布來完成外部方形化。

  magick thumbnail.gif \
          \( +clone -rotate 90 +clone -mosaic +level-colors white \) \
          +swap -gravity center -composite    square_padded.gif
[IM Output]
另一方面,內部方形化則比較困難,需要做更多的工作才能實現。此方法使用一些繁重的遮罩處理來生成更小的畫布。

  magick thumbnail.gif \
          \( +clone +level-colors white \
             \( +clone -rotate 90 +level-colors black \) \
             -composite -bordercolor white -border 1 -trim +repage \) \
          +swap -compose Src -gravity center -composite \
          square_cropped.gif
[IM Output]
另一種方法是使用不執行任何操作的扭曲,使用扭曲視口裁剪/填充圖像(請參閱扭曲視口居中方形裁剪)。從本質上講,它使用“百分比轉義符”來執行範圍類型的操作所需的計算。外部(填充)方形...

  magick thumbnail.gif  -virtual-pixel white -set option:distort:viewport \
     "%[fx:max(w,h)]x%[fx:max(w,h)]-%[fx:max((h-w)/2,0)]-%[fx:max((w-h)/2,0)]" \
     -filter point -distort SRT 0  +repage  square_external.gif
[IM Output]
使用虛擬像素設置來指定填充顏色。內部(裁剪)方形...

  magick thumbnail.gif   -set option:distort:viewport \
     "%[fx:min(w,h)]x%[fx:min(w,h)]+%[fx:max((w-h)/2,0)]+%[fx:max((h-w)/2,0)]" \
     -filter point -distort SRT 0  +repage  square_internal.gif
[IM Output]
感謝Fred Weinhaus 的 Tidbits 頁面。這是一個更簡單的版本,但會丟失圖像可能具有的任何元數據(如註釋字符串或配置文件)。

  magick thumbnail.gif -set option:size '%[fx:min(w,h)]x%[fx:min(w,h)]' \
          xc:none +swap -gravity center -composite square_internal_2.gif
[IM Output]
IMv7 將允許您直接在裁剪或範圍參數中執行上述數學運算,這將防止圖像元數據丟失。

手動裁剪

我為我的網頁生成縮略圖圖像的通常方式是自動和手動腳本的混合。我的圖像的最終設置是..
  • 我將 PNG 或 TIFF 用於照片的原始“非常大”掃描件。或者從數碼相機下載的原始 JPEG 圖像。基本上用於未修改的原始源圖像,用於存檔。我現在也喜歡在此圖像文件名中包含字符串“_orig”。
  • 當點擊或選擇縮略圖時,用於網頁可查看圖像的較小 JPEG 圖像格式。此圖像的大小調整為適合 800x800 像素的框,此大小適合大多數網絡用戶查看。我通常在文件名中添加“_md”表示中等大小的圖像。
  • 最後是一個 GIF 縮略圖,調整為固定高度 90 像素和可變寬度。這使得網頁上的縮略圖中心行看起來整齊有序,但無論使用什麼尺寸的瀏覽器,都可以自動填充瀏覽器窗口的寬度。我現在通常在圖像文件名中包含“_tn”,表示它是縮略圖。
我首先使用「magick mogrify」從原始掃描圖像生成網頁可檢視的 JPEG 圖像(中等大小)。這可以減少圖像的下載時間和檢視大小,使其對於一般網路使用者(可能透過數據機登入)來說更為實用。然後,我使用「magick mogrify」從這些圖像生成一組初始縮圖。然而,我經常發現,在典型的照片中,縮圖的主體在檢視時會變得太小,無法形成有效的縮圖。為了修正這個問題,我會檢查自動生成的縮圖,並在大約一半的情況下手動建立我自己的「主體放大」縮圖。我會讀取 JPEG 圖像,並將其裁剪到圖像的主要主體,有效地「放大」照片的主體,並移除圖像的大部分背景。然後,使用「magick -thumbnail」或更常見的我用於檢視和裁剪圖像的圖形程式(通常是「XV」,見下文)對其進行平滑處理和縮圖。因此,與照片中的人幾乎看不見的縮圖(左)不同,我在縮圖之前,手動裁剪了主體周圍,突出了照片的重點(右)。這使用戶可以更清楚地看到圖像內容,從而更好地決定是否要下載和檢視更大的 JPEG 版本圖像。
昆士蘭風箏愛好者,Ron 和 Val Field
[IM Output]
自動
生成
縮圖
[IM Output]
手動裁剪
並調整大小
縮圖
(點擊任一圖像以查看原始掃描照片)
當然,這需要更多的手動操作,但每個圖像只需執行一次,而且僅限於具有大量空間的圖像,如上例所示。此外,我只對我要放到網路上的圖像執行此操作。當然,由於「magick mogrify」會覆蓋任何現有的、可能是手動生成的縮圖,因此在執行任何手動縮圖生成後,您將無法再次使用它。「magick mogrify」命令很有用,但也很危險,因為它會覆蓋大量圖像。在對所有圖像全局運行「magick mogrify」之前,請務必三思。

HTML 縮圖頁面

在目錄中整理好所有縮圖圖像後,我會使用一個名為「thumblinks」的特殊 Perl 腳本,我編寫這個腳本是為了查找圖像(JPEG 照片和 GIF 縮圖),並生成 HTML 連結,甚至是完整的 HTML 照片頁面。該腳本將讀取 GIF 縮圖的大小並將其包含在 HTML 中,並在縮圖連結周圍附加預先準備好的頁首和頁尾文件。如果腳本在頁首或頁尾文件中找到現有的連結,它也會從生成的列表中移除任何縮圖連結。這聽起來可能很複雜,但它使我的 HTML 頁面生成變得非常快速和靈活,並確保目錄中所有縮圖圖像都已添加到該目錄的索引頁面中,同時仍然允許我在索引頁首中對特定圖像進行評論。它還使頁面獨立於使用者的窗口大小,自動調整以適應。有關我的「thumblinks」腳本輸出的簡單範例,請參閱古墓藝術品。有關生成此類連結的快速範例和起點,請查看使用identify 命令的範例。

FavIcon 網頁連結縮圖

favion.ico」圖標是網路瀏覽器經常在網站的頂級網頁上查找的圖標,用於整個網站。該圖像是一種特殊的多解析度圖像格式,可以按如下方式創建。

  magick image.png -alpha off -resize 256x256 \
          -define icon:auto-resize="256,128,96,64,48,32,16" \
          favicon.ico
image.png」 可以是任何你想要顯示的圖片,但應該是正方形的。如果它不是正方形,則應該先將其轉換為正方形。你也可以加入更大的解析度,例如 128 或 256 像素,但很少瀏覽器會使用它們。16 和 32 像素大小在 ICO 檔案中更常使用,因此特別強調這些大小可能會有幫助。同時請記住,許多瀏覽器會減少圖片的顏色數量,以減少儲存在使用者書籤檔案中的空間。這帶我們到另一個重點。由於通常只使用最小的圖片,並且會進一步減少顏色,因此建議將圖片保持盡可能小和清晰。以下是以手動方式調整 ICO 檔案格式的圖片大小的範例。

  magick image.png  -background white \
          \( -clone 0 -resize 16x16 -extent 16x16 \) \
          \( -clone 0 -resize 32x32 -extent 32x32 \) \
          \( -clone 0 -resize 48x48 -extent 48x48 \) \
          \( -clone 0 -resize 64x64 -extent 64x64 \) \
          -delete 0 -alpha off -colors 256 favicon.ico

如前所述,通常只會使用在網站頂層目錄中找到的「favion.ico」圖片,但是你也可以透過將以下 HTML 標籤新增到頁面的標題中,來指定連結縮圖圖片的位置…

  <LINK REL="icon" HREF="/path/to/favicon.ico" type="image/x-icon">
  <LINK REL="shortcut" HREF="/path/to/favicon.ico" type="image/x-icon">
/path/to/favicon.ico」可以是瀏覽器應該從中擷取網頁縮圖圖片位置的絕對或部分 URL/URI。「REL="shortcut"」的使用特定於 Internet Explorer(IE9 之前),並且不是 HTML 規範的官方部分。可以將兩個 HTML 標籤合併在一起,使用「REL="shortcut icon"」,但是透過將標籤分開,你可以將非 ICO 圖片檔案格式(例如 SVG)用於非 IE 瀏覽器,例如 Firefox。請記住,如果沒有使用此 html 元素,則會改用在網站頂層目錄中找到的「favicon.ico」檔案(如果有的話)。所有現代瀏覽器都普遍理解 ICO 圖片格式。除了 Internet Explorer 之外,所有瀏覽器也可以使用 JPEG、PNG 和 GIF 圖片檔案格式作為連結縮圖。少數瀏覽器,如 FireFox,甚至可以使用動畫 GIF 或 SVG 圖片檔案格式。但是,由於這些後來的格式通常無法容納具有不同解析度和顏色數量的多個圖片,因此對於「favion.ico」圖片,最好還是堅持使用 ICO 檔案格式。

其他非 IM 技術

我用於手動圖片處理的「XV」程式也會產生縮圖圖片,放置在名為「.xvpics」的子目錄中。此目錄中圖片的格式是程式本身特殊的縮圖格式(忽略該目錄中的檔案名稱後綴)。這些縮圖限制為 80x60 像素,因此尺寸有點「小」(除非你修改「xv」以使用更大的縮圖 - 請參閱下面的連結)。IM 可以理解「xv」縮圖格式(它基於「NetPBM」圖片格式),因此你可以使用 XV 快速產生所有縮圖,然後將 JPEG 圖片的 XV 縮圖轉換為 GIF 圖片,以進行進一步處理…
   xv -vsmap &               # generate thumbs with the "Update" button
   rm .xvpics/*.gif          # delete XV thumbs of existing "gif" thumbnails
   magick mogrify -format gif .xvpics/*.jpg
   mv .xvpics/*.gif .        # move the new "gif" thumbnails to original dir
如果你厭倦了 XV 縮圖的小尺寸,特別是在現代的大型顯示器上,你可以修改 XV 程式碼。請參閱我的 XV 修改說明,它可以讓你讓 XV 使用更大的縮圖尺寸。我自己使用 120x90 像素的縮圖。

進一步處理 - 新增裝飾

以上只是讓你的縮圖更有趣的開始。除了基本的縮圖圖片之外,你還可以新增邊框、旋轉,甚至可以隨機選擇樣式,讓你的縮圖畫廊更加有趣。像這樣對縮圖的添加,我稱之為「裝飾」,就像你在洗完衣服後在衣服上發現的額外棉絮一樣。也就是說,它為縮圖增添了不必要的額外元素,但可以讓網頁和索引圖片更加有趣。請注意,以下許多方法和處理都非常複雜,我可能需要更深入地了解 ImageMagick 的各種圖片處理選項。

新增圖片標籤

在建立縮圖時,您也可以在縮圖上方、下方或甚至頂部添加標籤。 然而,這種類型的圖像處理會在使用標籤標註圖像中有更詳盡的說明。 請記住,在這些範例中,請使用“-thumbnail”或“-strip”,而不是“-resize”。例如...

  magick thumbnail.gif \
          -background Lavender -fill navy -font Candice -pointsize 24 \
          label:Hatching   -gravity South -append \
          labeled.gif
[IM Output]
通過使用複合字體,您可以在圖像本身上覆蓋一些非常精美的標籤。 例如,在這裡,我使用較密集的軟輪廓字體技術來標註縮圖,使文字周圍的區域變暗,以確保它始終清晰可讀。

  magick -define jpeg:size=400x400  hatching_orig.jpg  -resize '120x200>' \
      \( +clone -sample 1x1\! -alpha transparent -sample 1000x200\! \
         -font SheerBeauty -pointsize 72 -gravity Center \
         -strokewidth 8 -stroke black  -fill black  -annotate 0,0 '%c' \
         -channel RGBA -blur 0x8 \
         -strokewidth 1 -stroke white  -fill white  -annotate 0,0 '%c' \
         -fuzz 1% -trim +repage -resize 115x \
      \) -gravity North -composite           -strip annotated.gif
[IM Output]
請注意,我沒有使用預先生成的“thumbnail.gif”圖像,也沒有使用縮圖調整大小運算符從圖像中刪除配置文件和註釋。 然後,我使用“+clone”、“+sample”和“-alpha”來生成一個更大的透明工作畫布,其中還包含原始圖像中繼數據的副本。 這讓我可以使用圖像的“註釋”字符串和標註“-annotate”運算符來提供要覆蓋在圖像上的文字。 只有在我完成了文字疊加後,我才會清理並使用“-strip”刪除這些信息。

凸起按鈕

-raise”運算符的創建基本上是為了突出顯示矩形圖像的邊緣以形成凸起的按鈕。 它是一種簡單、快速且有效的縮圖轉換。

  magick thumbnail.gif  -raise 8   raised_button.gif
[IM Output]
相同的運算符還有一種“加號”形式,可用於產生凹陷的突出顯示效果。

  magick thumbnail.gif  +raise 8   sunken_button.gif
[IM Output]

氣泡按鈕

通過一些技巧,“-raise”運算符可用於產生平滑的“氣泡狀”凸起按鈕。

  magick thumbnail.gif -fill gray50 -colorize 100% \
          -raise 8 -normalize -blur 0x8  bubble_overlay.png
  magick thumbnail.gif bubble_overlay.png \
          -compose hardlight -composite  bubble_button.png
[IM Output] ==> [IM Output] ==> [IM Output]
有關此類技術的更多信息,請參閱光合成方法。 如需更多此類效果,請參閱下面的自框架(內部),並進一步了解下面的光照效果蒙版

添加邊框

簡陋而簡單的“-border”運算符可用於在圖像周圍生成一些複雜的框架。

  magick thumbnail.gif \
          -bordercolor black -border 3   -bordercolor white -border 2 \
          \( -background black -fill white -pointsize 24 \
             label:Hatching   -trim +repage \
             -bordercolor black -border 10 \
          \) -gravity South -append \
          -bordercolor black -border 10   -gravity South -chop 0x10 \
          border_framework.gif
[IM Output]

簡單相框

類似地,“-frame”運算符可以輕鬆地在圖像周圍添加框架

  magick thumbnail.gif   -mattecolor peru  -frame 9x9+3+3  framed.gif
[IM Output]
此運算符還有更多選項可以創建十幾種不同樣式的框架。 您可以在框架中查看可能性的示例,添加類似 3D 的邊框

蒙太奇相框

montage 命令提供了一種更簡單的方法來完成上述所有操作,甚至更多。 它不僅可以生成縮圖(或整個縮圖頁面),還可以標記縮圖以包含文件名、磁盤大小和尺寸等信息,或用戶指定的字符串。
以下是使用“magick montage”生成帶框縮圖的簡單示例。

  magick montage -define jpeg:size=240x200  -label '%c'  hatching_orig.jpg \
          -frame 6  -geometry '120x100>'  montage_simple.gif
標籤來自 JPEG 圖像文件註釋,該註釋是使用 Non-IM 命令“wrjpgcom”很久以前添加到圖像中的。 有關更多詳細信息,請參閱非 IM JPEG 處理
[IM Output]
即使只使用“magick montage”,您也可以在生成縮圖時獲得非常棒的效果。

  magick montage -define jpeg:size=400x180  -label '%c' hatching_orig.jpg \
          -thumbnail '200x90>' -geometry '130x100>'  -mattecolor peru \
          -frame 6  -bordercolor skyblue  -font LokiCola  -pointsize 18 \
          montage_fancy.gif
[IM Output]
更多細節請見「蒙太奇,圖像陣列」。您可能會特別感興趣的是蒙太奇 HTML 縮略圖圖像地圖範例。這會建立一個縮略圖的 HTML 索引頁面,點擊縮略圖將會在同一個目錄中顯示原始圖像。

柔和模糊邊緣

暈影運算子提供了一個簡單的方法來為圖像添加模糊邊緣。

  magick thumbnail.gif -alpha set \
          -background none  -vignette 0x4  vignette.png
[IM Output]
當然,由於此縮略圖使用半透明顏色,因此需要以 PNG 格式保存。形態學距離方法提供了圖像邊緣真正的透明「羽化」效果。

  magick thumbnail.gif -alpha set -virtual-pixel transparent -channel A \
          -morphology Distance Euclidean:1,10\! +channel feathered.png
[IM Output]
透明區域的最大距離由特殊的10\!「距離縮放」標記控制。這僅在 IM v6.6.1-6 中添加。這也具有適用於形狀圖像的額外優勢,儘管需要更複雜的初始化才能在距離公式中正確保留和抗鋸齒像素。有關更多詳細資訊,請參閱使用距離羽化形狀。此處的羽化是純線性漸變,可以使用S 形非線性對比度運算子進一步調整,使其以多種不同方式呈現更平滑、更漸變的外觀。您也可以使用使用模糊羽化圖像,方法是在僅模糊 Alpha 色版之前添加透明的虛擬像素。這會為圖像產生更柔和的羽化效果,並顯著圓潤圖像的角落。

  magick thumbnail.gif -alpha set -virtual-pixel transparent \
          -channel A -blur 0x8  -level 50%,100% +channel  soft_edge.png
[IM Output]
額外的「-level」操作(僅調整透明度色版)確保邊緣變得完全透明,而不僅僅是半透明。然而,由於模糊產生的類 S 形曲線,它在實際邊緣確實會急劇下降至零。它在角落中也具有累加效應,導致它們變圓,而對於具有尖銳凹面的形狀圖像,它會導致完全透明的像素變得半透明。因此,對於形狀,您可能需要針對原始圖像遮罩結果(使用Dst-In 合成)。然而,對於矩形縮略圖,結果令人滿意。您可以在分層縮略圖中看到使用這種羽化類型的另一個範例。如果不在模糊的羽化上進行色階調整,則可以在「50%」處閾值化模糊的 Alpha 色版,以便為上述縮略圖圖像添加偽圓角。

  magick thumbnail.gif -alpha set -virtual-pixel transparent -channel A \
          -blur 0x8  -threshold 50% +channel rounded_corner_blur.gif
[IM Output]
雖然非常簡單,但結果並不是一個很好的方法來圓潤圖像的角落。首先,角落實際上不是圓形的,而是一條「雙曲線」曲線。其次,結果不是平滑的抗鋸齒曲線,而是顯示由閾值操作的鋸齒效應引起的「鋸齒」。但是,可以將此圖像保存為 GIF 文件格式。有關詳細資訊,請參閱GIF 布林透明度。另請注意,當您使用較大的參數來產生較大的圓角時,「-blur」操作可能會變得非常慢。因此,完全不建議使用這種方法來大規模圓潤角落。如需更不尋常的模糊邊緣效果,您可以在 Alpha 色版上使用徑向模糊

  magick thumbnail.gif -alpha set -virtual-pixel transparent \
          -channel A -radial-blur 0x45 +channel  radial_blur_edge.png
[IM Output]
這對於完美的正方形圖像效果更好。隨著角度模糊量的增加,您最終將產生類似暈影的圓形邊緣。

  magick thumbnail.gif -alpha set -virtual-pixel transparent \
          -channel A -radial-blur 0x100 +channel  radial_blur_vignette.png
[IM Output]
可以看到的兩個階梯狀偽影是由兩個圖像尺寸維度引起的。正方形圖像不會出現「階梯」。為最後一個範例添加一點額外的正常模糊也可以改善階梯問題。

圓角和形狀邊角

雖然對柔化模糊邊緣(見上文)進行臨界值處理會產生適合 GIF 布林透明度的圓角,但它不會產生平滑的「抗鋸齒」圓角。產生具有圓角或任何其他形狀的圖像的正確方法,是使用所需形狀的遮罩實際切掉每個角落。以下是由 Leif Åstrand <leif@sitelogic.fi> 提供的方法,透過將完整圖像遮罩相乘來產生適當的結果。

  magick thumbnail.gif \
     \( +clone  -alpha extract \
        -draw 'fill black polygon 0,0 0,15 15,0 fill white circle 15,15 15,0' \
        \( +clone -flip \) -compose Multiply -composite \
        \( +clone -flop \) -compose Multiply -composite \
     \) -alpha off -compose CopyOpacity -composite  rounded_corners.png
[IM Output]
基本上是從原始圖像中提取白色透明遮罩,只有一個黑色的圓角。然後將其翻轉和翻轉,以產生四個角都為圓形的遮罩。最後將該遮罩應用於原始圖像。對於更大的圖像,最好將更小的遮罩應用於每個單獨的角落,以減少所需的總處理量。也就是說,單獨的處理步驟更多,但實際像素的整體處理更少。例如,這裡的操作相同,但從每個角落切掉一個簡單繪製的三角形。這適用於更大的圖像。

  magick thumbnail.gif -alpha set  -compose DstOut \
      \( -size 20x15 xc:none -draw "polygon 0,0  0,14 19,0" \
         -write mpr:triangle  +delete \) \
      \( mpr:triangle             \) -gravity northwest -composite \
      \( mpr:triangle -flip       \) -gravity southwest -composite \
      \( mpr:triangle -flop       \) -gravity northeast -composite \
      \( mpr:triangle -rotate 180 \) -gravity southeast -composite \
      corner_cutoff.png
[IM Output]
如果您不想要透明度,而是想要其他顏色,您仍然可以執行上述操作,然後移除透明度。這對於 JPEG 圖像很重要。然而,在IM 論壇討論中發現了一個更簡單的解決方案(在複雜性和內存使用方面)。這會覆蓋彩色角落(在本例中為「紅色」),而不是使其透明。

  magick thumbnail.gif \
    \( +clone -crop 16x16+0+0  -fill white -colorize 100% \
       -draw 'fill black circle 15,15 15,0' \
       -background Red  -alpha shape \
       \( +clone -flip \) \( +clone -flop \) \( +clone -flip \) \
     \) -flatten  rounded_corners_red.png
[IM Output]
不幸的是,此方法不能用於簡單地將圖像角落「擦除」為透明,因為它與拼合操作的「背景畫布」存在交互作用,未來的分層運算符可能會解決此問題。
由於「-flip」和「-flop」運算符無法正確處理虛擬畫布偏移,因此最後一個範例在 v6.6.6-5 之前的 IM 版本中將會失敗。
使用極座標循環技巧,我們可以為任何大小的縮略圖生成完美的抗鋸齒圓形遮罩。當然,我們只會將扭曲的圖像用作原始圖像的遮罩,以便獲得最佳效果。

  magick thumbnail.gif -alpha set \
    \( +clone -distort DePolar 0 \
       -virtual-pixel HorizontalTile -background None -distort Polar 0 \) \
    -compose Dst_In -composite -trim +repage circle_masked.png
[IM Output]
我們將在下面的帶圓角的邊框中進一步介紹這種圖像處理風格。在那裡,我們不僅要切掉角落,還要覆蓋適當的框架圖像。

撕紙邊緣

Leif Åstrand <leif@sitelogic.fi> 貢獻了以下 IM 代碼來生成看起來像是從纖維紙(如報紙)上撕下來的邊緣...

  magick thumbnail.gif \
          \( +clone -alpha extract -virtual-pixel black \
             -spread 10 -blur 0x3 -threshold 50% -spread 1 -blur 0x.7 \) \
          -alpha off -compose Copy_Opacity -composite torn_paper.png
[IM Output]
一種改進可能是使它看起來像是從報紙角落裡撕下來的。

  magick thumbnail.gif -bordercolor linen -border 8x8 \
          -background Linen  -gravity SouthEast -splice 10x10+0+0 \
          \( +clone -alpha extract -virtual-pixel black \
             -spread 10 -blur 0x3 -threshold 50% -spread 1 -blur 0x.7 \) \
          -alpha off -compose Copy_Opacity -composite \
          -gravity SouthEast -chop 10x10   torn_paper_corner.png
[IM Output]
這可以通過添加「紙張」彩色邊框和彎曲形狀的遮罩來改進,使其看起來像是用手粗略地撕裂圖像。添加「柔和陰影」(見下文)也會將生成的圖像從背景中「抬起」,使其看起來像是一個單獨的部分。一如既往,歡迎提出建議和貢獻。

添加陰影

-shadow」運算符可以輕鬆生成陰影的任何形狀的圖像。例如,這裡我為縮略圖添加了一個半透明的彩色陰影。

  magick thumbnail.gif -alpha set \
          \( +clone -background navy -shadow 60x0+4+4 \) +swap \
          -background none -mosaic   shadow_hard.gif
[IM Output]
但您也可以輕鬆創建柔和的模糊陰影。

  magick -page +4+4 thumbnail.gif -alpha set \
          \( +clone -background navy -shadow 60x4+4+4 \) +swap \
          -background none -mosaic     shadow_soft.png
[IM Output]
請注意,我再次使用 PNG 格式的圖片來輸出縮圖。這是因為陰影圖片將包含許多半透明像素,而 GIF 無法處理。(是的,我在重複說明,但這一點很重要)。如果您確實打算使用 GIF 或 JPG 格式,則需要為網頁或要顯示縮圖的較大畫布使用更合適的「-background」顏色,因為這些格式無法處理半透明顏色。警告:雖然以上方法適用於單個縮圖,但當您想要將多個縮圖相互疊加時,它通常會失敗。原因是陰影不會像普通圖像那樣累積在一起。要了解如何處理多個分層圖像的陰影,請參閱陰影層

添加一些厚度

為圖像或形狀添加厚度看起來有點像添加硬陰影(見上文),但並不完全相同,需要一些額外的工作才能做到正確。這實際上非常棘手,因為我們建立了一個彩色圖像蒙版,然後將其複製多次並分層放置在原始圖像下方(使用「DstOver」合成),並增加偏移量以賦予圖像厚度。

  magick thumbnail.gif -alpha set \
          \( +clone -fill DarkSlateGrey -colorize 100% -repage +0+1 \) \
          \( +clone -repage +1+2 \) \
          \( +clone -repage +1+3 \) \
          \( +clone -repage +2+4 \) \
          \( +clone -repage +2+5 \) \
          \( +clone -repage +3+6 \) \
          -background none -compose DstOver -mosaic  thickness.gif
[IM Output]
您明白了。每一行「\( +clone ... \)」都會在東南方向為圖像添加一個額外的像素。此外,由於不涉及半透明像素(至少對於矩形圖像而言),因此您可以對結果使用 GIF 圖像格式。這種技術的主要問題是,除非您編寫特定的腳本來添加厚度,否則很難將厚度指定為可變參數或以不同的角度指定厚度。此外,厚度角度部分的邊緣沒有經過抗鋸齒處理,因此還有很大的改進空間。

拍立得風格縮圖

您可以讓您的縮圖看起來像一張拍立得照片,為它添加陰影,甚至稍微旋轉一下,使其看起來像是放在桌子上。

  magick thumbnail.gif \
          -bordercolor white  -border 6 \
          -bordercolor grey60 -border 1 \
          -background  none   -rotate 6 \
          -background  black  \( +clone -shadow 60x4+4+4 \) +swap \
          -background  none   -flatten \
          poloroid.png
[IM Output]
IM v6.3.1-6 中添加了一個更複雜的上述版本,作為「-polaroid」轉換運算符。例如...

  magick thumbnail.gif -bordercolor snow -background black +polaroid \
          poloroid_operator.png
[IM Output]
請注意,圖像不僅具有拍立得相框,而且照片還進行了一些「捲曲」處理,並進行了適當的陰影調整,使生成的圖像更有深度。加號 (+) 形式使用隨機角度,而普通的減號 (-) 形式允許您提供旋轉角度。特別感謝 Timothy Hunter 為這種技術提供的想法。
您甚至可以添加「-caption」,設置您自己的陰影顏色,指定您自己的旋轉角度(或完全不旋轉)。

  magick -caption '%c' hatching_orig.jpg -thumbnail '120x120>' \
          -font Ravie -gravity center -bordercolor Lavender \
          -background navy  -polaroid -0     poloroid_caption.png
[IM Output]
有關使用此運算符的更多信息,請參閱複雜的拍立得轉換。不過,對於這些示例,我將繼續使用 DIY 創建方法,因為我需要更精細地控制邊框和陰影效果,以演示正確的照片「堆疊」。我們開始吧...通過製作多個照片副本(或使用其他圖像),並添加拍立得邊框,然後您可以隨機旋轉並將它們堆疊起來,以生成一堆漂亮的照片。

  magick thumbnail.gif \
     -bordercolor white  -border 6 \
     -bordercolor grey60 -border 1 \
     -bordercolor none  -background  none \
     \( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
     \( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
     \( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
     \( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
     -delete 0  -border 100x80  -gravity center \
     -crop 200x160+0+0  +repage  -flatten  -trim +repage \
     -background black \( +clone -shadow 60x4+4+4 \) +swap \
     -background none  -flatten \
     poloroid_stack.png
[IM Output]
上面示例中嵌入的命令「 `magick ...` 」會生成一個介於 -15 到 +15 之間的隨機浮點數。有關將 IM 用作數學計算器的更多信息,請參閱FX 表達式。另一種方法是將隨機數分配給 Shell 變量,並將其替換到上述命令中。
當然,您可以在建立堆疊時替換一組不同的圖像,而不是重複相同的圖像。或者選擇一組旋轉角度,使它們都完全不同,或者看起來更令人愉悅。如果您真的很棒,您甚至可以偏移旋轉的圖像(稍微抖動它們的位置),這樣它們就不會全部堆疊在正中心。但你明白了基本的想法。如果您真的想避免使用 PNG 格式,因為它目前在*某些*瀏覽器中存在問題,您可以使用 GIF 圖像格式。為此,您必須願意接受一些顏色限制,並知道將顯示圖像的確切背景顏色。在這些頁面的情況下為“`LightSteelBlue`”顏色。

  magick thumbnail.gif \
          -bordercolor white  -border 6 \
          -bordercolor grey60 -border 1 \
          -background  none   -rotate -9 \
          -background  black  \( +clone -shadow 60x4+4+4 \) +swap \
          -background  LightSteelBlue  -flatten    poloroid.gif
[IM Output]
有關此技術(以及更多)的詳細信息,請參閱純色背景上的 GIF 圖像。以上“堆疊拍立得”技術由Ally's Trip的 Ally 和Muziekvereniging Sempre Crescendo的 Stefan Nagtegaal 友情提供,這兩個網站都在其網站上廣泛使用了類似拍立得的縮略圖。在IM 使用者論壇中,使用者*grazzman*更進一步,將圖像疊加到旋轉的畫布上以建立照片跨頁。

  magick -size 150x150 xc:none -background none \
          -fill white -stroke grey60 \
          -draw "rectangle 0,0 130,100" thumbnail.gif \
                -geometry +5+5 -composite -rotate -10 \
          -draw "rectangle 0,0 130,100" thumbnail.gif \
                -geometry +5+5 -composite -rotate -10 \
          -draw "rectangle 0,0 130,100" thumbnail.gif \
                -geometry +5+5 -composite -rotate +10 \
          -trim +repage -background LightSteelBlue -flatten \
          poloroid_spread.gif
[IM Output]
當然,對於像這樣的照片跨頁,您真的需要使用一組不同的照片,而不是像我這樣一遍又一遍地使用相同的圖像。您可能會考慮使用此技術的一些注意事項。
  • 框架已硬編碼到上面,並取決於縮略圖圖像的大小。在實際應用中,框架可以移動到縮略圖生成階段,而不是在上面的照片跨頁中。
  • 由於“` -rotate `”也會擴展畫布的大小,因此添加圖像的位置會發生變化,除非您使用“` -gravity center `”位置的偏移量放置它們。
  • 最後,不斷旋轉背景框架在質量方面不是一個好主意。旋轉已經旋轉的圖像,與在疊加之前對每個單獨的圖像執行一次旋轉相比,會在結果中添加更多像素級別的失真。
Stas Bekman 的攝影開發了一種類似的照片隨機堆疊在更大區域上的方法,但採用了不同的邊框技術。在圖層範例以及重疊照片中顯示和描述了用於建立某種有序或程式化照片和圖像佈局的更通用的方法。

框架技術

在這裡,我們將介紹一些先進的框架技術,這些技術使用了一些關於 IM 如何工作的非常先進的知識來實現所需的結果。

自框架(外部)

**自框架**是一種可以使用圖像本身生成框架顏色和圖案來為圖像添加框架的技術。也就是說,添加的框架不是固定的,而是會有所不同,以便大致匹配被框架的圖像。您可以通過兩種方式做到這一點。擴展原始圖像以建立*外部框架*,或使用實際圖像本身的一部分來建立*內部框架*。例如,如果我們放大圖像並使其變暗,然後將原始圖像疊加在頂部,我們會得到一個非常漂亮的框架。

  magick thumbnail.gif \
          \( -clone 0 -resize 130% +level 20%x100% \) \
          \( -clone 0 -bordercolor black -border 1x1 \) \
          -delete 0 -gravity center -composite  self_bordered.gif
[IM Output]
除了使用級別調整來增亮(或變暗)框架圖像之外,使邊框顏色更亮或更暗的另一種方法是使用類似...的內容對框架進行顏色著色
“`-fill white -colorize 30%`”
還有另一種為圖像著色的方法來產生邊框,您可以簡單地讓 IM 在放大的圖像頂部疊加一個半透明的 邊框。但是,這需要您知道縮略圖的大小,以便精確調整其大小以適應生成的邊框。

  magick thumbnail.gif \
          \( -clone 0 -resize 140x110\! \) \
          \( -clone 0 -bordercolor black -border 1x1 \
                      -mattecolor '#8884' -frame 9x9+0+9 \) \
          -delete 0 -composite  self_framed.gif
[IM Output]
上述方法的一個變體是使用特殊的 視口 控制和預設的 虛擬像素,邊緣 設定來擴展模糊圖像的邊緣以生成外部邊框。

  magick thumbnail.gif \( +clone \
             -set option:distort:viewport 150x120-15-15 \
             -virtual-pixel Edge    -distort SRT 0  +repage \
             -blur 0x3 +level 20%,100% \) \
          \( -clone 0 -bordercolor white -border 1 \) \
          -delete 0 -gravity center -compose over -composite \
          self_blurred_edge.gif
[IM Output]
請注意:如果邊框僅使用圖像邊緣生成,則小的邊緣缺陷(例如樹木或樹葉)可能會在邊框中產生一些不良結果。視口需要知道原始圖像的大小,才能放大並適當偏移該視口。但是,您可以使用 FX Escape 表達式 來計算視口大小(請參閱下面的示例)。另一種方法是在上面的示例中使用模糊的 虛擬像素,抖動。這將進一步擴散顏色,並且不會那麼“生硬”。但是,如果您在擴展前後添加模糊,則可以使用抖動來產生類似布料的效果。

  magick thumbnail.gif \( +clone  -blur 0x3 \
             -set option:distort:viewport '%[fx:w+30]x%[fx:h+30]-15-15' \
             -virtual-pixel Dither  -distort SRT 0  +repage \
             -blur 0x0.8  +level 20%,100% \) \
          \( -clone 0 -bordercolor white -border 1 \) \
          -delete 0 -gravity center -compose over -composite \
          self_blurred_dither.gif
[IM Output]
第一個模糊調整平均顏色,而第二個模糊調整抖動圖案的“像素化”或平滑程度。這是另一個示例,這次使用 虛擬像素,鏡像,以及 柔和邊緣(變黑),結果證明這對此特定圖像非常有效。

  magick thumbnail.gif  \( +clone \
             -set option:distort:viewport '%[fx:w+30]x%[fx:h+30]-15-15' \
             -virtual-pixel Mirror -distort SRT 0 +repage \
             -alpha set -virtual-pixel transparent \
                 -channel A -blur 0x8 +channel \
             -background Black -flatten \) \
          +swap -gravity center -compose over -composite \
          self_mirror.gif
[IM Output]
在上述所有情況下,邊框都是從同一圖像生成的,然後將其組合在一起以生成基於原始圖像顏色的邊框。因此,邊框是唯一的,並且與每個帶框的縮略圖圖像相匹配。Fred Weinhaus 創建了一個腳本“imageborder”,可以更輕鬆地製作自定義邊框圖像,邊框由原始圖像的模糊放大版本生成,或者某種形式的 虛擬像素 設定定義內容。

自訂相框(內部)

我們可以將圖像本身的部分放大成邊框,而不是放大圖像以添加新邊框。我們已經看到了一些在圖像本身內部添加邊框的技術。凸起按鈕氣泡按鈕 技術使用“-raise”運算符來做到這一點。在這裡,我們生成原始圖像的較亮模糊版本,然後使用也從原始圖像生成的遮罩覆蓋它。然後添加白色邊緣以將較亮的模糊版本與圖像中心未修改的部分分開。

  magick thumbnail.gif \( +clone -blur 0x3 +level 20%,100% \) \
          \( +clone -gamma 0 -shave 10x10 \
             -bordercolor white -border 10x10 \) \
          -composite \
          \( +clone -gamma 0 -shave 10x10 \
             -bordercolor white -border 1x1 \
             -bordercolor black -border 9x9 \) \
          -compose screen -composite \
          self_blurred_border.gif
[IM Output]
您也可以使用 邊框運算符 來實現與之前看到的 按鈕 效果略有不同的效果。訣竅是在應用之前先 修剪 原始圖像。例如,在這裡,我複製原始圖像,使用透明邊框修剪和構建它,然後將其覆蓋在原始圖像上。

  magick thumbnail.gif \( +clone -shave 10x10 \
            -alpha set -mattecolor '#AAA6' -frame 10x10+3+4 \
          \) -composite  inside_frame_trans.gif
[IM Output]
這樣做的問題是,您總是會“變亮”或“變暗”(降低對比度)原始圖像周圍邊框的平坦部分。為避免這種情況,我們可以使用與 氣泡按鈕 技術相同的技術。我們在完美的灰色畫布上生成一個邊框,並對其進行修改以生成 光照效果合成遮罩,以調整原始圖像的顏色。例如,在這裡,我將“VividLight”合成與帶框的遮罩圖像一起使用,以更好地保留原色。

  magick thumbnail.gif \
          \( +clone -shave 10x10 -fill gray50 -colorize 100% \
            -mattecolor gray50 -frame 10x10+3+4 \
          \) -compose VividLight -composite  inside_frame_light.gif
[IM Output]
如同氣泡按鈕,您也可以在應用之前模糊光照遮罩。在這裡,我使用了更普通的「強光」合成模式,它不會增強原色,並帶有模糊的邊框光照遮罩。

  magick thumbnail.gif \
          \( +clone -shave 10x10 -fill gray50 -colorize 100% \
            -mattecolor gray50 -frame 10x10+3+4 -blur 0x2 \
          \) -compose HardLight -composite  inside_frame_blur.gif
[IM Output]
某些光線合成方法可能需要您在合成之前交換圖像才能獲得正確的光照效果。
要進一步使用這種類型的效果,產生更複雜的結果,請參閱進階的光照效果遮罩

簡單邊框疊加

一種簡單的邊框類型是創建一個精美的邊框,或形狀圖像,您可以在其中放置您的圖像,位於邊框下方。例如,在這裡,我們生成了一個簡單的邊框,比我們的圖像稍大,並帶有一個形狀奇特的孔。形狀是從「WebDings」字體(字符「Y」)中提取的,但有很多可能的來源可以用於圖片邊框的奇特形狀。

  magick -size 120x140 -gravity center -font WebDings label:Y \
          -negate -channel A -combine +channel -fill LightCoral -colorize 100% \
          -background none -fill none -stroke firebrick -strokewidth 3 label:Y \
          -flatten +gravity -chop 0x10+0+0 -shave 0x10 +repage border_heart.png
[IM Output]
有關在現有形狀圖像上生成邊緣的其他方法,請參閱邊緣變換
您還可以選擇使用陰影效果為邊框增添一些深度。

  magick border_heart.png  \( +clone -background black -shadow 60x3+3+3 \) \
          -background none -compose DstOver -flatten   border_overlay.png
[IM Output]
現在我們有了一個簡單的疊加邊框,我們可以使用「DstOver」合成模式將圖像放置在中心下方,位於邊框下方。

  magick border_overlay.png  thumbnail.gif \
          -gravity center -compose DstOver -composite   border_overlaid.jpg
[IM Output]
現在,您可以生成一個預先準備好的邊框庫以與您的圖像一起使用,例如這個秋葉圖像

    magick thumbnail.gif  autumn_leaves.png +swap \
            -gravity center -compose DstOver -composite \
            border_leaves.gif
[IM Text]  + [IM Text] ==> [IM Text]
請注意,我交換了圖像的順序並使用了「DstOver」將第二張主圖像放置在邊框「下方」。這樣,決定圖像最終大小的是邊框,而不是原始圖像。但是,這樣做也會丟失主圖像具有的任何元數據(出於相同的原因)。如果您真的想保留縮略圖的元數據(例如標籤和註釋,例如版權聲明),那麼最好的方法是將縮略圖填充到與邊框相同的大小,然後使用默認的「Over」合成模式來疊加邊框。這樣,縮略圖就是「目標」圖像,並且保留了它的圖像元數據。

徽章疊加範例

這是另一個更複雜的預先準備好的疊加範例,這次使用來自 IM 論壇討論複合疊加和遮罩的正確大小的圖像(使用範圍作為裁剪方法)。

    magick thumbnail.gif  -gravity center -extent 90x90 \
            badge_overlay.png -composite     badge.png
[IM Text]  + [IM Text] ==> [IM Text]
請注意,圖像本身沒有變形,只是稍微變亮和變暗,切出一個圓圈並添加了陰影,所有這些都在一張疊加圖像中完成。如果這是一個真正的徽章或「玻璃氣泡」,那麼圖像也應該稍微扭曲一點(也許使用桶形失真),但即使沒有這種失真也能很好地工作。有關「徽章」範例的下一步,請參閱使用遮罩和繪畫的徽章,它在徽章外部添加了背景透明度。

遮罩與繪製技術

在很多情况下,您不僅希望在图像周围覆盖方形边框,还希望将图像边缘裁剪为透明。为此,您通常会使用至少两张图像。一个是蒙版覆盖图,包含要添加到现有图像的颜色、阴影和高光。第二个图像包含要从原始图像中移除的部分。这两种图像可以通过两种不同的方式应用。您可以先“遮罩”以移除图像中不需要的部分,然后覆盖边框,或者您可以覆盖边框,然后将原始图像和覆盖颜色的不需要的部分遮罩为透明。您使用哪种方法至关重要,所涉及的图像将针对特定技术进行设计。您不能以错误的顺序使用一种方法的图像,否则将无法正常工作。例如,让我们创建更复杂形状的边框,但这次不必担心设置背景。

  magick -size 120x100 xc:none -fill none -stroke black -strokewidth 3 \
          -draw 'ellipse 60,50 30,45 0,360  ellipse 60,50 55,30 0,360' \
          -strokewidth 3  -draw 'ellipse 60,50 57,47 0,360' \
          -channel RGBA  -blur 2x1    border_ellipse.png
[IM Output]
现在我故意使这个边框模糊,使边缘组件更加半透明。即使没有额外的模糊,边框也包含许多半透明的抗锯齿像素,使边缘看起来更平滑,不那么参差不齐。在图像处理中,考虑这些半透明像素至关重要,以便正确地保留和设置它们。
为了更有趣,给这个“模糊”边框添加一些随机的颜色。

  magick border_ellipse.png \
          \( -size 120x100 plasma:Tomato-FireBrick -alpha set -blur 0x1 \) \
          -compose SrcIn -composite     border_ellipse_red.png
[IM Output]
好了,我们有了一个边框,但我们仍然需要一些方法来定义什么是边框的外部和内部。基本上,我们需要一个蒙版来定义这两个区域。

  magick -size 120x100  xc:none -fill black \
          -draw 'ellipse 60,50 30,45 0,360  ellipse 60,50 55,30 0,360' \
          border_ellipse_mask.png
[IM Output]
这个“蒙版”图像的颜色并不重要,重要的是它的形状,因为它基本上定义了哪些部分将被归类为内部,哪些部分将被归类为外部。蒙版可以是灰度蒙版,也可以是如上所示的形状蒙版。虽然后者通常更有用,甚至可以是要擦除的部分或要保留的部分(如上所示)的形状。在这种情况下,图像被设计为“遮罩和绘制”技术,这意味着您应该首先擦除不需要的部分,然后覆盖额外的边框颜色(这也涉及透明度蒙版)。例如...

  magick thumbnail.gif -alpha set  -gravity center -extent 120x100 \
          border_ellipse_mask.png  -compose DstIn -composite \
          border_ellipse_red.png   -compose Over  -composite \
          border_mask_paint.png
[IM Output]  + [IM Output]  + [IM Output] ==> [IM Output]
始终需要两种Duff-Porter Alpha 合成运算。一种用于使部分透明,另一种用于覆盖其他颜色以勾勒边框或框架。需要两张图像,因此应将它们分开保存。MIFF 和 GIF 等某些格式允许您将两张图像保存到同一个文件中,以便于存储。当然,您可以将这两张图像组合起来创建一个简单的叠加边框图像,但前提是您希望对结果的外部部分使用固定的非透明颜色。例如,预先将外部定义为 DodgerBlue 颜色...

  magick border_ellipse_mask.png -alpha extract -negate \
          -background DodgerBlue -alpha shape \
          border_ellipse_red.png   -compose Over -composite \
          border_ellipse_overlay.png
[IM Output]
但在这种情况下,您可以在之前生成的双蒙版图像下简单地放置纯色或其他背景图像...

  magick border_double_masked.png \
          \( -size 120x100 plasma:Green-Green -blur 0x1 \) \
          +swap  -compose Over  -composite     border_background.png
[IM Output]
重点是,使用两张图像,“蒙版”图像和“叠加”图像,您可以更加自由地将边框添加到图像中。您甚至可以定义多个“蒙版”图像,以定义“叠加”边框图像的不同“窗口”。您还可以添加可选的高光和阴影,而不是将它们硬编码到单个叠加边框图像中。现在需要注意的是。遮罩图像的边缘不得与叠加图像的边缘重合。如果它们匹配,您将无法正确处理沿重合边缘的颜色,或者会产生其他奇怪的“光晕”效果。因此,您需要确保蒙版边缘落在叠加图像的不透明区域内的某个位置。需要谨慎和预先考虑这两种遮罩操作。

圓角邊框

如上所述,遮罩與繪製技巧 不僅可以用於為圖像添加額外的顏色或「絨毛」,還可以刪除部分圖像,以塑造最終圖像。這為我們提供了一種為圖像添加圓角的替代方法。IM「-draw」運算符帶有一個「roundrectangle」方法,可用於在圖像周圍提供有趣的邊框。但是,您需要調整此繪製方法的尺寸以匹配圖像。IM 確實提供了基於圖像大小提取甚至進行數學計算的方法。定位矩形的坐標用於定義矩形的筆劃寬度(可以是浮點值)的確切「中心」。此外,它以「像素坐標」表示(請參閱 像素與圖像坐標),這意味著值 1,1 是指從頂部和左側邊緣開始的第二個像素,但更重要的是,它指的是實際上距離真實頂部和左側邊緣 1.5 個單位的像素「中心」。現在我們將使用 3 的筆劃寬度 (SW),這會使圖像在所有側面都增大 3 個像素。這意味著矩形將定位在距離左上角 SW/2 - 0.5 或 1.0 個像素處,以及距離右下角 ImageSize + SW*1.5 - 0.5 或圖像大小 + 4 個像素處。在這裡,我們使用 IM 本身來執行這些計算,使用精美的 FX 轉義符 生成所需的確切繪製命令。這會保存為 Magick 向量圖形文件,以後的命令中的繪製可以直接使用。

  magick thumbnail.gif \
          -format 'roundrectangle 1,1 %[fx:w+4],%[fx:h+4] 15,15'\
          info: > rounded_corner.mvg
[IM Text]
如果您能以其他方式(使用 shell 或其他 API 語言包裝器)找出圖像大小,則可以將適當的繪製參數直接替換為下一個示例,而不是使用 FX 數學表達式。基本上,以上操作使整個過程獨立於縮略圖的實際大小。任何其他方式,包括直接硬編碼也是可以接受的。
現在我們可以使用它來生成疊加層和遮罩圖像。作為其中的一部分,我們使用原始圖像(首先通過筆劃寬度放大)創建一個 透明畫布,以獲得正確的大小。

  magick thumbnail.gif -border 3 -alpha transparent \
          -background none -fill white -stroke none -strokewidth 0 \
          -draw "@rounded_corner.mvg"    rounded_corner_mask.png
  magick thumbnail.gif -border 3 -alpha transparent \
          -background none -fill none -stroke black -strokewidth 3 \
          -draw "@rounded_corner.mvg"    rounded_corner_overlay.png
[IM Text] [IM Text]
我們得到了雙重遮罩技術所需的疊加邊框圖像和透明度遮罩圖像。請注意,遮罩適用於比原始圖像大一個筆劃寬度的圖像,並且擦除形狀遮罩(白色)不會覆蓋整個放大區域,因為它周圍有 1 個像素的間隙。讓我們使用 雙重遮罩 技術應用它...

  magick thumbnail.gif -alpha set -bordercolor none -border 3  \
          rounded_corner_mask.png -compose DstIn -composite \
          rounded_corner_overlay.png -compose Over -composite \
          rounded_border.png
[IM Output]
我們已經為圖像添加了圓角邊框。以下是您如何使用一些額外的技巧在單個命令中完成上述所有操作。但是,此多合一命令仍將生成一個臨時文件,其中包含給定大小的圖像所需的生成繪製命令。

  magick thumbnail.gif \
      -format 'roundrectangle 1,1 %[fx:w+4],%[fx:h+4] 15,15' \
      -write info:tmp.mvg \
      -alpha set -bordercolor none -border 3 \
      \( +clone -alpha transparent -background none \
         -fill white -stroke none -strokewidth 0 -draw @tmp.mvg \) \
      -compose DstIn -composite \
      \( +clone -alpha transparent -background none \
         -fill none -stroke black -strokewidth 3 -draw @tmp.mvg \
         -fill none -stroke white -strokewidth 1 -draw @tmp.mvg \) \
      -compose Over -composite               rounded_border_in_one.png
  rm -f tmp.mvg      # Cleanup of temporary file
[IM Output]
製作圓角的更好方法,尤其是對於非常大的圖像,是使用單獨的角遮罩圖像技術,我們將在下面的 花式角疊加 中看到。在許多方面,這是上述方法的延伸,但對圖像的每個角使用單獨的遮罩,以保持工作圖像的尺寸較小。

使用遮罩與繪製的徽章

這是一個更複雜的「遮罩與繪製」示例,它是從之前在上面的 徽章疊加 示例中使用的圖像開發而來的。兩幅圖像的生成是「偽造的」,並在 IM 論壇 複合疊加和遮罩 中進行了討論。理想情況下,這兩幅圖像應該一起開發。

  magick thumbnail.gif -alpha set -gravity center -extent 90x90 \
          badge_mask.png -compose DstIn -composite \
          badge_shading.png -compose Over -composite \
          badge_trans_bg.png
[IM Text]  + [IM Text]  + [IM Text] ==> [IM Text]
請注意,以上我說過,您應該避免嘗試對齊透明邊緣和遮罩邊緣。在上面的示例中,我就是這樣做的,結果圖像的邊緣不太正確。但是,由於著色實際上只是一種細微的陰影而不是強烈的邊緣,因此在本示例中似乎效果很好。 但是要小心。 有關“徽章”示例的下一步,請參見使用繪製和遮罩的徽章,它會顛倒兩個合成操作的順序,需要一組不同的圖像。

繪製與遮罩技術

您可以使用一組不同的圖像,並先覆蓋其他顏色,然後再遮罩背景,而不是“先遮罩後繪製”。 也就是說,您可以執行“先繪製後遮罩”。 也就是說,您將使用您的圖像,並覆蓋邊框,該邊框不僅設置了所有最終邊框顏色,還遮罩並著色了原始圖像部分外部的部分或全部部分。 然後,您使用單獨的“外部”或“剪切”遮罩來移除結果圖像中所有不需要的部分。另請注意,“覆蓋”和“遮罩”圖像都將內邊緣與邊框的外邊緣分開定義。 因此,一張圖像無法在一張圖像中完全定義整個邊框,這可能會使其使用起來有點困難。 但是,它可以更易於實現。 例如...

  magick -size 120x90 xc:none -fill black -stroke black -strokewidth 0 \
          -draw 'ellipse 45,45 55,37 0,360' \
          -channel RGBA -negate -blur 0x3  +channel \
          \( granite: -auto-level -blur 0,0.7 \) \
          -compose ATop -composite border_paint.png

  magick -size 120x90 xc:none -fill black -stroke black -strokewidth 5 \
          -draw 'ellipse 59,45 56,40 0,360' border_mask.png

  magick thumbnail.gif -alpha set \
          border_paint.png -compose Over  -composite \
          border_mask.png  -compose DstIn -composite \
          border_paint_mask.png
[IM Output]  + [IM Output]  + [IM Output] ==> [IM Output]
請注意覆蓋顏色的某些部分是如何被移除的。 這是繪製“n”遮罩技術的關鍵特性,允許您使用更簡單的覆蓋,然後通過遮罩進行調整。 這種圖像遮罩方法用於下一個捲曲頁面角示例集中,稍後在下面的花式邊角邊框中再次使用。

捲頁角

Fred Weinhaus 創建了一個名為 PageCurl 的特殊 Shell 腳本,它將使用一些非常複雜的數學(在 Shell 中)向現有圖像添加簡單的捲曲頁面。 例如...

  pagecurl thumbnail.gif  pagecurl.png
[IM Output]
在內部,它實際上使用的是繪製“n”遮罩技術。 也就是說,首先覆蓋一個稍微大一點的“捲曲覆蓋”,然後擦除(遮罩)圖像的其餘部分,包括一小部分覆蓋,這些覆蓋將變成透明角。 但是,如果您想將捲曲頁面應用於許多圖像,那麼使用完整腳本(如上)是一種相當慢的技術。 畢竟,它確實進行了大量的數學處理(使用 IM 本身作為浮點計算器),以實際計算和生成適當的覆蓋和遮罩圖像。 要將捲曲頁面應用於許多圖像,最好只使用一次腳本,以便只生成一次覆蓋和透明遮罩圖像。 因此,讓我們提取這兩個圖像以獲得更小的 64x64 像素圖像(為此,使用添加到腳本中的特殊“-i "pagecurl"”選項)。

  magick -size 64x64 xc: miff:- | pagecurl -e 0.3 -i "pagecurl" - null:
[IM Output] [IM Output]
上述命令創建了兩個圖像文件:“pagecurl_overlay.png”和“pagecurl_mask.png”所示。 輸入圖像本身無關緊要,因為我們想要的是遮罩圖像。 “捲曲頁面”結果只是使用特殊的“null:”圖像文件格式丟棄的。

  magick thumbnail.gif -alpha set -gravity SouthEast \
          -define compose:outside-overlay=false \
          pagecurl_overlay.png -composite \
          pagecurl_mask.png  -compose DstIn -composite \
          pagecurl_thumbnail.png
[IM Output]
當然,這些圖像與我們的縮略圖大小不同,也可能與您要應用的任何圖像大小不同,但这没关系,因為我们可以使用一些额外的選項来确保它们按预期工作。具體来说,「-gravity」設定可確保將兩個重疊圖像放置在右下角。而特殊的定義設定compose:outside-overlay=false」將防止遮罩圖像擦除較小圖像未覆盖的图像部分。有關完整說明,請參閱外部重疊設定。如果您想將其應用於許多圖像,則可以使用「magick mogrify」,使用一種特殊的技術,涉及使用「-draw」來執行Mogrify Alpha 合成。但是,此合成方法無法理解特殊的定義設定,因此它僅適用於大小相同的圖像、重疊和遮罩。

  pagecurl -e 0.5 -i /tmp/pagecurl  {one image} null:
  magick mogrify {magick mogrify -format and -path options} -alpha set \
          -draw 'image Over 0,0 0,0 "/tmp/pagecurl_overlay.png"' \
          -draw 'image DstIn 0,0 0,0 "/tmp/pagecurl_mask.png"' \
          {all images to be pagecurled}...

花式邊角疊加

在這裡,我們將更深入地瞭解如何使用這種「雙重遮罩」技術以不同方式修改圖像的不同區域,而不是將單個大型遮罩或框架應用於整個圖像。在這種情况下,我們只會對角落進行雙重遮罩。其餘的邊框(以匹配)是單獨添加的。[IM 輸出] 我將使用的角落圖像是從原始來源(如右圖所示)生成的,我在DIY 相框區安東尼圖示庫中找到了它。本節中還有其他內容,因此您不妨看看。如果您在網路上發現了一些東西,請告訴我,因為我喜歡收集有趣的角落和邊緣技術。[IM 輸出] [IM 輸出] 從該初始圖像生成顏色疊加和遮罩圖像,以便我們可以使用繪製「n」遮罩技術將角落疊加到圖像上。請注意,這些圖像實際上並未使用任何半透明像素,甚至沒有使用任何顏色陰影。因此,可以使用此花式邊框為網頁製作外觀簡潔的「GIF」縮略圖。使用角落遮罩的複雜之处在於它們只遮罩原始圖像的角落。因此,首先需要為原始圖像提供適當的額外邊框顏色集。之後,必須將兩個角落遮罩合成到擴展圖像的每個角落。

  magick thumbnail.gif   -alpha set  -compose Copy \
          -bordercolor Black  -border 2 \
          -bordercolor Sienna -border 3 \
          -bordercolor Black  -border 1 \
          -bordercolor None   -border 2 \
          -bordercolor Black  -border 2 \
          -bordercolor Peru   -border 3 \
          -bordercolor Black  -border 1 \
          \
          -compose Over \
          \( fancy_add.gif             \) -gravity NorthWest -composite \
          \( fancy_add.gif -flip       \) -gravity SouthWest -composite \
          \( fancy_add.gif       -flop \) -gravity NorthEast -composite \
          \( fancy_add.gif -flip -flop \) -gravity SouthEast -composite \
          -compose DstOut \
          \( fancy_sub.gif             \) -gravity NorthWest -composite \
          \( fancy_sub.gif -flip       \) -gravity SouthWest -composite \
          \( fancy_sub.gif       -flop \) -gravity NorthEast -composite \
          \( fancy_sub.gif -flip -flop \) -gravity SouthEast -composite \
          fancy_border.gif
[IM Output]
請注意,要保留正在添加的透明邊框,您必須將「-compose」設定為「Copy」而不是默認值「Over」。如果不这样做,則透明度將由添加的下一個邊框顏色填充,在本例中為「黑色」。有關詳細信息,請參閱邊框運算符
僅使用角落遮罩的好處是可以使用此技術構建任何大小的圖像,只要它足夠大以容納正在添加的角落遮罩即可。也就是说,您不受可用的框架圖像大小的限制。當然,四個角落圖像和邊框中的每一個在圖像周圍都是相同的,只是旋轉了。也就是说,阴影或厚度效果都是「向內的」。要解决此問題,您需要為每個角落生成不同的角落部分,並且需要不對稱地添加原始圖像周圍的額外邊緣。基本上,它變得更加複雜,以便產生真實的阴影效果。更好的解決方案可能是從角落部分移除阴影效果,像以前一樣應用它,但隨後全局添加阴影效果。需要注意的是。

使用繪製與遮罩的徽章

先前的徽章疊加徽章遮罩與繪製中看到的相同徽章圖像處理,也可以通過先繪製後遮罩來完成。在這裡,我們首先繪製所有顏色和陰影,然後遮罩出圖像的最終透明度。

  magick thumbnail.gif -alpha set -gravity center -extent 90x90 \
          badge_paint.png -composite badge_shape.png -compose DstIn -composite \
          badge_paint_mask.png
[IM Text]  + [IM Text]  + [IM Text] ==> [IM Text]
如果你覺得這個特定圖像這樣處理很奇怪,你是對的,確實很奇怪。原因是我們不僅需要對原始圖像進行陰影和高光處理,還需要用黑色填充任何包含陰影效果的區域。具體來說,任何將變得完全透明的部分(並且只有真正完全透明的像素)都需要用黑色繪製。另一方面,具有陰影效果的半透明像素將同時具有部分陰影效果和部分透明遮罩。換句話說,陰影使得原本簡單的繪製和遮罩技術在繪製和遮罩效果的劃分上變得 awkward。這就是為什麼在處理圖像的半透明添加(例如添加陰影或閃光星)時,通常不使用繪製和遮罩技術。如果圖像不包含任何透明效果,那麼繪製過程看起來就不會那麼糟糕,並且在許多情況下可能比其他技術更簡單,因為您可以在完成後使用遮罩“切斷”繪製的疊加層。捲頁示例就是這樣一種情況,我們使用遮罩修剪捲頁疊加層以形成無縫的整體。另請注意繪製圖像中硬黑色區域和陰影效果之間的間隙。這個間隙反映了我之前提到的警告,即確保不要將任何內部遮罩的結果與任何繪製/疊加外部遮罩的邊緣重疊。只有在這種特定情況下,這個必需的間隙才會變得如此明顯。有關“徽章”示例中下一步的資訊,請參閱使用光照效果的徽章,它將兩個遮罩圖像合併為單個遮罩/陰影圖像。

光照遮罩技術

玻璃氣泡按鈕

縮略圖處理的下一個複雜級別是非常複雜的光照效果的應用。這裡的訣竅不在於對圖像應用光照效果,而在於生成適當的陰影效果。例如,使用Aqua 效果,您可以為縮略圖提供非常複雜的陰影效果,使其看起來像是被“氣泡”玻璃包裹著。此外,這在具有圓角的縮略圖上效果更好。讓我們使用純灰色為我們的縮略圖圖像生成一個圓角遮罩。

  magick thumbnail.gif -alpha off -fill white -colorize 100% \
     -draw 'fill black polygon 0,0 0,15 15,0 fill white circle 15,15 15,0' \
     \( +clone -flip \) -compose Multiply -composite \
     \( +clone -flop \) -compose Multiply -composite \
     -background Gray50 -alpha Shape    thumbnail_mask.png
[IM Output]
現在我們有了一個我們想要使用的純灰色“形狀遮罩”,我可以應用Aqua 效果效果為此形狀生成一個光照疊加層。

  magick thumbnail_mask.png -bordercolor None -border 1x1 \
          -alpha Extract -blur 0x10  -shade 130x30 -alpha On \
          -background gray50 -alpha background -auto-level \
          -function polynomial  3.5,-5.05,2.05,0.3 \
          \( +clone -alpha extract  -blur 0x2 \) \
          -channel RGB -compose multiply -composite \
          +channel +compose -chop 1x1 \
          thumbnail_lighting.png
[IM Output]
使用如上所示的最終光照/陰影疊加圖像,我們可以輕鬆地將其應用於任何大小合適的縮略圖圖像。

  magick thumbnail.gif -alpha Set thumbnail_lighting.png \
          \( -clone 0,1 -alpha Opaque -compose Hardlight -composite \) \
          -delete 0 -compose In -composite \
          glass_bubble.png
[IM Output]
這不僅可以為此尺寸的任何縮略圖添加適當的陰影效果,而且相同的光照圖像會將縮略圖遮罩成適當的形狀。需要注意的是,只有顏色通道用於應用光照效果,alpha 通道在此過程中不使用。類似地,遮罩時僅使用 alpha 通道,而不使用顏色通道。如果沒有這種針對不同效果的通道分離,您將無法獲得正確的結果。有關從圖像中提取光照效果的討論,請參閱 IM 用戶論壇主題從兩個圖像中提取光照層
然而,我們可以更進一步,直接將陰影效果添加到此光照遮罩。添加的顏色必須是純黑色,並且您需要確保選擇的光照效果合成會使圖像在光照遮罩為黑色的情況下也完美呈現黑色。然而,這實際上是陰影效果通常添加到圖像的方式,因此您可以直接將陰影添加到“光照效果遮罩”中,一切都會順利!添加光照“光暈”也是如此,但僅使用白色像素進行光暈疊加。從本質上講,“光照效果圖像”可以再次將兩個 遮罩與繪製 圖像合併回單個圖像。正如您將在下一個示例中看到的那樣。

使用光照效果的徽章

使用 使用遮罩與繪製的徽章 技術中的圖像,我將它們應用於純灰色畫布圖像,以便快速生成“遮罩光照效果”圖像,實際上我也可以輕鬆使用其他遮罩樣式(使用繪製與遮罩的徽章)。然後,我將單個遮罩圖像應用於縮略圖,以重現所需的結果。

  # merge "mask 'n' paint" images with a gray image,
  # to create a "lighting mask"
  magick -size 90x90 xc:gray50 -alpha set \
          badge_mask.png -compose DstIn -composite \
          badge_shading.png -compose Over -composite \
          badge_lighting.png

  # Apply the single "lighting mask"
  magick thumbnail.gif -alpha set -gravity center -extent 90x90 \
          badge_lighting.png \
          \( -clone 0,1 -alpha Opaque -compose Hardlight -composite \) \
          -delete 0 -compose In -composite \
          badge_final.png
[IM Text]  + [IM Text] ==> [IM Text]
實際上我非常喜歡這種遮罩形式,因為遮罩圖像本身看起來幾乎與您想要的圖像相同,只是缺少顏色。畢竟,這就是光照遮罩的創建方式,只需將效果應用於完美的灰色圖像,您就會得到一個“光照遮罩”圖像。請記住,使用這種特殊技術時,半透明陰影必須是純黑色才能正常工作。您不能對任何不包含原始圖像至少一部分的像素使用灰色。所有透明和半透明區域的顏色必須是純白色或黑色,並具有適當級別的 Alpha 透明度。為什麼只有一個圖像有效? 以前我們需要兩個圖像!答案是遮罩圖像僅限於僅添加純黑色或白色陰影。通過這樣做,陰影(光照)效果及其遮罩基本上合併到“光照效果遮罩”的顏色分量中。因此,Alpha 通道可以自由保存最終圖像之前單獨的透明度遮罩。然而,這樣做的限制是您只能為圖像添加白色和黑色陰影。例如,您不能為要遮罩的圖像添加灰色。但是請注意,可以添加某些顏色空間的一些主要和次要顏色的色調,但僅限於有限的方式,而且我從未見過它被使用。總之,您不能為圖像添加特定顏色或花哨的邊框,只能添加陰影和陰影、高光和光暈,或簡單的黑色或白色文本。但是,您不應嘗試混合或重疊添加的白色和黑色效果,因為兩者之間產生的灰色抗鋸齒像素會從底層圖像產生陰影顏色,而不是預期的灰色。也就是說,這是這種技術的缺點!

使用扭曲遮罩圖像...

更不可思議的是,由於陰影顏色只是一幅灰度圖像,您可以將光照效果壓縮為一個顏色通道和 Alpha 通道遮罩。然後,這可以用於釋放兩個顏色圖像通道,以用於其他圖像處理效果!也就是說,您可以在單個“遮罩圖像”中存儲其他內容。具體來說,您可以在同一個遮罩圖像中添加扭曲效果!有關這方面的更多信息,請參閱 統一扭曲圖像,它正是這樣做的!一種終極遮罩圖像。

使用邊緣圖像進行框選

[IM Image] 為圖片加入複雜邊框的一個常見方法是使用預先製作好的相框圖像,以產生如圖所示的範例(右圖)。 然而,在產生邊框時也需要注意。 仔細觀察給定的範例,您會發現它並不完全正確。 生成的邊框的陰影實際上是不正確的。 左側和底部邊框邊緣應交換位置,以便為典型的左上角光源產生正確陰影的邊框。 因此,在我們開始之前,我想強調在為縮略圖或照片製作邊框時,為每個邊緣使用正確圖像或正確修改圖像的重要性。 它很容易出錯,所以當您認為自己做對了的時候,請仔細檢查結果。

邊框邊緣圖像

可以使用多種類型的圖像來為圖像製作邊框。 例如,這裡是一個「金色飾邊的黑色細邊框」,它是從 Michael Slate <slatem_AT_posters2prints.com> 提供的圖像修改而來的。
[IM Image] [IM Image]
有兩張圖像,用於提供兩種不同的照明效果,一張用於頂部和左側邊緣,另一張用於底部和右側邊緣。 然而,沿著圖像長度的顏色不會改變。 因此,您可以平鋪或拉伸此邊框以產生所需的長度。 這一組類似的邊框片段是這個「薄的華麗金色」可平鋪邊框圖像。
[IM Image] [IM Image]
由於這些圖像具有一些精細的細節,因此您不能僅僅將圖像拉伸到所需的長度。 您也不能僅僅矩形旋轉這些片段來產生其他邊緣片段,因為這樣做會使精細細節的陰影錯誤。 然而,對角線轉置變形應該可以為其他邊緣獲得正確的陰影。 建議在查看結果時格外小心,以確保圖像所有四個邊緣上的整體陰影和精細細節陰影都是正確的。 最後,邊框圖像可能只包含一個可以用於生成所有邊框邊緣的圖像,例如這個“竹子”平鋪邊框圖像。
[IM Image]
只需要一張圖像的原因是邊框沒有特定的“內部”或“外部”。 儘管邊框確實具有整體和精細的細節照明效果,但您需要再次注意如何為其他邊緣旋轉/翻轉/轉置圖像。 這個邊框更大的問題是,如果您只是簡單地將其平鋪,宏觀細節會變得非常規則,因此您可能需要隨機化平鋪偏移,甚至隨機化拼接在一起的片段的長度,以便賦予它更自然的外觀。 稍後將詳細介紹。 如您所見,邊框圖像可以有多種樣式,並且在生成其他缺失的邊緣圖像時,必須注意以正確的方式處理所選的邊緣圖像(關於照明圖像)。

加長邊框片段

現在,在使用這些邊框圖像時,我們需要創建更長的片段來覆蓋圖像尺寸的長度。這只有兩種基本方法可以做到。您可以簡單地使用調整大小(不保留縱橫比)來拉伸邊框圖像,以獲得正確的長度。這適用於上面顯示的第一組片段,它們沒有內部細節,但不適用於呈現的任何其他邊框圖像。基本上,它會扭曲內部細節,並可能分散最終圖像的外觀。但是,另一種加長方法,平鋪,可以用於任何具有重複圖案或細節的邊框圖像,上面呈現的所有圖像都是這種情況。如果您要創建自己的邊框片段,請注意拼貼必須正確匹配,並且要匹配像素邊界,以確保邊框圖像中的顏色一致且細節循環正確。如果沒有,您會在拼貼之間看到一個看起來很假的人工接縫,因為拼貼的重複,這個接縫會變得非常明顯。在現實世界中,相框製造商在將片段連接在一起以製作更長的片段時也會遇到同樣的問題。基本上,很容易得到兩種不同深淺的木材,或者紋理非常不同的木材,當它們“鳩尾榫”連接在一起時,接縫就會非常明顯。所以,你不是唯一一個遇到這個問題的人。“竹子”邊框圖像需要平鋪。雖然細節僅限於圖像上的一小塊區域,但您可以獲得一些有趣的隨機平鋪效果,這可能需要對片段進行一些隨機的加長和縮短才能消除。不過,我不會深入探討這個問題,我將把它留給那些有興趣的人作為練習。對於我們的示例,並且因為它適用於幾乎所有邊框圖像,我將使用一種簡單的恆定平鋪方法來生成所需的較長邊緣長度。

過度簡化的附加

我們可以通過將上面的簡單“竹子”邊框平鋪到正確的長度,然後將圖像附加在一起來加長它。平鋪是通過特殊的平鋪畫布圖像生成器“tile:”完成的,用於平鋪正在讀取的圖像。

  magick thumbnail.gif \
          \( -size 90x14  tile:bamboo.gif -transpose \) \
          \( -size 90x14  tile:bamboo.gif -transpose \) -swap 0,1 +append \
          \( -size 148x14 tile:bamboo.gif \) \
          \( -size 148x14 tile:bamboo.gif \) -swap 0,1 -append \
          frame_append.gif
[IM Output]
請注意,上述兩個示例中使用的大小是根據邊框圖像的已知寬度(10 像素)和被框圖像的大小(120x100 像素)計算得出的。您需要根據您的圖像適當調整調整大小參數。平鋪邊框片段(如竹子)的一個問題是,所有邊緣看起來都像是彼此的精確副本!也就是說,邊框看起來很假。在現實生活中,邊框會從較長的真木材或竹子中切割出來,並且偏移量幾乎是隨機的。要解決這個問題,您還需要為圖像的每個邊緣賦予這些拼貼略微不同的拼貼偏移

  magick thumbnail.gif \
          \( -size 90x14  -tile-offset +50+0 tile:bamboo.gif -transpose \) \
          \( -size 90x14  -tile-offset +0+0  tile:bamboo.gif -transpose \) \
          -swap 0,1 +append \
          \( -size 148x14 -tile-offset +70+0 tile:bamboo.gif \) \
          \( -size 148x14 -tile-offset +25+0 tile:bamboo.gif \) \
          -swap 0,1 -append       frame_tile_offset.gif
[IM Output]
對於這種特定類型的邊緣圖像來說,這種邊框方法還不錯,但對於其他類型的邊框來說,它看起來可能很傻。基本上,拐角不正確,對於大多數邊框,您確實希望邊緣圖像以 45 度角連接,就像在真實的相框中一樣。解決此問題的一種方法是手動預先生成適當的拐角圖像,我們現在可以將其覆蓋在此圖像上以使其正確。這對於簡單的可拉伸邊框圖像(如“黑色細線”邊框圖像)非常有效,但對於像“竹子”這樣的可平鋪圖像來說,它會失敗得很慘,因為拐角圖像可能無法正確擬合拼貼圖像。更好的方法是直接從平鋪的邊緣圖像生成拐角連接處。稍後我將向您展示這樣做的幾種方法。

擴展疊加相框

此外,通過將邊框延伸到原始圖像的邊界之外,您可以使這種邊緣邊框看起來更好。這在“甜蜜的家”類型的圖片中很常見。為此,您需要先放大原始圖像,並留出大量額外空間,以便將較長的邊框片段覆蓋在上面。

  magick thumbnail.gif -alpha set -bordercolor none -border 34 \
          \( -size 144x14 -tile-offset +30+0 tile:bamboo.gif -transpose \) \
          -geometry +20+10 -composite \
          \( -size 144x14 -tile-offset +45+0 tile:bamboo.gif -transpose \) \
          -geometry +154+0 -composite \
          \( -size 178x14 -tile-offset +60+0 tile:bamboo.gif \) \
          -geometry +0+20 -composite \
          \( -size 178x14 -tile-offset +0+0  tile:bamboo.gif \) \
          -geometry +10+124 -composite \
          frame_overlaid.gif
[IM Output]
請注意,這種框架類型的測量和定位並不簡單,可以使用一些隨機化,就像我在上面的例子中硬編碼的那樣。您還可以通過使用一些額外的和適當的陰影來舍入框架長度的末端來進一步改進外觀。以這種方式構建圖像邊框的更好方法是將邊框圖像生成為一個完整的單元,並將其覆蓋在固定大小的圖像上(請參閱簡單的邊框疊加)。但是,這樣做意味著您無法再稍微隨機化每個框架片的長度和位置。

45 度角拼接

更好的解決方案是以某種方式在縮略圖周圍添加邊框圖像,以便在邊框的每個角落實際創建一個 45 度的接縫。這並不容易,我嘗試了許多繪圖和遮罩方法,直到我重新發現了一個神奇的操作符,稱為框架,3D 類似邊框
然後解決方案就很簡單了。讀取圖像,然後「-frame」它,以創建要構建框架的區域的模板。

  magick thumbnail.gif -alpha set -bordercolor none \
          -compose Dst_Out -frame 15x15+15  frame_template.gif
[IM Output]
現在請注意,此模板具有一些有趣的功能。首先,它在中間是透明的,主圖像將位於此處。其次,它有四種且僅有四種不同的顏色,定義了我們要放置框架圖像的每個區域。它不會在角落生成不同顏色的「抗鋸齒」像素。請注意,為了使事情變得更容易,這些區域的寬度(15 像素)是我們將添加到圖像中的框架片的寬度。如果垂直邊緣的厚度與水平邊緣的厚度不同,則此技術將無法很好地工作。事實上,在這種情況下,很少有方法可以很好地工作。此圖像是框架模板,通過使用顏色填充基元將每個框架片平鋪到四個不同顏色的區域中,我們將非常簡單輕鬆地獲得 45 度的角接縫。
例如...

  magick frame_template.gif \
          -tile blackthin_top.gif -draw 'color 1,0 floodfill' \
          frame_top_filled.gif
[IM Output]
您可以對其他三個邊重複此過程。使用轉置以確保內部細節的高光和陰影保持正確。

  magick frame_template.gif \
          -tile blackthin_top.gif   -draw 'color 1,0 floodfill' \
          -tile-offset +0+105 -tile blackthin_btm.gif \
                                       -draw 'color 15,105 floodfill' \
          -transpose \
          -tile blackthin_top.gif      -draw 'color 1,0 floodfill' \
          -tile-offset +0+135 -tile blackthin_btm.gif \
                                       -draw 'color 15,135 floodfill' \
          -transpose \
          -gravity center thumbnail.gif -composite frame_filled.gif
[IM Output]
根據 IM 論壇討論45 度框架接縫,找到了一種更簡單的解決方案,涉及預先旋轉底邊。以下是使用內存寄存器保存中間圖像的完整示例。

  magick thumbnail.gif                -write mpr:image    +delete \
          goldthin_top.png             -write mpr:edge_top +delete \
          goldthin_btm.png -rotate 180 -write mpr:edge_btm +delete \
          \
          mpr:image -alpha set -bordercolor none \
          -compose Dst -frame 25x25+25  -compose over \
          \
          -tile mpr:edge_btm \
          -transverse -draw 'color 1,0 floodfill' \
          -transpose  -draw 'color 1,0 floodfill' \
          -tile mpr:edge_top \
          -transverse -draw 'color 1,0 floodfill' \
          -transpose  -draw 'color 1,0 floodfill' \
          \
          mpr:image -gravity center -composite    frame_gold.png
[IM Output]
如您所見,我們仍然有一個問題,由於平鋪導致的對角鏡像效應,它在左上角和右下角看起來非常不自然。要解決此問題,我们需要添加一个随机的「-tile-offset」,以便消除此镜像效果。
在 IM 版本 6.3.9-9 之前,平鋪偏移設置已損壞,因為「X」偏移量已同時用於「X」和「Y」偏移量值(給定的「Y」值被忽略)。這意味著在舊版本的 IM 中,上面的示例可能會錯誤地平鋪底部和右側邊緣。
腳本版本這需要使用最後一個示例作為模板進行重寫您當然可以在單個命令中完成上述所有操作。但是,讓我們以腳本化的方式來做。此版本使用一些內聯代碼,使用簡單變形和一些隨機化的圖像滾動從提供的基本圖像生成適當的邊緣圖像,以改善整體外觀的平鋪圖像。可以根據提供的邊緣框架圖像的類型調整這些。然後使用內存平鋪圖像技術對處理後的邊緣圖像進行平鋪,並使用框架模板(生成)對這些圖像進行遮罩,就像我們上面所做的那樣。

  image=thumbnail.gif
     image_w=`magick $image -format %w info:`
     image_h=`magick $image -format %h info:`

  top=goldthin_top.png
  btm=goldthin_btm.png

     width=`magick $top -format %h info:`
     length=`magick $top -format %w info:`

  # Size of the new image ( using BASH integer maths)
  new_size=$(($image_w+$width*2))x$(($image_h+$width*2))

  # IM options to read a 'randomly rolled' version for the edge pieces
  lft="( $top -roll +$(($RANDOM % $length))+0  -transpose )"
  rht="( $btm -roll +$(($RANDOM % $length))+0  -transpose )"

  # IM options to 'randomly rolled' the top and bottom pieces
  top="( $top -roll +$(($RANDOM % $length))+0 )"
  btm="( $btm -roll +$(($RANDOM % $length))+0 )"

  # Frame the image in a single IM command....
  magick -page +$width+$width  $image  +page -alpha set \
    \( +clone -compose Dst -bordercolor none -frame ${width}x$width+$width \
       -fill none -draw "matte 0,0 replace" \
          -flip   -draw "matte 0,0 replace"   -flip \) \
    \( $top $btm -append -background none -splice 0x${image_h}+0+$width \
       -write mpr:horz +delete -size $new_size tile:mpr:horz +size \
       -clone 1  -compose DstOut -composite \) \
    \( $lft $rht +append -background none -splice ${image_w}x0+$width+0 \
       -write mpr:vert +delete -size $new_size tile:mpr:vert +size \
       -clone 1  -compose DstIn -composite \) \
    -delete 1  -compose Over  -mosaic   framed_script.png
[IM Output]
這樣我們就得到了一個邊框完美的圖像,它具有 45 度角的接合處,以及隨機的平鋪偏移。是的,這是一個複雜的例子。但這是為了允許使用記憶體圖塊影像,以便我們可以在單一指令中預先處理邊框影像。這使得它更加複雜,但也更加通用。以上程式碼已被建置到一個 shell 腳本中,您可以從IM 範例腳本目錄下載(「frame_edges.tar.gz」)。這個 tar 檔案包含腳本和一組邊框影像,腳本知道如何處理和使用它們。它還在邊框和影像本體之間添加了「紙板」邊界。

未來範例

使用具有匹配角片的平鋪邊緣。邊緣影像需要與預先準備好的角片相匹配,但也需要在影像的固定長度上整齊地平鋪。這意味著整個平鋪邊緣可能需要進行一些拉伸或壓縮,以便將邊緣圖塊與其角片對齊。為了正常工作,邊緣圖塊必須在最小影像邊緣上至少重複 3 或 4 次。這種平鋪邊緣/角落的一個例子是「樹葉」或「花卉」效果邊框的實現。