저는 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))
이것은 정수 산술을 사용하므로 곱셈이 나눗셈을 취소하지 않습니다. 예를 들어 보겠습니다. 기본 이미지가 100x100이고 타일 이미지가 34x34인 경우 어느 축에도 세 번째 타일을 완전히 맞출 수 없기 때문에 68x68이 됩니다.
여기서는 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"