Imagemagick

如何使垂直平舖的水印居中

  • August 17, 2012

我使用 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 中執行此操作,您可以在外部呼叫bcdc執行計算。

現在我們知道我們可以讓它有多大,創建一個水印圖像的平鋪臨時版本,在等於基礎圖像大小的幀內居中:

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)'指令位於輸入圖像之前很重要,因此它不會在預設的白色背景上進行平鋪操作。

然而,這裡真正的技巧是我們對-sizeand-extent指令使用了不同的值。我們正在建構一個可能更小的平鋪圖像,然後在需要時將其填充以匹配基本圖像的大小。如果平鋪圖像大小均勻地劃分為基本圖像大小,那很好,它根本不需要添加任何額外的填充來使平鋪集居中。

最後,在原始圖像上放置臨時平鋪水印:

composite "$wmtemp" "$infile" "$outfile"
rm "$wmtemp"

引用自:https://unix.stackexchange.com/questions/45600