ImageMagick 範例 --
進階技巧

索引
ImageMagick 範例 前言和索引
   從形狀製作 3D 子彈    使用腳本產生大量的圖片
色彩著色和塑造 3D 灰階陰影圖像
製作 3D 標誌 使用透明覆蓋圖為基本形狀圖像著色
反射 新增多種類型的表面反射
拼圖碎片 從照片中裁剪和增強形狀奇特的碎片
「凝膠」效果 調整亮點的大小、亮度和清晰度
使用「濾色」和「乘算」合成來進行明暗調整
「水波」效果 使用「曲線」調整亮點
可平鋪的星星和彗星 隨機點
「我的天啊!到處都是星星!-- 2001 太空漫遊」
徑向光暈 圍繞中心點產生隨機的光線和環
本頁面提供了一些非常大的範例,我們在這些範例中使用多種技術來產生一些複合圖像處理效果,這些效果超出了 IM 的基本圖像操作。主要技術總結在上面的索引中。雖然其他頁面也提供了許多技術,例如建立字體模板、為圖像添加花式標籤以及使用遮罩,但這些頁面展示了如何將這些技術組合在一起以產生更複雜的效果。

從形狀製作 3D 子彈 -- 腳本化方法

網上有很多「子彈」圖像可以用於您的網頁清單。但您可以產生自己的 3D 物件,並讓您的整個網站符合將其聯繫在一起的特定風格。實現此目的的最佳方法之一是建立一個「生成」腳本,讓您可以自動生成一系列具有特定風格的按鈕和形狀,但可以使用您需要的任何顏色。這是一個非常簡單的腳本。在這裡,我們使用「-shade」選項從普通的形狀透明圖像生成 3D 外觀的物件。該形狀只有開/關透明度,並且經過仔細保留,使其可以用作網頁上通用的透明 GIF 圖像。然後使用「-tint」運算符對生成的灰階「陰影」圖像進行著色,以設定圖像的中间調灰色,同時保留更極端的黑白陰影。之後,將提供的圖像的原始形狀重新添加到著色結果中。此外,如果輸入圖像只有布林透明度,則結果還具有適合 GIF 格式圖像的布林透明度。

    magick {input_image} -alpha set \
            \( +clone -channel A -separate +channel \
               -bordercolor black -border 5  -blur 0x2 -shade 120x30 \
               -normalize -blur 0x1 -fill {color} -tint 100 \) \
            -gravity center -compose Atop -composite \
            {output_image}
請注意,輸入圖像在上面的腳本中只讀取一次。這也允許您使用「-」作為輸入和輸出文件名(可能還有一些 IM 圖像格式設定),在命令管道中使用腳本。這在編寫自己的 IM 腳本時非常重要。上面的命令被寫入一個非常簡單的 shell 腳本中,稱為「create_bullet」,並且執行了以下命令來生成許多不同顏色的各種符號圖像。

    magick +antialias -size 15x15 xc:none -draw 'circle 7,7 3,3'  ball.gif
    create_bullet ball.gif  grey    ball_grey.gif
    create_bullet ball.gif  red     ball_red.gif
    create_bullet ball.gif  green   ball_green.gif
    create_bullet ball.gif  blue    ball_blue.gif
    create_bullet ball.gif  yellow  ball_yellow.gif
    create_bullet ball.gif  maroon  ball_maroon.gif
    create_bullet ball.gif  cyan    ball_cyan.gif

    magick -size 12x12 xc:black   square.gif
    create_bullet square.gif  grey    square_grey.gif
    create_bullet square.gif  red     square_red.gif
    create_bullet square.gif  green   square_green.gif
    create_bullet square.gif  blue    square_blue.gif
    create_bullet square.gif  yellow  square_yellow.gif
    create_bullet square.gif  maroon  square_maroon.gif
    create_bullet square.gif  cyan    square_cyan.gif

    # retrieve asterix symbol from
    # Anthony's Web Images, Symbols
    create_bullet asterix.gif  grey    asterix_grey.gif
    create_bullet asterix.gif  red     asterix_red.gif
    create_bullet asterix.gif  green   asterix_green.gif
    create_bullet asterix.gif  blue    asterix_blue.gif
    create_bullet asterix.gif  yellow  asterix_yellow.gif
    create_bullet asterix.gif  maroon  asterix_maroon.gif
    create_bullet asterix.gif  cyan    asterix_cyan.gif

    # Use a heart symbol from "WebDings" font (22 point => 16x16 pixel image)
    magick -font WebDings -pointsize 22 -background none \
            label:Y -trim +repage    heart.png
    create_bullet heart.png  grey    heart_grey.png
    create_bullet heart.png  red     heart_red.png
    create_bullet heart.png  green   heart_green.png
    create_bullet heart.png  blue    heart_blue.png
    create_bullet heart.png  yellow  heart_yellow.png
    create_bullet heart.png  maroon  heart_maroon.png
    create_bullet heart.png  cyan    heart_cyan.png
[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] ==> [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]
在產生項目符號時,僅使用來源圖片的形狀或透明度,因此可以使用任何形狀。請選擇您網站專屬的獨特形狀。另請注意,可以使用 GIF 或 PNG 格式,並使用或不使用透明度來定義形狀。指令不會區分這些。如果您使用的圖片比這裡顯示的更大,您可能還想增加在陰影操作之前應用的模糊量。否則,您可能會發現只有靠近圖片邊緣的區域才會變圓。此外,多次模糊可能比使用較大的模糊值更好(以提高模糊速度)。當然,如果您有任何改進或其他想法,請告訴我,以便我們可以與他人分享。

製作 3D 標誌

