作者:Anthony Thyssen,<A.Thyssen@griffith.edu.com>
標註 -- ImageMagick 範例 - ImageMagick 圖像庫

ImageMagick 範例 --
圖像標註

索引
ImageMagick 範例 前序與索引
標記圖像 (標記圖像的技巧)
圖像疊加 (將圖像疊加和合併在一起)
浮水印 (用於版權保護的標註)
文字和圖像定位方法
本文件介紹了使用文字或其他圖像標註大型圖像的各種方法。標註可以是醒目且清晰可見的,也可以是微妙且隱藏的。標註圖像的原因有很多,但通常是為了
  • 使用有關圖像內容的信息標記圖像。
  • 指出或突出顯示圖像的某些方面。
  • 將版權或徽標添加到圖像中作為一種版權保護形式。
ImageMagick 提供了許多方法來完成這些操作,但並非所有方法都能從手冊中輕鬆找到。本頁面嘗試介紹常用的方法。許多具體方法在其他範例頁面中有更詳細的討論。如果您對標註或添加 GIF 動畫浮水印感興趣,我建議您先瀏覽本文檔,然後跳轉到標註 GIF 動畫,以開始。

圖像標註

標記圖像的基本問題是如何使文字在任何圖像上都清晰可讀。以下顯示了許多方法,其中一些方法可以擴展以完成更複雜的任務。在這些範例中,我將自己限制在 ImageMagick 的默認字體中。鼓勵您使用適合您想要實現的效果的不同字體和字體大小。

在圖像下方(或上方)標記

從 IM v6.4.7-1 開始,現在可以附加帶有居中文本的標籤,因為圖像附加現在遵循重力設定以進行對齊。

  magick dragon.gif   -background Khaki  label:'Faerie Dragon' \
          -gravity Center -append    anno_label.jpg
[IM Output]
通過重新排序圖像,您可以將標籤附加在圖像上方。

  magick dragon.gif   -background Orange  label:'Faerie Dragon' \
          +swap  -gravity Center -append    anno_label2.jpg
[IM Output]
拼接和繪製是一種非常簡單的方法,可以為圖像添加額外空間,以便我們繪製/標註標籤到圖像中。

  magick dragon.gif \
          -gravity South   -background Plum   -splice 0x18 \
          -annotate +0+2 'Faerie Dragon'   anno_splice.gif
[IM Output]
同樣的方法也可以用於在圖像上方繪製標籤,只需將重力設定從「South」替換為「North」。很簡單!

  magick dragon.gif \
          -gravity North   -background YellowGreen  -splice 0x18 \
          -annotate +0+2 'Faerie Dragon'   anno_splice2.gif
[IM Output]
不再建議將「-draw」運算符直接用於在圖像上繪製,除非它是更複雜繪圖函數的一部分。有關其他文字繪製方法和技巧的更多詳細信息,請參閱文字到圖像處理部分。
使用蒙太奇標記 ImageMagick 中的蒙太奇命令經常被用戶忽視,因為它僅對創建整個圖像目錄的顯示有用。它確實提供了一種非常簡單的方法來為圖像添加標籤。

  montage -label "Faerie Dragon"  dragon.gif \
          -geometry +0+0 -background Gold anno_montage.jpg
[IM Output]
蒙太奇還可以為您的圖像添加邊框和其他元素,因此這種標記形式具有許多超出簡單圖像標記的額外可能性。

  montage -label "Faerie Dragon" dragon.gif \
          -font Candice -pointsize 15 \
          -frame 5  -geometry +0+0 anno_montage2.jpg
有關使用蒙太奇的更多信息,請參見蒙太奇,圖像陣列
[IM Output]
使用 Polaroid 標籤 另一個使用蒙太奇的方法,是使用 Polaroid 影像轉換,產生一個相當花俏的註釋影像。


magick -caption "Faerie Dragon" dragon.gif -gravity center \ -background black +polaroid anno_polaroid.png
警告:此影像會失真(彎曲和旋轉),並帶有一些隨機性,因此最終影像尺寸可能會有所不同,除非停用旋轉功能。它還包含複雜的陰影和透明效果,因此使用 PNG 格式影像來儲存結果影像。
[IM Output]
您可以使用「超級採樣」技術減少旋轉導致的結果影像中的「模糊」。請參閱 Polaroid 影像轉換 以取得範例。

在影像本身上方標籤...

