Imagemagick
如何使垂直平舖的水印居中
我使用 imagemagick 為我的照片添加水印。命令行如下:
composite -tile -gravity center watermark.png somefile.jpg somefile.jpg
但是水印不是垂直居中的。它看起來像這樣:
我希望它從中心開始。我該怎麼做?
首先,獲取基本圖像和水印圖像的尺寸:
#!/bin/bash infile="$1" outfile="$2" wmfile="watermark.png" basew=`identify -format '%w' "$infile"` baseh=`identify -format '%h' "$infile"` wmw=`identify -format '%w' "$wmfile"` wmh=`identify -format '%h' "$wmfile"`
然後,計算我們可以在基礎圖像上放置多少個完整的圖塊:
tilew=$(($basew / $wmw * $wmw)) tileh=$(($baseh / $wmh * $wmh))
這使用整數算術,因此乘法運算不會抵消除法。讓我們舉個例子。如果基礎圖像為 100x100,平鋪圖像為 34x34,這將產生 68x68,因為您無法在任一軸上完全放入第三個平鋪。
請注意,我們在這裡使用 Bash 功能在適當的 shell 腳本中進行算術運算。如果您必須在另一個 shell 中執行此操作,您可以在外部呼叫
bc
或dc
執行計算。現在我們知道我們可以讓它有多大,創建一個水印圖像的平鋪臨時版本,在等於基礎圖像大小的幀內居中:
wmtemp=`mktemp /tmp/wm-XXXXXX.png` convert -background 'rgba(0,0,0,0)' -size "$tilew"x"$tileh" \ tile:"$wmfile" -gravity center -extent "$basew"x"$baseh" \ png32:$wmtemp
請注意,這會將水印圖像強制為 RGBA 格式(如果還沒有的話)。此外,該
-background 'rgba(0,0,0,0)'
指令位於輸入圖像之前很重要,因此它不會在預設的白色背景上進行平鋪操作。然而,這裡真正的技巧是我們對
-size
and-extent
指令使用了不同的值。我們正在建構一個可能更小的平鋪圖像,然後在需要時將其填充以匹配基本圖像的大小。如果平鋪圖像大小均勻地劃分為基本圖像大小,那很好,它根本不需要添加任何額外的填充來使平鋪集居中。最後,在原始圖像上放置臨時平鋪水印:
composite "$wmtemp" "$infile" "$outfile" rm "$wmtemp"