在此範例中,我們有一個扁平彩色標誌,形狀複雜,我們希望對其進行影像處理,使其具有獨特的 3D 外觀。為此,我們使用標誌生成高光和陰影,並將其魔術般地轉換為透明度,以覆蓋在原始影像上。它逐步使用了與所有範例頁面完全不同的技術來實現此效果。此範例大量使用了陰影運算子和各種Alpha 合成方法生成的影像。我建議您在繼續之前先熟悉這些影像運算子,或者在您希望更好地理解正在發生的事情時查閱它們。
然而,在我们開始之前,我們需要一個簡單的標誌來應用我們的技術,以及它的遮罩... 讓我們先為標誌範例的彩色背景創建一個形狀...

  magick -size 170x100 xc:black \
          -fill white -draw 'circle    50,50  13,50' \
                      -draw 'circle   120,50 157,50' \
                      -draw 'rectangle 50,13 120,87' \
          -fill black -draw 'circle    50,50  25,50' \
                      -draw 'circle   120,50 145,50' \
                      -draw 'rectangle 50,25 120,75' \
          -fill white -draw 'circle    60,50  40,50' \
                      -draw 'circle   110,50 130,50' \
                      -draw 'rectangle 60,30 110,70' \
          -gaussian 1x1 -alpha off logo_mask.png
[IM Output]
現在,我們使用遮罩切出標誌的純色,並添加一些文字以生成一個簡單的純色標誌。

  magick logo_mask.png -background red -alpha shape \
          -font Candice  -pointsize 36  -fill white  -stroke black \
          -gravity Center  -annotate 0 "Ant" \
          logo.png
[IM Output]

現在,讓我們使用覆蓋高光技術為其賦予 3D 外觀。

  magick logo.png  -alpha extract -blur 0x6  -shade 110x30  -normalize \
          logo.png  -compose Overlay -composite \
          logo.png  -alpha on  -compose Dst_In  -composite \
          logo_3D.png
[IM Output]
由於 IM 提供了新的陰影生成運算子,添加陰影也更容易了。

  magick logo_3D.png \( +clone -background navy -shadow 80x4+6+6 \) +swap \
          -background none  -layers merge +repage logo_3D_shadowed.png
[IM Output]
最後,讓我們將標誌覆蓋在「粗糙紙張」般的背景上,這很有趣。還可以創建大量其他背景畫布,請參閱背景範例以獲取此類範例的集合。


magick logo_3D_shadowed.png \ \( +clone +repage -alpha off -fx 'rand()' -shade 120x30 \ -fill grey70 -colorize 60 \ -fill lavender -tint 100 \) \ +swap -composite logo_3D_bg.jpg
[IM Output]

反射

反射相對容易做到,但通常看起來並不像。您必須處理諸如表面顏色和紋理之類的方面,以及任何此類效果如何隨著表面反射與被該表面反射的物體之間的距離而增加。基本上,一件相對簡單的事情很快就會變得相當複雜。[IM 輸出] 因此,讓我們從一個相對簡單的影像的反射開始,在這種情況下,是一個寶神奇蹟寶貝角色,瑪力露麗(見右)。如果您願意,可以用您自己的影像替換。現在,要製作完美鏡子的反射,您只需複製和翻轉源物體,並在其後面添加一些背景以賦予其一些環境。例如...

  magick pokemon.gif \( +clone -flip \) -append \
          -size 100x100 xc:black +swap \
          -gravity North -geometry +0+5 -composite  reflect_perfect.png
[IM Output]

表面顏色 - 常規衰減

上面需要注意的是,反射是完美的,看起來並不像是黑色表面的反射。它更像是原始影像的「鏡面」,這也是事實。即使是普通的浴室鏡子也不會反射照射到它上面的所有光線,而且它是您可以獲得的最好的鏡子。所以反射的第一條規則是...
反射永遠不會完美。
所有的反射都不可能是 100% 的反射,因此會受到表面(或周圍環境)的影響而產生顏色變化。這是一個不完美的世界,而反射則能很好地增強和展現這些不完美之處。因此,讓我們再次嘗試,但這次讓我們根據反射表面的顏色為反射著色。您可以通過兩種方式做到這一點。最簡單的方法是簡單地使用 著色 將反射顏色調整為與表面相同的顏色。著色量取決於表面的反射效果,對於彩色表面,通常效果很差,因此需要添加大量的顏色,對於黑色表面來說,"65%" 就相當不錯。

  magick pokemon.gif \
      \( +clone -flip -fill black -colorize 65% \) -append \
      -size 100x100 xc:black +swap \
      -gravity North -geometry +0+5 -composite  reflect_colored.png