直接在圖片上寫文字的問題是,您無法確定文字在您選擇的顏色中是否清晰可辨。繪製的影像可能是黑色、白色或彩虹色。
外框標籤:最簡單的方法是用外框繪製字串,將文字與影像分開。但是,由於「-stroke」字體設定會增加字體的內外粗細,從而降低其效果(如需更多資訊,請參閱 筆劃和筆劃寬度。繪製具有背景外框的字體的更好方法是繪製兩次文字。

  magick dragon.gif -gravity south \
          -stroke '#000C' -strokewidth 2 -annotate 0 'Faerie Dragon' \
          -stroke  none   -fill white    -annotate 0 'Faerie Dragon' \
          anno_outline.jpg
[IM Output]
如您所見,它有效,但效果不是很好。與預設的「Times」或「Arial」字體相比,它在較粗的字體上效果更好。如需此技術的更多詳細資訊,請參閱 粗筆劃複合字體
繪製暗框:使註釋文字更清晰可辨的更經典方法是在要添加文字的區域「變暗」影像,然後以相反的顏色繪製文字。例如...

  magick dragon.gif \
          -fill '#0008' -draw 'rectangle 5,128,114,145' \
          -fill white   -annotate +10+141 'Faerie Dragon' \
          anno_dim_draw.jpg
[IM Output]
此方法效果很好,但如您所見,我決定在此範例中不使用「-gravity」來放置文字,因為無法使用重力來定位變暗的矩形(這在未來可能會有所改變)。此外,其大小和位置可能取決於影像和最終文字大小,這可能需要一些額外的數學計算。
底色框:您可以讓 ImageMagick 在框上使用「底色」,而不是嘗試自己繪製背景框。請參閱 文字底色框。可以使用「-undercolor」選項在命令列上指定文字「底色」(如程式庫 API 中所使用)。

  magick dragon.gif  -fill white  -undercolor '#00000080'  -gravity South \
          -annotate +0+5 ' Faerie Dragon '     anno_undercolor.jpg
[IM Output]
如您所見,它比自己繪製暗框要簡單得多,但建議在繪製文字的開頭和結尾處多留一個空格,以便稍微填充框。
合成標籤:更理想的解決方案是事先準備好文字影像,然後將其作為影像覆蓋。在這裡,我們在半透明背景上建立一個簡單的標籤,並將其覆蓋。

  magick -background '#00000080' -fill white label:'Faerie Dragon' miff:- |\
    magick composite -gravity south -geometry +0+3 \
              -   dragon.gif   anno_composite.jpg
[IM Output]
最後一種技術具有一些明顯的優勢。可以調整暗框的大小以適應標籤,並且可以使用「-gravity」定位它,而無需了解要添加到的影像或正在使用的繪製字體的任何特定知識。
此外,您不僅限於使用簡單的暗框。相反,您可以準備非常複雜的字體影像,可以事先準備好,以便多次應用,也可以根據每個影像動態準備。幾乎所有 複合字體效果 樣式都可用於您,讓您能夠使文字添加非常出色且具有專業水準。自動調整大小的標題:從 IM v6.3.2 版開始,「caption:」現在可以自動調整文字大小以最佳地適應特定大小的框。
但要正確地將此用於覆蓋,您需要知道被註釋圖像的寬度。在這裡,我收集該信息,然後創建並覆蓋一個標題,以便文本自動調整大小以最佳地適應提供的空間,並進行自動換行。

  width=`identify -format %w dragon.gif`; \
  magick -background '#0008' -fill white -gravity center -size ${width}x30 \
          caption:"Faerie Dragons love hot apple pies\!" \
          dragon.gif +swap -gravity south -composite  anno_caption.jpg
[IM Output]
此技術非常適用於將圖像註釋覆蓋到圖像上,儘管在命令行上執行此操作有其自身的問題,因為您正在創建新圖像,而不是註釋舊圖像。有關此問題的解決方案,請參見用戶定義的選項轉義 花式標籤:作為最後一個示例,我將覆蓋使用花式柔和輪廓字體創建的文本字符串,以確保其保持可見,但不會為註釋創建矩形框。

  magick -size 100x14 xc:none -gravity center \
          -stroke black -strokewidth 2 -annotate 0 'Faerie Dragon' \
          -background none -shadow 100x3+0+0 +repage \
          -stroke none -fill white     -annotate 0 'Faerie Dragon' \
          dragon.gif  +swap -gravity south -geometry +0-3 \
          -composite  anno_fancy.jpg
[IM Output]
如果您計劃將相同的標籤(例如版權信息)合成到許多圖像上,則最好單獨生成您的標籤,並使用“mogrify”命令將該標籤合成到每個圖像上。以上示例中的“-geometry +0-3”偏移量用於將合成覆蓋定位在更靠近邊緣的位置,因為此圖像的柔和模糊輪廓通常比必要的更大。
當然,應根據您自己的要求調整上述所有示例。不要人云亦云,要敢於嘗試,並賦予您自己的網站或程序與眾不同的風格。更重要的是,將其告知 IM 社區。
FUTURE: select the black or white color based on the images relative
intensity.  This uses a number if very advanced techniques.

  magick input.jpg  -font myfont -pointsize 25 \
      \( +clone -resize 1x1  -fx 1-intensity -threshold 50% \
         -scale 32x32 -write mpr:color +delete \)  -tile mpr:color \
       -annotate +10+26 'My Text'              output.jpg

Explanation:  Copy of image is resized to 1 pixel to find the images
average color.  This is then inverted and greyscaled using -fx, then
thresholded to either black or white, (as appropriate).
This single color pixel is now scaled to a larger tiling image, and
saved into a named memory register (mpr:).

The image is then used to set the fill tile, for the annotated text.
Their is however no simple method (at this time) to set the outline -stroke
color of the draw text to its inverse.

Other techniques are to use some text as a 'negate image' mask, or even a color
burn or color dodge compose operation, to distort the image with the text.


圖像覆蓋

ImageMagick 中的“magick composite”命令和“-composite”圖像運算符提供了以各種方式將圖像放置在其他圖像之上的主要方法。這些方法的詳細信息在Alpha 合成示例頁面中給出。但是,還有更多更高級別的運算符也利用了圖像的 Alpha 合成。這些包括圖層,以及此示例頁面下方更遠處的使用重力定位圖像。合成的默認合成方法是“Over”,它只是將覆蓋圖像覆蓋到背景圖像上,並按預期處理透明度。背景圖像還決定結果的最終大小,而不管覆蓋放置在何處(使用“-geometry”選項)。覆蓋圖像是在中間、背景圖像的一半處還是很遠的地方都無關緊要,輸出圖像的大小與背景圖像的大小相同。圖像的幾何位置也受“-gravity”的影響,因此可以相對於九 (9) 個不同位置中的任何一個定義覆蓋圖像的位置。請參閱下面的“定位圖像和文本”。除了合成覆蓋的“-geometry”之外,單個圖像還可以具有頁面或畫布信息(使用“-page”和“-repage”選項設置),這些信息會影響圖像的最終位置。但是,此圖像特定信息不受“-gravity”的影響。繼續示例...覆蓋可能是最常見的圖像註釋形式,並且非常容易實現。在這裡,我在準備好的按鈕框架的中間覆蓋了一個 32x32 的城堡圖標。

  magick composite -gravity center  castle.gif  frame.gif  castle_button.gif
[IM Output]  + [IM Output] ==> [IM Output]
您還可以精確定位子圖像。在這裡,我們設置了一隻手來指出精靈龍的小爪子。

  magick composite -geometry +31+105  hand_point.gif dragon.gif \
            dragon_claw_pointed.jpg
[IM Output]  + [IM Output] ==> [IM Output]
-compose」設定控制如何在背景上繪製影像。以上使用的預設值是「-compose over」,它只是將影像疊加在背景上。除了在非常特殊的情況下,所提供的大多數其他合成方法都不是很實用,但以下列出其中一些。有關此設定及其效果的更多詳細資訊,請參閱Alpha 合成Bumpmap 是一種 tricky 合成方法,基本上會根據疊加影像的亮度使背景影像變暗。疊加影像中任何白色的部分都會被視為透明處理,而任何黑色的部分在輸出影像上都會變成黑色。這有點像使用疊加影像作為墨水印章,這是描述此操作的好方法。提示:使用 bumpmap 疊加最適合淺色影像。因此,您可能需要在使用前準備 bumpmap 影像。在這裡,我們在使用「-compose bumpmap」將龍形影像繪製在紙捲軸影像上之前,先調整其大小。

  magick composite \( dragon.gif -resize 50% \) scroll.gif \
            -compose bumpmap -gravity center   dragon_scroll.gif
[IM Output]  + [IM Output] ==> [IM Output]
Bumpmap 也可用於設定影像的整體效果,在這種情況下,我們在龍形影像上平鋪淺色背景圖案。請記住,bumpmap 影像會被視為灰階影像,因此疊加影像中的任何顏色都會遺失。

  magick composite -compose bumpmap  -tile rings.jpg \
            dragon.gif  dragon_rings.jpg
[IM Output]  + [IM Output] ==> [IM Output]
上面的「-tile」選項僅適用於使用「magick composite」指令的合成操作。在「magick」中,您必須將「tile:」影像產生器與「-size」一起使用來指定範圍。您當然可以使來源疊加影像大於要疊加的背景影像,因為結果將是背景影像或目標影像的大小。
Multiply 合成方法以其將兩個具有白色背景的影像合併(例如合併到文字頁面上)的能力而聞名。與「bumpmap」合成方法不同,它不會將疊加影像預先轉換為灰階。

  mesgs PictureWords |\
      magick -pointsize 18 text:-  -trim +repage \
              -bordercolor white -border 10x5   text.gif
  magick composite -compose multiply -geometry +400+3 \
            paint_brush.gif  text.gif  text_multiply.gif
[IM Output]  + [IM Output] ==> [IM Output]
題外話:上面用於產生「text.gif」的複雜指令只是為了建立典型的純文字影像,「mesgs」指令只是輸出特定的引言,就像「fortune」一樣,但具有更多控制權。這種方法在很多情況下都非常有效,但通常僅限於其中一張影像基本上是黑色(或灰階)且背景大部分為白色的情況下。如果兩個影像都包含彩色區域,則可能會得到不尋常的結果。換句話說,此技術非常適合將線條圖、圖表或文字影像疊加在白色(或相當淺的顏色)影像上,例如列印或掃描頁面的影像。

浮水印

浮水印是一項重要的工作,因為它提供了一種將影像標記為屬於某個公司或網站的方法。遺憾的是,這涉及以某種方式破壞影像,從而損害影像本身。浮水印的基本目標是
  • 無論影像的顏色是淺色還是深色,標記都應清晰可見。
  • 應該難以擦除。
  • 而且不應該太讓觀看者討厭。
所有這些因素都是相互衝突的,這也是浮水印難以做好的原因之一。

使用符號添加浮水印

最簡單也是最令人討厭的浮水印形式之一就是在要加浮水印的影像上的某處放置一個非常小但特定的影像。在這裡,我們產生了一個我們想要加浮水印的影像(使用「logo:」),使用一個小的「眼睛」符號。

  magick logo: -resize x180  -gravity center  -crop 180x180+0+0  logo.jpg
  magick composite -geometry +160+13 eyes.gif   logo.jpg  wmark_symbol.jpg
[IM Output]  + [IM Output] ==> [IM Output]
放置小圖像的最佳方法是將其添加到原始圖像中,使其看起來像是原始圖像的一部分。在上面的例子中,我添加了“眼睛”圖像,使其看起來幾乎像巫師帽的一部分(您也不希望它與圖像過於融合)。因此,這種技術需要人工干預,因此無法完全自動化。小圖像也很難移除,因為它會完全破壞它覆蓋的圖像部分。如果處理得當,除非您特別注意,否則很難注意到它。我看見它在網路上的許多地方都得到了很好的應用。一個網站使用了一個小的匕首狀符號。當我在其他網站上發現的圖像上發現相同的匕首符號時,從該網站竊取的圖像就變得非常明顯。

使用文字添加浮水印

在圖像上繪製文字也是一種簡單的浮水印方法,上面任何圖像標籤範例都可以用作一種浮水印。但是,要正確執行此操作,您應該使用兩種不同的顏色,以防止文字在不同顏色的背景上繪製時消失。因此,應使用某種複合字體效果

  magick logo.jpg  -font Arial -pointsize 20 \
          -draw "gravity south \
                 fill black  text 0,12 'Copyright' \
                 fill white  text 1,11 'Copyright' " \
          wmark_text_drawn.jpg
這種方法效果很好,而且可以自動化,但它太醒目了,不適合用作良好的浮水印,因為它在圖像中太突兀了。
[IM Output]
但是,通過一些準備工作,可以創建一個具有透明背景的圖像,這樣就不會那麼突兀。有關生成浮水印文字所用步驟的詳細信息,請參閱字體遮罩。此外,遮罩圖像的遮罩範例可能有助於您理解。

  magick -size 300x50 xc:grey30 -font Arial -pointsize 20 -gravity center \
          -draw "fill grey70  text 0,0  'Copyright'" \
          stamp_fgnd.png
  magick -size 300x50 xc:black -font Arial -pointsize 20 -gravity center \
          -draw "fill white  text  1,1  'Copyright'  \
                             text  0,0  'Copyright'  \
                 fill black  text -1,-1 'Copyright'" \
          -alpha off stamp_mask.png
  magick composite -compose CopyOpacity  stamp_mask.png  stamp_fgnd.png  stamp.png
  magick mogrify -trim +repage stamp.png
[IM Output]
現在我們有了一個浮水印字體,可以將其應用到我們的圖像中...

  magick composite -gravity south -geometry +0+10 stamp.png  logo.jpg \
            wmark_text_stamped.jpg
如您所見,浮水印不像以前那樣醒目,甚至使用了灰色陰影而不是純白色和黑色。儘管如此,無論背景如何,它仍然清晰可見。複合字體效果頁面詳細介紹了許多可以通過這種方式使用的字體樣式,而不會壓倒被添加浮水印的圖像。
[IM Output]
您也可以將文字平鋪在整個圖像上。在這裡,我們還通過使用命令“管道”來避免對中間圖像的需求,其中一個命令的輸出饋送到下一個命令。

  magick -size 140x80 xc:none -fill grey \
          -gravity NorthWest -draw "text 10,10 'Copyright'" \
          -gravity SouthEast -draw "text 5,15 'Copyright'" \
          miff:- |\
    magick composite -tile - logo.jpg  wmark_text_tiled.jpg
這利用了這樣一個事實,即圖像(如照片,而不是圖表)通常會有一些區域,在這些區域中,平鋪的測試字符串將是可見的。您可能希望使文字半透明以用於您自己的浮水印(例如,使用半透明的灰色,如“'#80808080'”)。您可能還希望在以下適當的浮水印技術中牢記這種平鋪技術。
[IM Output]

使用圖像添加浮水印

ImageMagick 還提供了一些選項,這些選項對於在更大區域上進行更精細的浮水印特別有用。當您對圖像“添加浮水印”時,通常會更常提到這一點。右邊是一張“水龍”圖像,我將用它來進行這些演示。它具有一定的透明度,我用它來檢查 IM 在處理透明度方面是否做得正確,避免結果出現任何可怕的“方形”外觀。 [IM Output]
在 IM 版本 6 之前,選項“-watermark”和“-dissolve”在處理覆蓋圖像的 Alpha 通道(透明度)時被破壞,產生了一些非常奇怪的效果。
浮水印合成旨在為圖像添加浮水印,雖然它有效,但它往往只適用於純白色和黑色的覆蓋圖像,產生難看的邊緣偽影。

  magick composite -watermark 30% -gravity south \
            wmark_image.png  logo.jpg    wmark_watermark.jpg
有關此選項的更多詳細信息,請參閱浮水印選項用法頁面。
[IM Output]
我和其他人都發現溶解效果更好。

  magick composite -dissolve 25% -gravity south \
            wmark_image.png   logo.jpg  wmark_dissolve.jpg
這種方法效果很好,但對於純白色和黑色像素的圖像,浮水印的部分會消失。 也就是說,在最終圖像中將看不到白色溶解在白色上以及黑色溶解在黑色上。 由於這兩種顏色很常見,因此最好對浮水印進行一些額外的預處理,使其使用各種深淺的灰色而不是純白色和黑色。(請參閱下面的“灰色溶解”)
[IM Output]
有關此選項的更多詳細信息,請參閱“溶解選項使用”頁面。
平鋪: 您也可以將浮水印平鋪在背景圖像上,而不僅僅是在一個位置添加它。 只需將您的重力位置替換為“-tile”。 當然,在這種情況下,您可能希望使浮水印更不顯眼。

  magick composite -dissolve 15 -tile \
            wmark_image.png   logo.jpg  wmark_tiled.jpg
[IM Output]
灰色凹凸貼圖: 要將凹凸貼圖正確用作浮水印,需要對圖像進行一些準備,以使用灰度調整技術使白色和黑色都變成較淺的灰色範圍。 如果不這樣做,結果將會非常非常粗獷。

  magick wmark_image.png  -fill Gray91 -colorize 80  miff:- |\
  magick composite -compose bumpmap -gravity south \
            -  logo.jpg    wmark_bumpmap.jpg
[IM Output]
凹凸貼圖作為浮水印的最大問題是該操作只會使圖像變暗。 因此,這種技術對於非常暗的圖像來說毫無用處。
灰色溶解: 相同的預處理技術也可以與溶解方法一起使用,以便浮水印圖像的白色部分在白色背景上稍微變暗,同樣也可以使圖像黑色部分上的浮水印的黑色區域變亮。

  magick wmark_image.png  -fill grey50 -colorize 40  miff:- |\
  magick composite -dissolve 30 -gravity south -  logo.jpg wmark_dissolve_grey.jpg
[IM Output]
我認為這幾乎是理想的浮水印,滿足所有要求。 但是,我會進一步調整最終溶解,使浮水印更加不顯眼。
平鋪灰色溶解: 這與上面完全相同,但在圖像上平鋪,溶解值更低。

  magick wmark_image.png  -fill grey50 -colorize 40  miff:- |\
  magick composite -dissolve 15 -tile  -  logo.jpg wmark_dissolve_tile.jpg
[IM Output]
magick composite”命令不知道如何處理動畫等多圖像文件。 但是其他方法確實允許您執行此操作。 有關註釋和覆蓋多圖像文件的示例,請參閱“修改動畫,註釋”

使用重力定位圖像和文本

「重力」的作用

正如您在上面看到的,能夠在較大的圖像中定位圖像和文本與其他任何事情一樣重要。 自然,“-gravity”設置是其中最重要的方面之一。
在 ImageMagick 郵件列表中,Tim Hunter 宣稱
在你掌握重力之前,它會讓你發瘋。
我 wholeheartedly 同意這種觀點。
重力僅適用於以下情況...
  • 任何涉及“幾何”之類的設置的操作,例如“-crop”和“-geometry”,用於Alpha 合成的圖像定位,包括多圖像分層合成
  • 它還用於通過各種文本到圖像生成器(例如“label:”)指定文本對齊方式,以及通過各種文本到圖像生成器(例如“caption:”)指定文本對齊方式。
  • -annotate”文本繪製運算符也將其用於文本定位以及對齊。
  • 最後,它由“-draw”方法的“text”和“image”方法使用,並且僅限那些方法。
但是,以下情況使用“-gravity
  • 任何圖片清單或圖層運算子,例如「-mosaic」、「-flatten」以及大多數「-layers」方法,尤其不適用於 GIF 動畫。所有這些操作都使用較大虛擬畫布上的圖像偏移(使用「-page」、「-repage」中繼資料設定設定)來定位圖像。此類偏移始終相對於圖像虛擬畫布的左上角。此方法中未使用對「-gravity」的理解。
  • 任何其他「-draw」方法都不使用「-gravity」進行定位。它也不太可能這樣做,因為 IM 遵循的 SVG 草案中沒有定義「-gravity」用於這些低階函數。
所有這一切意味著什麼?首先也是最重要的是,它定義了「-geometry」用於相對於圖像邊緣、側面和中心定位重疊文字和圖像的原點,而使用者無需知道圖像的實際大小。這是它的主要功能。其次,它定義了重疊物件(文字或圖像)相對於該定義的重心點的水平和垂直對齊方式。例如,使用「東方」重力時,文字或圖像將放置在定義點的右側(右對齊)。對齊方式在技術上應該是一個獨立於「-gravity」的設定,雖然密切相關,但 IM 目前將兩者合併為一個設定。目前有一種趨勢是將這兩個方面分開,例如,如果未定義「對齊方式」設定,則它會退回到使用目前的「-gravity」設定。如果您發現需要這樣做,請(通過郵件清單)向 Cristy 提出請求。如果提出請求的使用者人數夠多,我相信它最終會被實施。

使用重力進行圖像定位

以下是如何使用重力在背景上定位圖像的範例。

  magick composite label:Default                      rings.jpg gravity_default.jpg
  magick composite label:Center    -gravity center    rings.jpg gravity_center.jpg
  magick composite label:South     -gravity south     rings.jpg gravity_south.jpg
  magick composite label:East      -gravity east      rings.jpg gravity_east.jpg
  magick composite label:NorthEast -gravity northeast rings.jpg gravity_northeast.jpg
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
請注意,圖像的實際位置也會根據「-gravity」設定進行對齊。也就是說,「南方」重力會將圖像置於較大圖像底部的中心,但在該重心點上方。稍後在進行文字旋轉時,這一點將變得更加重要。另一件需要記住的事情是,任何「-geometry」設定指定的位置都是相對於重力放置圖像的位置而言的。不僅如此,位置的方向也被修改,使得位置方向是向內的。例如,「-gravity South -geometry +10+10」會將標籤圖像進一步移入背景中。也就是說,幾何位置的 Y 方向已被反轉,而 X 方向保持不變。

  magick composite label:Default   -geometry +10+10 \
            rings.jpg gravity_default_pos.jpg
  magick composite label:South     -geometry +10+10 -gravity south \
            rings.jpg gravity_south_pos.jpg
  magick composite label:NorthEast -geometry +10+10 -gravity northeast \
            rings.jpg gravity_northeast_pos.jpg
[IM Output] [IM Output] [IM Output]
您也可以將「-gravity」與「-draw image」一起使用,以便使用單個命令處理多個圖像。

  magick rings.jpg \
          -gravity Center     -draw "image Over     0,0 0,0 'castle.gif'" \
          -gravity NorthEast  -draw "image Bumpmap  0,0 0,0 'castle.gif'" \
          -gravity SouthWest  -draw "image Multiply 0,0 0,0 'castle.gif'" \
          gravity_image.jpg
[IM Output]
您現在也可以使用「-composite」將圖像重疊到背景上...

  magick rings.jpg \
          -gravity Center     castle.gif  -compose Over     -composite \
          -gravity NorthWest  castle.gif  -compose Bumpmap  -composite \
          -gravity SouthEast  castle.gif  -compose Multiply -composite \
          gravity_image2.jpg
[IM Output]
有關上述「-compose」設定的更多詳細資訊,請參閱Alpha 合成。如需將多個圖像重疊組合成單個圖像的其他方法,請參閱 IM 範例章節多個圖像的圖層

使用重力設定文字位置

以上說明適用於圖片,但如果要直接在圖片上繪製文字呢?基本上,與圖片相同的效果也適用於文字。如上所述,重力也會影響使用 "-draw" 的 'text' 方法或更佳的 "-annotate" 文字繪製運算子的文字定位。

  magick rings.jpg -resize 120x120  \
          -gravity northwest  -annotate 0 'NorthWest' \
          -gravity east       -annotate 0 'East' \
          -gravity center     -annotate 0 'Center' \
          -gravity south      -annotate 0 'South' \
          -gravity northeast  -annotate 0 'NorthEast' \
          gravity_text.jpg
[IM Output]
圖片和文字的定位有一個非常重要的區別。如果您繪製一個文字字串,而不定義任何形式的 "-gravity",則該字串將相對於字體的「基線」繪製。
舉例來說,讓我們實際操作一下...

  magick rings.jpg -annotate 0 'String' gravity_text_none.jpg
[IM Output]
如果您仔細觀察,您只會看到「String」中「g」的小尾巴迴圈出現在結果圖像的上邊緣。其餘的字串已繪製在背景圖像之外。但是,如果您將 "-gravity" 設定為 'NorthWest',則文字將被定位,就好像它是一張圖片一樣。也就是說,相對於字體定義的 邊界框或底色框
舉例來說...

  magick rings.jpg -gravity NorthWest -annotate 0 'String'  gravity_text_nw.jpg
[IM Output]
之所以要區分這一點,是為了確保 IM 文字繪製與其他向量繪圖圖像格式(如「SVG」)保持相容。這些格式不使用重力,因此打開重力會告訴 IM 在進行文字繪製時遵循與圖片放置相同的規則,而不是涉及字體「基線」和文字「起點」的向量圖形規則。如果您確實打開了重力,然後想稍後將其關閉,則可以使用 "-gravity none" 或 "+gravity" 將其重置為預設的「無重力」設定。
讓我們套用文字偏移量,並繪製 "-gravity" 的預設 'None' 和 'NorthWest' 參數,以便您可以看到這兩種形式之間的密切關係。

  magick rings.jpg \
          -gravity NorthWest -annotate +10+20 'NorthWest' \
          -gravity None      -annotate +10+20 'None' \
          gravity_text_pos.jpg
[IM Output]
雖然在此範例中可能看不出來,但這兩個字串可能會重疊,特別是在字母(例如「g」和「p」)的下行字母方面。這表示兩個字串並未以「點大小」單位正確分隔,而僅以字型的基線高度分隔。最好的辦法是在您自己的影像處理中不要混合使用這兩種模式。請選擇使用重力或不使用重力。選擇權在您。

使用重力將文字置於左邊緣

以下是實際上沿著影像左邊緣置中註釋的方法的最後一個範例。這裡的問題是,當您旋轉文字時,它會圍繞文字「控點」旋轉。遺憾的是,此控點是在旋轉文字「之前」由重力設定的,因此效果不是很好,除非您限制自己使用「置中文字」。 [IM 輸出]
例如,以下是一個典型的「第一次嘗試」,嘗試將文字定位在影像左邊緣的中心。當然,它失敗得相當出乎意料!
 magick rings.jpg \ -gravity West -annotate 90x90+10+0 'String' \ gravity_text_left_fail.jpg 
如您所見,文字位於左邊緣,但只有開始位置(旋轉前的「控點」所在的位置)是置中的。造成這個問題的原因是,在 IMv7 中,「
-gravity」設定也會直接用於設定文字「對齊方式」(用於設定定位文字的「控點」)。有一些以 PerlMagick API 編寫的旋轉文字重力效果的動畫展示(下載「im_annotation.pl」)。我也建立了相同程式的 shell 指令碼版本,「im_annotation」和「im_annotation_2」)。
一個讓它起作用的技巧是先旋轉整個影像,然後使用中央下方!這是一個毫無意義的解決方案,但它有效。

  magick rings.jpg -rotate -90 \
          -gravity South -annotate +0+2 'String' \
          -rotate 90  gravity_text_left.jpg
