Como cortar automaticamente com o Imagemagick mantendo uma pequena borda?

Como cortar automaticamente com o Imagemagick mantendo uma pequena borda?

Tenho um grande número de arquivos que apresentam a imagem de uma moeda em um fundo de feltro preto. Usando o ImageMagick, posso cortar automaticamente essas imagens de maneira bastante direta usando -trim e -fuzz.

A detecção de bordas está funcionando bem, o que eu gostaria de encontrar é um parâmetro que me permitisse dizer "encontre a borda, mas depois faça backup de 10 pixels", ou seja, reter um perímetro de 10 pixels ao redor da moeda em vez de cortar diretamente contra isto. Não desejo adicionar uma nova borda como acontece com o comando -splice, mas sim manter o espaçamento da imagem original.

Até agora não encontrei uma maneira de fazer isso, o mais próximo que consegui foi executá-lo no modo -trim info:-, capturar a saída e recalcular o corte usando um corte manual, mas eu realmente prefiro um processo de uma etapa.

Estou usando o ImageMagick no Windows 10 e, embora tenha instalado as extensões bash, não testei nenhum script nele, portanto, seria preferível uma solução que usasse exclusivamente a linha de comando do Imagemagick.

Responder1

Por falta de uma solução elegante, optei por uma que funcionasse e escrevi um script bash rudimentar que parece fazer o trabalho muito bem. Isso deixa um deslocamento de 25px ao redor da moeda usando o gráfico original para fornecer o plano de fundo. Eventualmente irei parametrizar e limpar isso, mas é o script de trabalho de hoje.

for f in *.jpg; do
    trimbox=$(convert $f -fuzz 25% -format "%@" info:)
    orig=$trimbox
    first=${trimbox%x*}
    trimbox=${trimbox#*x}
    second=${trimbox%%+*}
    trimbox=${trimbox#*+}
    third=${trimbox%+*}
    fourth=${trimbox#*+}
    #echo "trimbox: $orig first: $first second: $second third: $third fourth:$fourth"
    ((first+=50))
    ((second+=50))
    ((third-=25))
    ((fourth-=25))
    trimbox=$first"x"$second"+"$third"+"$fourth
    convert "$f" -crop "$trimbox" +repage "trimmed-$f"
done

Responder2

Você pode usar -bordere -bordercolorpara isso - por exemplo, para uma borda transparente, você pode querer:

for f in *.jpg; do
  convert -fuzz 25% -trim -border 25 -bordercolor none +repage $f trimmed-$f
done

Verhttp://www.imagemagick.org/Usage/crop/#border

informação relacionada