[IM Output]
好多了... 現在它看起來真的像一個反射!讓反射變弱的另一種方法是使反射圖像呈現半透明或透明狀態。例如,將圖像的 Alpha 值相乘,使源物件的可見度僅為 35% 左右。

  magick pokemon.gif -alpha on \
      \( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \
      -size 100x100 xc:black +swap \
      -gravity North -geometry +0+5 -composite  reflect_alpha.png
[IM Output]
實際上,這種方法更可取,因為這意味著表面的顏色可以是任何顏色,甚至可以是某種類型的顏色紋理或圖案。例如,讓我們使用 觀看遙遠的地平線 中的無限平鋪技術來生成水平木地板。

  magick tile_wood.gif   -set option:distort:viewport 100x100 \
          -virtual-pixel tile     -distort Perspective \
                '0,0 -20,65  96,0 60,40  96,96 120,55  0,96 50,99' \
          wooden_floor.png
[IM Output]
現在將我們的圖像及其半透明反射疊加到這個木地板上。

  magick pokemon.gif -alpha on \
      \( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \
      wooden_floor.png +swap \
      -gravity North -geometry +0+5 -composite  reflect_wood.png
[IM Output]
沒有反射物體的木質表面看起來相當呆板和毫無生氣,但有一些物體反射在上面,地板突然有了一種非常高度拋光的外觀!

扭曲的來源

好的。讓我們嘗試一些更花哨的東西,給圖像添加一些 3D 透視 深度。

  magick pokemon.gif -alpha on   -virtual-pixel transparent \
      +distort Perspective '0,0 0,0  0,64 0,64  64,0 54,10  64,64 54,54' \
      \( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \
      +filter  -size 100x100 xc:black +swap \
      -gravity North -geometry +0+5 -composite  reflect_distort_bad.png
[IM Output]
這顯然是錯誤的。看起來圖像被扭曲了,但在原始使用者看來仍然是平坦的。為什麼會這樣呢?因為...
與表面接觸的物體也會與其反射接觸。
這看起來很明顯,但我見過有人犯了這個錯誤。當然,如果物體漂浮在表面之上,那麼它們就不會接觸。解決這個問題的一個方法是在 圖層合併 結果之前,分別扭曲源圖像和該圖像的反射。

  magick pokemon.gif -alpha on   -virtual-pixel transparent \
      \( -clone 0 \
         +distort Perspective '0,0,0,0  0,64,0,64  64,0,54,10  64,64,54,54' \) \
      \( -clone 0  -channel A -evaluate multiply .35 +channel \
         +distort Perspective '0,0,0,128  0,64,0,64  64,0,54,98  64,64,54,54' \
      \) -delete 0 +swap -background none  -layers merge \
      +filter  -size 100x100 xc:black +swap \
      -gravity North -geometry +0+5 -composite  reflect_distort_sep.png
[IM Output]
從截然不同的失真參數集可以看出,扭曲反射可能會非常困難。更困難的是,對第一次失真的簡單更改需要對反射圖像的第二次失真進行計算更改。還有兩條規則可以告訴您如何計算反射失真的坐標。
水平面上的反射始終是垂直向下的。
也就是說,反射始終朝向使用者,而作為使用者的您正對著圖像,這意味著水平面上的任何反射都將向下,直接朝向使用者。這是物理定律,如果您希望您的圖像至少是半逼真的,那麼這一點是您不希望違反的。最後,您應該記住另一條規則。
水平面中反射的垂直表面
反射的高度與反射物體的高度相同
無論物體在圖像中看起來有多「遠」,其在最終圖像中的反射高度都應與被反射物體的高度相同!這一點並不明顯,而且很容易出錯。

這三條規則意味著,反射坐標的 X 值保持不變,而 Y 值則圍繞「表面接觸點」向下翻轉,翻轉的量與其在該點上方的高度相同。

因此,您可以謹慎地根據扭曲來源圖像的坐標來計算反射的扭曲坐標。現在,這些規則也為我們提供了一種可以簡化扭曲圖像反射的方法。只需先將反射附加到來源圖像,然後像沒有附加反射一樣扭曲來源圖像,讓其反射隨著主圖像一起扭曲...

  magick pokemon.gif -alpha on   -virtual-pixel transparent \
      \( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \
      +distort Perspective '0,0,0,0  0,64,0,64  64,0,54,10  64,64,54,54' \
      -gravity North  -crop 100x100+0-5\! \
      -background black -compose Over -flatten    reflect_distort.png
[IM Output]
如您所見,這樣做更容易,而且您只需要處理對象的一組扭曲,也使更改變得更加簡單。它還允許您使用原本無法重複的扭曲來創建單獨的反射。例如,從圖像生成 3D 圓弧...

  magick pokemon.gif -alpha on   -virtual-pixel transparent \
      \( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \
      +distort Barrel '0,0,0,1  0,0,-.35,1.5  32,32' \
      -gravity North  -crop 100x100+0-5\! \
      -background black -compose Over -flatten    reflect_3Darc.png
[IM Output]
在我們進入下一節之前,最後一點...陰影通常遵循與反射相同的規則,但最後兩條規則除外。它們可能不會直接向下,而是指向遠離光源的方向(對於遙遠的光源,則平行)。此外,它們與「表面接觸點」的距離也不相同,但它們的距離比例相同,只是不像反射那樣是 1:1 的比例。

漸變衰減

到目前為止,我們處理的是完美光滑的反射表面,但大多數表面都沒有拋光到鏡面光澤。看似光滑的表面在較小的尺度上實際上並不光滑,這反過來又會影響從這種表面反射的光線。這種效應也會隨著反射光在物體和反射點之間傳播距離的增加而增強。因此...
反射變得越弱,扭曲程度越高,
它離來源圖像越遠。
創建距離效應的最簡單方法是使反射離表面越遠越弱。為此,通常可以使反射在靠近圖像的地方稍微亮一點。

  magick pokemon.gif -alpha on \
      \( +clone -flip \
         -size 64x28 gradient:gray40-black   \
         -alpha off -compose CopyOpacity -composite \
      \) -append \
      -gravity North  -crop 100x100+0-5\! \
      -background black -compose Over -flatten    reflect_attenuated.png
[IM Output]
這種方法效果很好,而且生成起來非常容易,因此是一種相當普遍的生成反射的方法。該技術之所以有效,是因為被反射的光線中有很大一部分不是完美的反射,而是更多地反映了全局環境。您離原始圖像越遠,反射的原始圖像就越少。

模糊衰減

構成源對象真實反射的組件不會僅僅隨著距離的增加而變弱。實際上,反射會隨著距離的增加而變得更加模糊、模糊和扭曲,因為反射表面通常不是很光滑。這不是宏觀扭曲,而是非常小的微觀層面的扭曲。產生鏡面反射照明的相同效果。也就是說,靠近反射源的地方,它們可以相當清晰,但離光源越遠,圖像就越模糊。在 IM 6.5.5-0 版本之前,這是很難實現的(可以實現,但需要很多技巧)。但是現在您可以使用可變模糊貼圖根據反射與來源圖像的距離輕鬆地模糊反射。但是,為此,最好在對象周圍添加一個透明邊框,以便在其中進行模糊。在這些示例中,我擴展了最終圖像,以便您可以看到整個反射,從而了解其效果。

  magick pokemon.gif -alpha on \
      -background None -gravity South -extent 100x100 \
      \( +clone -flip -channel A -evaluate multiply .35 +channel \
         -size 100x100 gradient:gray5-white \
         -compose Blur -set option:compose:args 10 -composite -compose Over \
      \) -append -trim +repage \
      -gravity North  -crop 100x140+0-5\! \
      -background black -compose Over -flatten    reflect_blurred.png
[IM Output]
通過使用垂直拉伸的模糊橢圓,可以進一步增強反射模糊。例如,使用“10x30”的橢圓模糊參數,而不是簡單的“20”圓形模糊。如果然後將“模糊衰減”與“漸變衰減”相結合,您將開始獲得非常逼真的典型非拋光但光滑表面反射。

  magick pokemon.gif -alpha on \
      -background None -gravity South -extent 100x100 \
      \( +clone -flip \
         \( -size 100x64 gradient:'rgba(0,0,0,0.6)-none' \
            -size 100x36 xc:none  -append \
         \) -compose Dst_In -composite \
         \( -size 100x100 gradient:gray5-white \
         \) -compose Blur -set option:compose:args 4x8 -composite \
      \) -append -trim +repage \
      -gravity North  -crop 100x140+0-5\! \
      -background black -compose Over -flatten    reflect_blur_atten.png
[IM Output]
您很難獲得比這更好的平面反射圖像。
Future: To add examples of...
  Surface Texture effects
    frosted - or non smooth surfaces (small scale randomised distortions)
    rippled - water reflections
        (very little blur or attenuation, just stronger macro distortion)

拼圖碎片

我被要求協助處理過最有趣的事情之一,是從一張較大的圖片中裁剪並增強一個形狀奇特的「拼圖」碎片。事實上,Theo van Hoesel,也被稱為「拼圖先生」,想要產生許多獨立的碎片,並以許多不同的旋轉角度呈現。以下是由於我們的討論而為單一片段開發的,但使用正確的模板集,可以產生任何圖案的碎片。
右側是一個縮略圖,鏈接到一張 800x600 像素的德國柏林猶太大屠殺紀念館的照片。這張照片是我在 2006 年 4 月的歐洲之旅中拍攝的。看起來這張照片很適合製作一個非常困難的拼圖遊戲。下方是我要從上述圖片中提取的拼圖碎片的模板圖片。它是此類圖片集的一部分。完整的拼圖碎片集包含 192 個這樣的遮罩,以 16 x 12 的陣列排列,包括邊緣和角落。這個特定的拼圖碎片是一個 100x100 像素的遮罩,設計用於在 800x600 像素的圖片 上以 +365+96 的偏移量 使用。這些數字只有在您擁有一組可以組合在一起的不同碎片時才重要。如果您不打算這樣做,那麼當然可以使用任何您喜歡的偏移量。   [photo]
[IM Output]
我自己收集了一些這樣的拼圖集,這讓我可以製作任何圖片的拼圖。而這正是 Theo van Hoesel 在他的 網站 上實際做的事情。如果您正在製作一個實際的拼圖遊戲,那麼偏移量信息非常重要,因為它可以識別該碎片在原始圖片中的位置和放置方式。因此,我將嘗試保留這些信息。請注意,遮罩的偏移量在某些情況下可能是負數,因為形狀周圍有額外的填充,因此您可能需要測試和調整圖片命令來處理這種情況。額外的填充本身將使您能夠輕鬆地旋轉、添加厚度和陰影效果到最終的圖片,而無需更改剪切拼圖碎片的大小或偏移量。
然而,首先讓我們將這個模板變成一個輪廓。

    magick jigsaw_tmpl.png -edge .5 -blur 0x.5 jigsaw_edge.png
[IM Output]
然後我可以將其疊加到圖片上,以大致了解將要剪切哪些內容以形成拼圖碎片。

    magick holocaust_md.jpg \
            \( jigsaw_edge.png -negate \) -geometry +365+96 \
            -compose multiply -composite \
            -crop 100x100+365+96 +repage jigsaw_outline.png
[IM Output]
通常在生成拼圖時不會這樣做,但在碎片的位置不重要時(因為它不是較大拼圖的一部分),這樣做很有用。如果是這樣,您可以調整偏移量以選擇該拼圖碎片的更好內容。
由於「-edge」的工作方式,上面生成的拼圖輪廓位於遮罩(白色)區域遮罩圖片的內部。如果您想稍後使用此輪廓,這一點可能很重要。
好的,我們現在有一個拼圖形狀,以及要剪切的碎片的偏移量。讓我們將其剪切出來並旋轉它。

    magick holocaust_md.jpg \
            -crop 100x100+365+96\! -background none -flatten +repage \
            \( jigsaw_tmpl.png -alpha off \) -compose CopyOpacity -composite \
            -rotate -20 -gravity center -crop 100x100+0+0 +repage \
            jigsaw_cutout.png
[IM Output]
請注意,我們已將原始影像裁剪到範本形狀涵蓋的區域。我們不需要遮罩外的區域,及早移除它可以加快影像處理速度。另請注意,這裡特別使用了 視口裁剪,然後使用「-flatten」。這種裁剪方法可以確保我們一定能從中「裁切」出範本的 100x100 像素影像,即使使用邊緣或角落拼圖塊的遮罩也一樣,並且也能處理影像頂部或左側邊緣或附近的拼圖塊的負偏移量。旋轉也是在這個階段執行,因為大多數增強功能都會根據特定方向添加效果。旋轉的結果也會進行中心裁剪,因為此運算子通常會根據使用的旋轉角度來擴展產生的影像大小,而我們不希望它這樣做。第一個增強功能是在拼圖塊邊緣周圍添加略微斜角或圓角的高光。這是根據 陰影高光疊加 完成的,它允許對高光的產生方式進行精細控制(4 個獨立因素)。

   magick jigsaw_cutout.png \
           \( +clone -channel A -separate +channel -negate \
              -background black -virtual-pixel background \
              -blur 0x2 -shade 120x21.78 -contrast-stretch 0% \
              +sigmoidal-contrast 7x50%  -fill grey50 -colorize 10% \
              +clone +swap -compose overlay -composite \) \
          -compose In -composite jigsaw_bevel.png
[IM Output]
在真實的拼圖中,這種斜角是機器沖壓切割拼圖塊造成的結果。它還會使拼圖塊略微凹陷,因此如果將拼圖塊重新組合在一起,您仍然可以看到切割的痕跡。現在讓我們為拼圖塊添加一些厚度。這是我找到的最好、最快的方法,但我認為這並不是一種很好的技術。如果您能找到更好的方法,請告訴我。

   magick jigsaw_bevel.png \
           \( +clone -fill DarkSlateGrey -colorize 100% -repage +0+1 \) \
           \( +clone -repage +1+2 \)  \( +clone -repage +1+3 \) \
           \( +clone -repage +2+4 \)  \( +clone -repage +2+5 \) \
          -background none -compose DstOver -flatten \
          jigsaw_thickness.png
[IM Output]
最後,讓我們來添加一些陰影。

    magick jigsaw_thickness.png \
            \( +clone   -background Black -shadow 50x3+4+4 \) \
            -background none -compose DstOver -flatten \
            jigsaw_shadow.png
[IM Output]
以上所有命令都可以輕鬆儲存到單個 Shell 腳本中,我自己也這樣做。腳本「jigsaw」將使用三個影像參數:來源照片、範本和目標,以及眾多選項來啟用上述各種增強功能。它不需要使用拼圖形狀。任何遮罩範本都可以用於裁切影像的部分,並添加適當的效果。上述方法與我的腳本版本之間最大的區別在於,預設情況下,腳本會在跟踪裁切影像偏移量的同時,儘可能地縮小最終影像的大小。通過保留此偏移位置,您可以使用簡單的「-mosaic」或「-flatten」將多個拼圖塊疊加在一起,以產生有趣的效果(請參閱下面的最後一個示例)。以下是一些以多種方式使用此腳本的示例。

    jigsaw -o +365+96 -m  null: jigsaw_tmpl.png  jigsaw_mask.png
    magick -size 800x600 xc:gray miff:- |\
                 jigsaw -r 30 -l -h -s miff:- jigsaw_mask.png jigsaw_grey.png
    jigsaw -r -60 -h -t 4 -s holocaust_md.jpg jigsaw_mask.png jigsaw_piece.png

    magick jigsaw_cnr.png -resize 50% -flip -flop -repage 120x90 \
            -background black -flatten -flip -flop jigsaw_cnr_tmpl.png
    jigsaw -t 3 -s  -r 15  -d +15+7 \
            holocaust_tn.gif jigsaw_cnr_tmpl.png   holocaust_piece_tn.png
    magick jigsaw_cnr_tmpl.png -negate png:- |\
      jigsaw -t 3 -s holocaust_tn.gif png:-   holocaust_puzzle_tn.png
    magick holocaust_puzzle_tn.png  holocaust_piece_tn.png \
            -background none  -mosaic    holocaust_jigsaw_tn.png
[IM Output] ==> [IM Output] [IM Output]
[IM Output] ==> [IM Output] ==> [IM Output] [IM Output] ==> [IM Output]
最後一張影像是一個可能的拼圖縮圖樣式的開頭... 它使用一個角落拼圖塊,並通過一些縮放和擴展將遮罩轉換為全尺寸的影像範本遮罩。然後,這不僅用於從現有縮圖中裁切出角落拼圖塊,還用於否定以產生影像的其餘部分。將這兩張影像疊加在一起,就可以製作出相當精緻的拼圖縮圖。請注意在拼圖塊創建選項中使用了「-d +15+7」。這會相對於生成 PNG 影像在影像中的原始位置,將其「頁面偏移量」稍微偏移,從而簡單輕鬆地產生顯示的結果。有關可用選項,請參閱腳本本身。
由於生成的頁面偏移量可能為負數,並且可能包含可選的柔邊陰影效果,因此建議僅對提取的拼圖塊使用 PNG 影像。GIF 影像無法處理負頁面偏移量或陰影效果,並且在涉及透明度時也不會產生平滑的抗鋸齒邊緣。

一般來說,除了最終影像之外,您應該避免使用 GIF(和 JPEG)影像。有關更多信息,請參閱 常用影像格式 示例頁面。
您不限於使用拼圖範本,任何形狀的遮罩都可以用於任何影像。我很想知道您想出了什麼。我還沒有完全完成 "jigsaw" 腳本的開發,因為我想要一些更好的控件來控制高亮、厚度和陰影效果,並且可能還需要一個「反轉遮罩」選項。不過,它基本上是一個完整的可用程式,您可以自由使用。如果您將其用於網頁,請提供回鏈 :-) 對於一些具有 PerlMagick API 技能的人,請嘗試使用上述腳本並將其轉換為 PerlMagick 以提高速度,然後將其提交給我,以便其他人也可以使用它,並了解您在使用 IM 方面的出色程度。歡迎隨時提出進一步的建議和想法。
如果您只想使用一組遮罩(使用或不使用虛擬像素偏移)從影像中剪切出所有片段,則以下命令將讓您非常快速地完成所有這些操作。

  magick mask_*.png -set filename:mask %t -alpha shape \
          null: image.jpg -compose In -layers composite \
          pieces_%[filename:mask].png
每個其他生成的 "pieces_mask_*.png" 影像不僅包含來自原始影像的適當影像(位於正確的偏移量處),而且還在最終影像中保留了該偏移量。它使用 多層合成 將特殊 "null:" 標記影像左側的所有影像與右側的單個影像合併來實現此目的。作為額外的好處,它會將使用的遮罩檔名(包括其最終影像檔案格式)合併到片段影像檔名中,從而更容易識別哪個片段是什麼。(有關詳細資訊,請參閱 檔名百分比轉義。請注意,遮罩不必完全覆蓋整個原始影像,但片段之間不應留有空格或間隙。當然,對於一個合適的拼圖,所有遮罩都應該正確 對齊,以便產生一個無縫的整體,如 Dst_Out 合成範例 中所示。

「凝膠」效果

上面使用的 3D 陰影只是您可以使用高亮和陰影效果實現的開始。通過對 "-shade" 輸出的各種直方圖調整,可以使用大量的可能性。您可以重現的一種此類效果稱為「凝膠」效果,例如經常在 "Photoshop 操作指南網站(Google 搜索「凝膠效果教程」)中看到的那樣。首先,讓我們創建我們需要的形狀。這可以是預先準備好的影像,也可以是從「裝飾」字體中提取的,就像我們對上面的 3D 子彈形「心形」所做的那樣。在這種情況下,讓我們使用一個簡單的橢圓形作為按鈕...

  magick -size 100x60 xc:none \
          -fill red -draw 'circle    25,30  10,30' \
                    -draw 'circle    75,30  90,30' \
                    -draw 'rectangle 25,15  75,45' \
          gel_shape.png
[IM Output]
現在,讓我們使用高度修改的模糊陰影操作將清晰的「凝膠」高亮添加到彩色形狀中...

    magick gel_shape.png \
            \( +clone -alpha extract  -blur 0x12  -shade 110x0 -normalize \
               -sigmoidal-contrast 16,60% -evaluate multiply .5 \
               -roll +5+10 +clone -compose Screen -composite \) \
            -compose In  -composite  gel_highlight.png
[IM Output]
我們將「-shade」應用於透明度(遮罩)通道的副本,並在模糊處理後將其圓潤化。Ths shade 使用沒有任何「高度」或「方位角」角度的光源,這基本上意味著我們只會得到模糊形狀一側的灰色高光,而其他所有內容都是黑色的。然後使用「-sigmoidal-contrast」運算符調整(銳化)此高光灰階,以減小高光區域(「60%」閾值級別)的大小並銳化其邊緣(使用非常高的「16」指數因子)。使用如此高的指數值,運算符的作用幾乎就像一個「模糊」的「-threshold」運算符,以基於原始圖像的形狀生成平坦的顏色區域。有關此平滑對比度/閾值函數的更多信息,請參閱Sigmoidal 非線性對比度。最後,使用「-evaluate」調整高光的級別,將所有顏色乘以所需的高光級別,然後使用「-roll」將其位置移動到形狀區域中。現在,由於高光在黑色上是灰色的(黑色保持不變),因此使用「Screen」alpha 合成來通過給定的灰度級別來照亮非黑色區域。現在剩下的就是稍微加深邊框……

    magick gel_highlight.png \
          \( +clone -alpha extract  -blur 0x2 -shade 0x90 -normalize \
             -blur 0x2  +level 60,100%  -alpha On \) \
          -compose Multiply  -composite  gel_border.png
[IM Output]
請注意,這次我使用垂直照明的「-shade」來進行邊緣變暗,這使得我要保留的區域保持不變的白色。因此,在使用反向級別調整調整灰階並恢復Alpha 提取方法保存的透明度後,我就可以使用「Multiply」alpha 合成來使受影響的邊框變暗。讓我們用一些文字和陰影效果來完成橢圓形「凝膠」按鈕……

    magick gel_border.png \
            -font Candice  -pointsize 24  -fill white  -stroke black \
            -gravity Center  -annotate 0 "Gel"  -trim -repage 0x0+4+4 \
            \( +clone -background navy -shadow 80x4+4+4 \) +swap \
            -background none  -flatten    gel_button.png
[IM Output]

「Aqua」或「泡泡」效果

您還可以調整完整的 3D「-shade」(具有 30 度照明)色調以產生「Aqua」水效果。然而,為此,我們需要以類似於使用「Gimp」和「Photoshop」等 GUI 圖形程序的方式進行直方圖調整。我將首先通過設置逐步執行此操作,以便您可以看到我正在執行的步驟。首先,讓我們創建一個要使用的圖像,在本例中是一個曲線字母 A。

  magick -background none -fill DodgerBlue \
          -font Candice -pointsize 72  label:A  -trim +repage \
          -bordercolor None -border 1x1 \
          aqua_shape.png
[IM Output]
請注意,我在圖像周圍添加了一個像素的透明邊框。這使得接下來的處理步驟更容易一些。現在,我們需要生成此形狀圖像的圓形陰影

  magick aqua_shape.png \
          -alpha Extract -blur 0x8  -shade 130x30 -alpha On \
          -background gray50 -alpha background -auto-level \
          aqua_shade.png
[IM Output]
處理Alpha 背景的有趣行是將透明區域的隱藏顏色重置為中間色調灰色,以便它不會影響顏色歸一化。這一點非常重要。現在,我們將陰影變成「光照效果」,看起來有點像光線被水或玻璃氣泡扭曲的方式。

  magick aqua_shade.png \
          -function polynomial  3.5,-5.05,2.05,0.3 \
          aqua_lighting.png
[IM Output]
多項式函數,用於圖像的曲線調整。正是這個函數產生了整體效果,並且可能難以確定。為此,我將此「曲線」所需的控制點傳遞給了名為「im_fx_curves」的 IM 支持 shell 腳本。然後,這將返回適合這些控制點的「曲線」的多項式方程的「係數」。

  im_fx_curves -c -p  0,30  100,80  50,50  80,50  > aqua_coeffs.txt
[Gnuplot] ==>
[Coeffs]
此光照效果的最終調整是使光照效果的邊緣更暗。

  magick aqua_lighting.png \
          \( +clone -alpha extract  -blur 0x2 \) \
          -channel RGB -compose multiply -composite \
          aqua_light+edge.png
[IM Output]
陰影疊加完成。剩下的就是使用HardLight 合成將其應用於原始圖像。

  magick aqua_shape.png aqua_light+edge.png \
          -compose Hardlight -composite   aqua_result.png
[IM Output]
請注意,結果圖像的最終整體顏色實際上是原始形狀的原始顏色。事實上,您甚至可以將其應用於多色圖像,而不會出現任何問題。因此,讓我們用一個命令重複上述所有步驟,包括初始形狀圖像的創建。

  magick -background none -fill DodgerBlue \
          -font Candice -pointsize 96  label:'Aqua Text' -trim +repage \
          \
          \( +clone -bordercolor None -border 1x1 \
             -alpha Extract -blur 0x8  -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 \
          \) \
          -compose Hardlight -composite  aqua_text.png
[IM Output]
如果您仔細研究上面的內容,您會發現之前概述的所有步驟都應用於生成光照圖像,然後將其合成到原始圖像上。

可拼接的星星和彗星

出於各種目的,我想製作一幅隨機星場的拼貼畫(星星的強度不同)。這是我在這個方向上不斷改進的結果。隨機雜訊圖像用於使其自身變薄,生成斑點圖案。

  magick -size 100x100 xc: +noise Random -channel R -threshold 5% \
          -negate -channel RG -separate +channel \
          -compose multiply -composite   speckles.gif
[IM Output]
此模式是閃光動畫效果的基礎,也是其他效果的起點。例如,為了製作星星,我們需要更多地修改其隨機“斑點”模式,以使事物更逼真。

  magick -size 100x100 xc: +noise Random -channel R -threshold 1% \
          -negate -channel RG -separate +channel \
          \( +clone \) -compose multiply -flatten \
          -virtual-pixel tile -blur 0x.4 -contrast-stretch .8% \
          stars.gif
[IM Output]
請注意,我 nejen vynásobím masku skvrn (kanál „R“), ale také obrázek intenzity hvězd (kanál „G“) dvakrát. Tím se vytvoří kvadratický pokles intenzity pixelů, takže je přítomno více tmavších hvězd než jasných, stejně jako na skutečné noční obloze. Poté zvětšíme velikost hvězd na základě jejich intenzity pomocí Rozostření. Tím se vytvoří efekt podobný hvězdám hořícím na fotografické desce astronomů, čímž se stane realističtější. Čím větší je hodnota rozostření, tím větší je efekt. Konečné "-contrast-stretch" vrátí výsledky zpět do viditelnosti. Použitím dvou obrázků náhodného šumu (jeden pro masku, druhý pro barvu hvězdy) můžeme generovat náhodně zbarvené hvězdy namísto jednoduchých šedých.

  magick -size 100x100 xc: +noise Random -channel R -threshold 1% \
          -negate -channel RG -separate +channel \
          \( xc: +noise Random \) -compose multiply -flatten \
          -virtual-pixel tile -blur 0x.4 -contrast-stretch .8% \
          stars_colored.gif
[IM Output]
To však může vyžadovat více práce, protože musíme umocnit intenzitu barev přímo, místo abychom je jen vynásobili lineárním rozložením. Nicméně to funguje a poskytuje to výchozí bod pro další vývoj. Všimněte si, že barva nemusí být náhodná, ale mohla by snadno pocházet z nějakého jiného obrázku pro hvězdy. Například barva hvězdy by mohla pocházet z obrázku, který bude použit jako konečné pozadí. Nyní, když mám generátor hvězdné krajiny, můžu jednoduše použít "-motion-blur" k vytvoření pole padajících hvězd!

  magick -size 100x100 xc: +noise Random -channel R -threshold .4% \
          -negate -channel RG -separate +channel \
          \( +clone \) -compose multiply -flatten \
          -virtual-pixel tile -blur 0x.4 -motion-blur 0x20+45 -normalize \
          star_fall.gif
[IM Output]
Samozřejmě chceme méně hvězd a menší „pokles“ v intenzitě hvězd. Pomocí Polárního zkreslení obrázku můžeme přimět komety létat nebo se spirálovitě stáčet do jednoho bodu!

  magick -size 250x100 xc: +noise Random -channel R -threshold .4% \
          -negate -channel RG -separate +channel \
          \( +clone \) -compose multiply -flatten \
          -virtual-pixel Tile -background Black \
          -blur 0x.6 -motion-blur 0x15-90 -normalize \
          +distort Polar 0 +repage  star_inward.gif
  magick -size 250x100 xc: +noise Random -channel R -threshold .4% \
          -negate -channel RG -separate +channel \
          \( +clone \) -compose multiply -flatten \
          -virtual-pixel Tile -background Black \
          -blur 0x.6 -motion-blur 0x15-60 -normalize \
          +distort Polar 0 +repage   star_spiral.gif
[IM Output]

[IM Output]
Zde jsme rozmazali pohybem hvězdy v šesti směrech (ve dvojicích) a poté je sloučili dohromady, abychom vytvořili pole „hvězdných záblesků“, jaké získáte v čočce skla.

  magick -size 100x100 xc: +noise Random -channel R -threshold .2% \
          -negate -channel RG -separate +channel \
          \( +clone \) -compose multiply -flatten \
          -virtual-pixel tile  -blur 0x.3 \
          \( -clone 0  -motion-blur 0x10+15  -motion-blur 0x10+195 \) \
          \( -clone 0  -motion-blur 0x10+75  -motion-blur 0x10+255 \) \
          \( -clone 0  -motion-blur 0x10-45  -motion-blur 0x10+135 \) \
          -compose screen -background black -flatten  -normalize \
          star_field.gif
[IM Output]
Všimněte si, jak tmavší hvězdy generují pouze malou tečku a velmi málo „hvězdného záblesku“, zatímco větší jasné hvězdy generují velmi velký „hvězdný záblesk“. Pokud nyní najdu způsob, jak přidat rozostření typu „sinc()“, abych vytvořil také „prstenec“ odlesku kolem nejjasnějších hvězd, budeme mít skvělý generátor hvězdného pole. Přidejte nějaké plazmové pozadí a můžeme dokonce generovat falešné astronomické fotografie mlhovin a plynových mračen. Kombinací výše uvedeného s animací plazmového třpytu můžete vytvořit sadu hvězd, které vypadají jako vánoční ozdoby.

  magick -size 100x100 xc: +noise Random -separate \
          null: \
            \( xc: +noise Random -separate -threshold 50% -negate \) \
            -compose CopyOpacity -layers composite \
          null: \
            plasma:red-firebrick plasma:red-firebrick plasma:red-firebrick \
            -compose Screen -layers composite \
          null:  \
            \( xc: +noise Random -channel R -threshold .08% \
              -negate -channel RG -separate +channel \
              \( +clone \) -compose multiply -flatten \
              -virtual-pixel tile  -blur 0x.4 \
              \( -clone 0  -motion-blur 0x15+90  -motion-blur 0x15-90 \) \
              \( -clone 0  -motion-blur 0x15+30  -motion-blur 0x15-150 \) \
              \( -clone 0  -motion-blur 0x15-30  -motion-blur 0x15+150 \) \
              -compose screen -background black -flatten  -normalize \) \
            -compose multiply -layers composite \
          -set delay 30 -loop 0 -layers Optimize       stars_xmas.gif
[IM Output]
Výše uvedená technika je jen začátkem toho, čeho lze dosáhnout. Pomocí některých jednoduchých animačních technik lze vytvořit třpytky a náhodné záblesky, které lze přidat k obrázkům. Jeden jednoduchý příklad byl uveden v příkladech animací GIF s použitím jednoduchého shellového skriptu "star_field" pro generování hvězdných záblesků. Co s tímto generátorem hvězd dokážete vy? Výzva:
  • 產生閃光而非星光。初始的斑點場應該用遮罩限制(例如透過相乘)。然後可以使用「濾色」合成將閃光和星光疊加到圖像上。
  • 使用遮罩的「斑點場」產生星爆以進行疊加。透過遮罩種子而不是完整的星爆,意味著星爆的「光線」可以離開遮罩區域以疊加到圖像的其他部分。也就是說,光線不會只是被「切斷」。
  • 建立隨機星爆的動畫。這可能需要您對單個星爆場進行 magick 動畫處理(也許是旋轉光線)。
  • 透過產生一些星爆動畫,您可以將它們合併在一起,形成一系列來自不同位置的重疊星爆。
  • 透過直方圖拉伸閾值,在圖像最亮的部分找到單個「種子」點。然後選擇單個像素,直到其中一個像素落在遮罩區域內。
  • 在平面陰影形狀的邊緣建立星星。
如果您完成了上述任何挑戰或將星形產生器用於其他目的,請告知我和 IM 社群的其他人。

徑向光暈

產生徑向光暈的實驗。請注意,極座標扭曲之前初始圖像的寬度基本上決定了將產生的光線數量。

  magick -size 100x1 xc: +noise Random -channel G -separate +channel \
          -scale 100x100\!                                +write flare_1a.png \
          \( -size 100x100 gradient:'gray(100%)' -sigmoidal-contrast 10x50% \) \
          -colorspace sRGB -compose hardlight -composite  +write flare_1b.png \
          -virtual-pixel HorizontalTileEdge -distort Polar -1 \
          flare_1_final.png
[IM Output] ==> [IM Output] ==> [IM Output]
請注意我如何使用「+write」儲存中間圖像以供顯示。這是一種除錯技術,在複雜圖像處理和除錯中有詳細說明。以下是另一個使用多個疊加來實現不同外觀光暈的範例。請注意用於產生中間除錯和範例圖像的技術,這些圖像顯示了所涉及的步驟。

  magick -size 100x1 xc: +noise Random -channel G -separate +channel \
          -size 100x99 xc:black -append -motion-blur 0x35-90 \
          \( -size 100x50 gradient:'gray(0)' \
             -evaluate cos .5 -sigmoidal-contrast 3,100% \
             -size 100x50 xc:'gray(0)' -append \) \
          \( -size 1x50 xc:'gray(0)' \
             -size 1x1 xc:'gray(50%)' \
             -size 1x49 xc:'gray(0)' \
             -append -blur 0x2 -scale 100x100\! \) \
          \
          -scene 10 +write flare_2%x.png \
          \
          -background 'gray(0)' -compose screen -flatten +write flare_2f.png \
          \
          -virtual-pixel HorizontalTileEdge -distort Polar -1 \
          -colorspace sRGB flare_2_final.png
[IM Output] [IM Output] [IM Output] ==> [IM Output] ==> [IM Output]
使用極座標扭曲產生光暈圖像的主要問題是,光線會隨著半徑變寬,而實際上我們希望它們隨著變暗而保持大致恆定的寬度,或者至少變細。歡迎提供想法和指教
顏色渲染在此類圖像中也很重要。例如,我在這裡將中間色調顏色渲染為藍色。

  magick flare_2_final.png  -fill SkyBlue  -tint 100%  flare_2_color.png
[IM Output]
用於「-tint」操作的百分比也可以用於調整光線和光暈環的強度,儘管它不會改變圖像白色核心的變化很大。這些範例在 IM 論壇討論使用徑向光暈作為遮罩中有更深入的探討。