[IM Output]
另一種方法如下所示:使用扭曲定位文字

使用「繪製」進行文字定位

雖然在上面我使用了「文字偏移」來相對於「-gravity」點定位文字,但這並不是唯一的方法。另一種方法是使用「-draw translate」選項來定位文字。這樣做的好處是,您可以安排在沒有重力效應的情況下定位文字,同時仍然使用重力來「對齊」文字中的定位「控點」。在這些範例中,我添加了一些額外的構造線(這些線也不受重力影響),以顯示如何從影像的中心點應用位置。具有偏移的文字...

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan  -draw 'line 50,50 70,70' \
          -fill red   -draw 'line 68,70 72,70 line 70,68 70,72' \
          -fill blue  -draw "text 20,20 'Offset'" \
          text_offset.jpg
[IM Output]
具有平移的文字...

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 70,70' \
          -fill red  -draw 'line 68,70 72,70  line 70,68 70,72' \
          -fill blue -draw "translate 20,20 text 0,0 'Translate'" \
          text_translate.jpg
[IM Output]
如您所見,兩者產生了相同的實際結果。但由於「-draw text」要求您提供作為其參數一部分的偏移,因此它更常用於從命令列定位繪製的文字。然而,雖然這兩種方法產生了相同的結果,但在也應用文字旋轉時,它們會產生完全不同的結果。基本上是由於應用動作的順序。

