私はimagemagickを使って写真に透かしを追加します。コマンドラインは次のとおりです。
composite -tile -gravity center watermark.png somefile.jpg somefile.jpg
ただし、透かしは垂直の中央にはありません。次のようになります。
中央から始めたいです。どうすればいいですか?
ベストアンサー1
まず、基本画像と透かし画像のサイズを取得します。
#!/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))
これは整数算術を使用するので、乗算は除算をキャンセルしません。たとえば、見てみましょう。基本画像が100×100でタイル画像が34×34の場合、どの軸にも3番目のタイルを完全に合わせることができないため、68×68になります。
ここでは、Bash関数を使用してシェルスクリプトで算術演算を実行しています。他のシェルでこれを行う必要がある場合は、外部から呼び出すか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形式でない場合は、強制的にRGBA形式になります。また、この-background 'rgba(0,0,0,0)'
ディレクティブは入力画像の前に来る必要があります。
しかし、ここで本当の秘訣は、-size
ディレクティブに-extent
異なる値を使用することです。我々は、より小さなタイル画像を作成し、必要に応じて、ベース画像のサイズに一致するようにパディングします。タイル画像サイズがデフォルトの画像サイズに均等に分割されていれば大丈夫です。タイルセットを中央に配置するために追加のパディングを追加する必要はありません。
最後に、一時的なタイル透かしが元の画像の上に配置されます。
composite "$wmtemp" "$infile" "$outfile"
rm "$wmtemp"