Pergunta

Eu preciso cortar várias imagens em jpeg Formato por 20 pixels no lado direito sem perdas no Linux.

eu chequei jpegtran, mas ele precisa do tamanho do arquivo em pixels antes do corte, e não sei como criar um arquivo em lote com isso.

Como posso cortar sem perdas 20 pixels do lado direito das imagens programaticamente?

Foi útil?

Solução

Meu script de shell está um pouco enferrujado, então faça um backup de suas imagens antes de experimentar este script.

#!/bin/bash
FILES=/path/to/*.jpg

for f in $FILES
do
    identify $f | awk '{ split($3, f, "x"); f[1] -= 20; cl = sprintf("jpegtran -crop %dx%d+0+0 %s > new_%s", f[1], f[2], $1, $1); system(cl); }'
done

Pontos a serem observados:

  • Ajuste o caminho para o valor correto
  • Você precisa *.jpeg?
  • identify é um comando imagemagick
  • awk vai pegar as dimensões de pixel de identify para usar como um parâmetro (com a largura reduzida em 20px) para jpegtran Para cortar a imagem
  • A nova imagem é salva como new_[old_name].jpg
  • jpegtran pode ajustar a região de cultivo para que possa ter um desempenho sem perdas. Verifique se as imagens resultantes são o tamanho correto e não são um pouco maiores.

Outras dicas

Muito semelhante à resposta aceita, o seguinte também funcionaria com nomes de arquivos que contêm espaços. E é sem dúvida mais simples, usando identifyestá embutido -format opção Em vez de analisar a saída com awk.

#!/bin/bash

X=0; Y=0   # offset from top left corner

for f in /path/to/*.jpg; do
    read -r W H < <(identify -format '%w %h' "$f") # get width and height
    (( W -= 20 ))                                  # substract 20 from width
    out="${f%%.jpg}-crop-20.jpg"                   # add "-crop-20" to filename
    jpegtran -crop ${W}x$H+$X+$Y "$f" > "$out"     # crop
done
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top