繪製旋轉的文字

繪製文字的位置有兩種獨立的方式:使用「文字偏移」或將文字「平移」到最終位置。當也套用旋轉時,這兩種定位方法的效果會產生非常不同的結果。原因很複雜,但基本上涉及 IM 如何進行繪圖表面扭曲。話雖如此,讓我們看看如果使用兩種不同的位置旋轉一些文字會發生什麼。只是一個偏移量,沒有旋轉...

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 70,70' \
          -fill red  -draw 'line 68,70 72,70  line 70,68 70,72' \
          -fill blue -draw "text 20,20 'None'" \
          rotate_none.jpg
[IM Output]
使用偏移量旋轉文字...

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 50,78' \
          -fill red  -draw 'line 48,78 52,78  line 50,76 50,80' \
          -fill blue -draw "rotate 45 text 20,20 'Offset'" \
          rotate_offset.jpg
[IM Output]
使用平移旋轉文字...

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 70,70' \
          -fill red  -draw 'line 68,70 72,70  line 70,68 70,72' \
          -fill blue -draw "translate 20,20 rotate 45 text 0,0 'Translate'" \
          rotate_translate.jpg
[IM Output]
這實際上是大多數人想要的。儘管偏移旋轉對於某些特殊效果很有用。請注意這些繪圖表面扭曲的順序如何與給定的順序相反。首先執行旋轉,然後執行平移。如果反轉「旋轉」和平移方法,將獲得與普通「文字偏移」(旋轉偏移)相同的結果。「-annotate」運算子專門用於通過特別要求 IM 使用旋轉繪製文字來簡化旋轉文字的定位,而不是「進行表面扭曲」。使用旋轉和偏移進行註釋...

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 70,70' \
          -fill red  -draw 'line 68,70 72,70  line 70,68 70,72' \
          -fill blue -annotate 45x45+20+20 'Annotate' \
          rotate_annotate.jpg
