ImageMagick 範例 --
圖像標註
- 索引
-
ImageMagick 範例 前序與索引
-
標記圖像
(標記圖像的技巧)
-
圖像疊加
(將圖像疊加和合併在一起)
-
浮水印
(用於版權保護的標註)
-
文字和圖像定位方法
- 使用有關圖像內容的信息標記圖像。
- 指出或突出顯示圖像的某些方面。
- 將版權或徽標添加到圖像中作為一種版權保護形式。
圖像標註
標記圖像的基本問題是如何使文字在任何圖像上都清晰可讀。以下顯示了許多方法,其中一些方法可以擴展以完成更複雜的任務。在這些範例中,我將自己限制在 ImageMagick 的默認字體中。鼓勵您使用適合您想要實現的效果的不同字體和字體大小。在圖像下方(或上方)標記
從 IM v6.4.7-1 開始,現在可以附加帶有居中文本的標籤,因為圖像附加現在遵循重力設定以進行對齊。
|
![]() |
通過重新排序圖像,您可以將標籤附加在圖像上方。
|
![]() |
拼接和繪製是一種非常簡單的方法,可以為圖像添加額外空間,以便我們繪製/標註標籤到圖像中。
|
![]() |
同樣的方法也可以用於在圖像上方繪製標籤,只需將重力設定從「South 」替換為「North 」。很簡單!
|
![]() |
-draw
」運算符直接用於在圖像上繪製,除非它是更複雜繪圖函數的一部分。有關其他文字繪製方法和技巧的更多詳細信息,請參閱文字到圖像處理部分。
使用蒙太奇標記 ImageMagick 中的蒙太奇命令經常被用戶忽視,因為它僅對創建整個圖像目錄的顯示有用。它確實提供了一種非常簡單的方法來為圖像添加標籤。
|
![]() |
蒙太奇還可以為您的圖像添加邊框和其他元素,因此這種標記形式具有許多超出簡單圖像標記的額外可能性。
|
![]() |
使用 Polaroid 標籤 另一個使用蒙太奇的方法,是使用 Polaroid 影像轉換,產生一個相當花俏的註釋影像。
|
![]() |
在影像本身上方標籤...
直接在圖片上寫文字的問題是,您無法確定文字在您選擇的顏色中是否清晰可辨。繪製的影像可能是黑色、白色或彩虹色。
外框標籤:最簡單的方法是用外框繪製字串,將文字與影像分開。但是,由於「-stroke 」字體設定會增加字體的內外粗細,從而降低其效果(如需更多資訊,請參閱 筆劃和筆劃寬度。繪製具有背景外框的字體的更好方法是繪製兩次文字。
|
![]() |
Times
」或「Arial
」字體相比,它在較粗的字體上效果更好。如需此技術的更多詳細資訊,請參閱 粗筆劃複合字體。
繪製暗框:使註釋文字更清晰可辨的更經典方法是在要添加文字的區域「變暗」影像,然後以相反的顏色繪製文字。例如...
|
![]() |
-gravity
」來放置文字,因為無法使用重力來定位變暗的矩形(這在未來可能會有所改變)。此外,其大小和位置可能取決於影像和最終文字大小,這可能需要一些額外的數學計算。
底色框:您可以讓 ImageMagick 在框上使用「底色」,而不是嘗試自己繪製背景框。請參閱 文字底色框。可以使用「-undercolor 」選項在命令列上指定文字「底色」(如程式庫 API 中所使用)。
|
![]() |
-gravity
」定位它,而無需了解要添加到的影像或正在使用的繪製字體的任何特定知識。此外,您不僅限於使用簡單的暗框。相反,您可以準備非常複雜的字體影像,可以事先準備好,以便多次應用,也可以根據每個影像動態準備。幾乎所有 複合字體效果 樣式都可用於您,讓您能夠使文字添加非常出色且具有專業水準。自動調整大小的標題:從 IM v6.3.2 版開始,「
caption:
」現在可以自動調整文字大小以最佳地適應特定大小的框。但要正確地將此用於覆蓋,您需要知道被註釋圖像的寬度。在這裡,我收集該信息,然後創建並覆蓋一個標題,以便文本自動調整大小以最佳地適應提供的空間,並進行自動換行。
|
![]() |
|
![]() |
-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 的城堡圖標。您還可以精確定位子圖像。在這裡,我們設置了一隻手來指出精靈龍的小爪子。「-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]](../images/dragon.gif)

![[IM Output]](../images/scroll.gif)

![[IM Output]](dragon_scroll.gif)
![]() ![]() |
上面的「-tile 」選項僅適用於使用「magick composite 」指令的合成操作。在「magick 」中,您必須將「tile: 」影像產生器與「-size 」一起使用來指定範圍。您當然可以使來源疊加影像大於要疊加的背景影像,因為結果將是背景影像或目標影像的大小。 |
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]](../images/paint_brush.gif)

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

