como centralizar a marca d'água de azulejos vertical

4

Eu uso o imagemagick para adicionar uma marca d'água às minhas fotos. A linha de comando é a seguinte:

composite -tile -gravity center watermark.png somefile.jpg somefile.jpg

Mas a marca d'água não está centralizada verticalmente. Parece assim:

Eu gostaria de começar do centro. Como posso fazer isso?

    
por wryrych 16.08.2012 / 10:22

1 resposta

3

Primeiro, obtenha as dimensões das imagens de base e marca d'água:

#!/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"'

Em seguida, calcule quantas peças completas podem ser colocadas na imagem de base:

tilew=$(($basew / $wmw * $wmw))
tileh=$(($baseh / $wmh * $wmh))

Isso usa aritmética inteira, então a operação de multiplicação não neutraliza a divisão. Vamos dar um exemplo. Se a imagem de base for 100x100 e a imagem de mosaico 34x34, isso produzirá 68x68, já que você não consegue encaixar um terceiro bloco em nenhum eixo.

Note que estamos usando um recurso de Bash aqui para fazer aritmética dentro do próprio script de shell. Se você tiver que fazer isso em outro shell, poderá chamar bc ou dc para fazer o cálculo externamente.

Agora que sabemos o tamanho que podemos criar, crie uma versão temporária da imagem de marca d'água centralizada em um quadro igual ao tamanho da imagem de base:

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

Observe que isso força a imagem da marca d'água ao formato RGBA, se ainda não o foi. Além disso, é importante que a diretiva -background 'rgba(0,0,0,0)' esteja antes da imagem de entrada, portanto, ela não faz a operação de colocação sobre o fundo branco padrão.

O verdadeiro truque aqui é que estamos usando valores diferentes para as diretivas -size e -extent . Estamos construindo uma imagem em mosaico potencialmente menor e, em seguida, preenchendo-a, se necessário, para corresponder ao tamanho da imagem base. Se o tamanho da imagem do bloco se dividir uniformemente no tamanho da imagem base, tudo bem, simplesmente não será necessário adicionar nenhum preenchimento extra para centralizar o conjunto de blocos.

Por fim, coloque a marca d'água de mosaico temporária sobre a imagem original:

composite "$wmtemp" "$infile" "$outfile"
rm "$wmtemp"
    
por 16.08.2012 / 22:57