[IM Output]
上述範例的問題在於 IMv7「-gravity」設定不僅指背景圖像上的位置,還指要繪製的重疊圖像中的位置。IMv7 將添加「文字對齊」,它指的是重疊位置,作為重力(背景位置)的單獨(但相關)設定。

使用「扭曲」進行文字定位

SRT 失真圖層影像一起使用是放置影像(或影像中的文字)的絕佳方法。基本上,它允許您完全低階控制放置影像的點,以及影像相對於該點的排列方式。首先,我們在這裡創建一個具有透明背景的「文字影像」,並簡單地將影像「圖層」到背景影像上。

  magick rings.jpg -background none label:'Some Text' \
          -flatten  layer_simple.jpg
[IM Output]
如您所見,文字只是添加到左上角的影像中。讓我們使用失真(圖層變體)旋轉它——不是使用括號來限制我們失真的影像!

  magick rings.jpg \( -background none label:'Some Text' \
             +distort SRT 70 \
          \) -flatten  layer_rotate.jpg
[IM Output]
請注意,文字位置沒有改變!發生的所有事情是失真圍繞中心點(控點)旋轉了文字,但相對於「虛擬畫布」,該點沒有移動。因此,當現在更大的影像拼合時,其旋轉點「文字影像的中心」沒有移動。下一步是移動該控點,但為此,我們需要使用幾乎全套SRT 失真參數。因為我們想繼續使用「中心控點」,所以我們需要使用一些影像屬性百分比跳脫字元,或更具體地說是FX 百分比跳脫字元。所以讓我們將中心放置在背景影像中的「+60+60」處

  magick rings.jpg \( -background none label:'Some Text' \
             +distort SRT '%[fx:w/2],%[fx:h/2] 1 70 60,60' \
          \) -flatten  layer_translate.jpg