![[IM Output]](text_multiply.gif)
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]](logo.jpg)

![[IM Output]](../images/eyes.gif)

![[IM Output]](wmark_symbol.jpg)
使用文字添加浮水印
在圖像上繪製文字也是一種簡單的浮水印方法,上面任何圖像標籤範例都可以用作一種浮水印。但是,要正確執行此操作,您應該使用兩種不同的顏色,以防止文字在不同顏色的背景上繪製時消失。因此,應使用某種複合字體效果。
|
![]() |
|
![[IM Output]](stamp.png)
現在我們有了一個浮水印字體,可以將其應用到我們的圖像中...
|
![]() |
'#80808080' ”)。您可能還希望在以下適當的浮水印技術中牢記這種平鋪技術。 |
![]() |
使用圖像添加浮水印
ImageMagick 還提供了一些選項,這些選項對於在更大區域上進行更精細的浮水印特別有用。當您對圖像“添加浮水印”時,通常會更常提到這一點。右邊是一張“水龍”圖像,我將用它來進行這些演示。它具有一定的透明度,我用它來檢查 IM 在處理透明度方面是否做得正確,避免結果出現任何可怕的“方形”外觀。 |
![]() |
![]() ![]() |
在 IM 版本 6 之前,選項“-watermark ”和“-dissolve ”在處理覆蓋圖像的 Alpha 通道(透明度)時被破壞,產生了一些非常奇怪的效果。 |
浮水印合成旨在為圖像添加浮水印,雖然它有效,但它往往只適用於純白色和黑色的覆蓋圖像,產生難看的邊緣偽影。
|
![]() |
|
我和其他人都發現溶解效果更好。
|
![]() |
|
平鋪: 您也可以將浮水印平鋪在背景圖像上,而不僅僅是在一個位置添加它。 只需將您的重力位置替換為“-tile ”。 當然,在這種情況下,您可能希望使浮水印更不顯眼。
|
![]() |
|
灰色凹凸貼圖: 要將凹凸貼圖正確用作浮水印,需要對圖像進行一些準備,以使用灰度調整技術使白色和黑色都變成較淺的灰色範圍。 如果不這樣做,結果將會非常非常粗獷。
|
![]() |
|
灰色溶解: 相同的預處理技術也可以與溶解方法一起使用,以便浮水印圖像的白色部分在白色背景上稍微變暗,同樣也可以使圖像黑色部分上的浮水印的黑色區域變亮。
|
![]() |
|
平鋪灰色溶解: 這與上面完全相同,但在圖像上平鋪,溶解值更低。
|
![]() |
![]() ![]() |
“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]](gravity_default.jpg)
![[IM Output]](gravity_center.jpg)
![[IM Output]](gravity_south.jpg)
![[IM Output]](gravity_east.jpg)
![[IM Output]](gravity_northeast.jpg)
-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]](gravity_default_pos.jpg)
![[IM Output]](gravity_northeast_pos.jpg)
![[IM Output]](gravity_south_pos.jpg)
-gravity
」與「-draw image
」一起使用,以便使用單個命令處理多個圖像。
|
![]() |
-composite
」將圖像重疊到背景上...
|
![]() |
-compose
」設定的更多詳細資訊,請參閱Alpha 合成。如需將多個圖像重疊組合成單個圖像的其他方法,請參閱 IM 範例章節多個圖像的圖層。 使用重力設定文字位置
以上說明適用於圖片,但如果要直接在圖片上繪製文字呢?基本上,與圖片相同的效果也適用於文字。如上所述,重力也會影響使用 "-draw
" 的 'text
' 方法或更佳的 "-annotate
" 文字繪製運算子的文字定位。
|
![]() |
-gravity
",則該字串將相對於字體的「基線」繪製。舉例來說,讓我們實際操作一下...
|
![]() |
-gravity
" 設定為 'NorthWest
',則文字將被定位,就好像它是一張圖片一樣。也就是說,相對於字體定義的 邊界框或底色框。舉例來說...
|
![]() |
-gravity none
" 或 "+gravity
" 將其重置為預設的「無重力」設定。讓我們套用文字偏移量,並繪製 "-gravity " 的預設 'None ' 和 'NorthWest ' 參數,以便您可以看到這兩種形式之間的密切關係。
|
![]() |
g
」和「p
」)的下行字母方面。這表示兩個字串並未以「點大小」單位正確分隔,而僅以字型的基線高度分隔。最好的辦法是在您自己的影像處理中不要混合使用這兩種模式。請選擇使用重力或不使用重力。選擇權在您。 使用重力將文字置於左邊緣
以下是實際上沿著影像左邊緣置中註釋的方法的最後一個範例。這裡的問題是,當您旋轉文字時,它會圍繞文字「控點」旋轉。遺憾的是,此控點是在旋轉文字「之前」由重力設定的,因此效果不是很好,除非您限制自己使用「置中文字」。![[IM 輸出]](gravity_text_left_fail.jpg)
例如,以下是一個典型的「第一次嘗試」,嘗試將文字定位在影像左邊緣的中心。當然,它失敗得相當出乎意料!
|
im_annotation.pl
」)。我也建立了相同程式的 shell 指令碼版本,「im_annotation
」和「im_annotation_2
」)。一個讓它起作用的技巧是先旋轉整個影像,然後使用中央下方!這是一個毫無意義的解決方案,但它有效。
|
![]() |
使用「繪製」進行文字定位
雖然在上面我使用了「文字偏移」來相對於「-gravity
」點定位文字,但這並不是唯一的方法。另一種方法是使用「-draw translate」選項來定位文字。這樣做的好處是,您可以安排在沒有重力效應的情況下定位文字,同時仍然使用重力來「對齊」文字中的定位「控點」。在這些範例中,我添加了一些額外的構造線(這些線也不受重力影響),以顯示如何從影像的中心點應用位置。具有偏移的文字...
|
![]() |
|
![]() |
-draw text
」要求您提供作為其參數一部分的偏移,因此它更常用於從命令列定位繪製的文字。然而,雖然這兩種方法產生了相同的結果,但在也應用文字旋轉時,它們會產生完全不同的結果。基本上是由於應用動作的順序。 繪製旋轉的文字
繪製文字的位置有兩種獨立的方式:使用「文字偏移」或將文字「平移」到最終位置。當也套用旋轉時,這兩種定位方法的效果會產生非常不同的結果。原因很複雜,但基本上涉及 IM 如何進行繪圖表面扭曲。話雖如此,讓我們看看如果使用兩種不同的位置旋轉一些文字會發生什麼。只是一個偏移量,沒有旋轉...
|
![]() |
|
![]() |
|
![]() |
-annotate
」運算子專門用於通過特別要求 IM 使用旋轉繪製文字來簡化旋轉文字的定位,而不是「進行表面扭曲」。使用旋轉和偏移進行註釋...
|
![]() |
-gravity
」設定不僅指背景圖像上的位置,還指要繪製的重疊圖像中的位置。IMv7 將添加「文字對齊」,它指的是重疊位置,作為重力(背景位置)的單獨(但相關)設定。使用「扭曲」進行文字定位
將SRT 失真與圖層影像一起使用是放置影像(或影像中的文字)的絕佳方法。基本上,它允許您完全低階控制放置影像的點,以及影像相對於該點的排列方式。首先,我們在這裡創建一個具有透明背景的「文字影像」,並簡單地將影像「圖層」到背景影像上。
|
![]() |
|
![]() |
+60+60
」處
|
![]() |
!
」旗標進行相對移動。根據圖層影像的性質,其「控制點」位於左上角。SRT 變形運算子不僅可以使用指定的控制點平移影像,還可以對這兩個控制點使用次像素(浮點數)位置。也就是說,它可以以次像素增量將文字扭曲到任何位置,而不受大多數其他操作的整數限制。最後一個範例是將旋轉 90 度的文字放置在左邊緣。這次旋轉和定位文字的控制點將位於文字的底部中心,也就是旋轉前的底部中心。也就是計算出的位置「%[fx:w/2],%h
」。現在也必須將背景影像上的位置計算為左邊緣的中心(「0,%[fx:h/2]
」)。問題是,SRT 變形運算子在扭曲文字影像時無法存取背景影像。解決方案是在背景影像可用時執行此位置計算,並將其儲存到一些「個人設定」中,然後將其新增到扭曲參數中。這種技術在從其他影像擷取資訊中有更詳細的介紹。結果如下。首先計算背景影像上的位置。然後扭曲文字影像,使其「控制點」也移動到預先計算的位置。
|
![]() |
my:
」字串可以是任何與現有前綴不衝突的字串。也就是說,我用它來存放我的設定,與 ImageMagick 可能用於編碼器或特定選項的任何其他設定分開。為此,使用「my:
」作為前綴是一個不錯的選擇。百分比跳脫字元會被純粹視為字串替換來處理,實際上我們可以將整個扭曲選項生成為一個字串。唯一的問題是,在設定「my:
」設定後,就無法對其進行數學運算。所以任何數學運算都必須事先完成。這是 IMv7 將會考慮的一點,以便 FX 運算式使用 % 跳脫變數。