[IM Output]
移動「圖層影像」的另一種方法是使用重新編排運算子。特別是使用「!」旗標進行相對移動。根據圖層影像的性質,其「控制點」位於左上角。SRT 變形運算子不僅可以使用指定的控制點平移影像,還可以對這兩個控制點使用次像素(浮點數)位置。也就是說,它可以以次像素增量將文字扭曲到任何位置,而不受大多數其他操作的整數限制。最後一個範例是將旋轉 90 度的文字放置在左邊緣。這次旋轉和定位文字的控制點將位於文字的底部中心,也就是旋轉前的底部中心。也就是計算出的位置「%[fx:w/2],%h」。現在也必須將背景影像上的位置計算為左邊緣的中心(「0,%[fx:h/2]」)。問題是,SRT 變形運算子在扭曲文字影像時無法存取背景影像。解決方案是在背景影像可用時執行此位置計算,並將其儲存到一些「個人設定」中,然後將其新增到扭曲參數中。這種技術在從其他影像擷取資訊中有更詳細的介紹。結果如下。首先計算背景影像上的位置。然後扭曲文字影像,使其「控制點」也移動到預先計算的位置。

  magick rings.jpg -set option:my:left_edge '0,%[fx:h/2]' \
          \( -background none label:'Some Text' \
             +distort SRT '%[fx:w/2],%h 1 90 %[my:left_edge]' \
          \) -flatten  layer_on_left.jpg
[IM Output]
my:」字串可以是任何與現有前綴不衝突的字串。也就是說,我用它來存放我的設定,與 ImageMagick 可能用於編碼器或特定選項的任何其他設定分開。為此,使用「my:」作為前綴是一個不錯的選擇。百分比跳脫字元會被純粹視為字串替換來處理,實際上我們可以將整個扭曲選項生成為一個字串。唯一的問題是,在設定「my:」設定後,就無法對其進行數學運算。所以任何數學運算都必須事先完成。這是 IMv7 將會考慮的一點,以便 FX 運算式使用 % 跳脫變數。