Como redimensionar apenas as imagens perdidas?

2

Eu tenho um diretório com 10.000 JPEGs. Eu cometi um erro ao gerar os arquivos e agora alguns são 720px × 480px, mas todos devem ser 448px × 336px. O diretório contém os arquivos muito grandes e o tamanho correto de 448px × 336px. Eles precisam ter o mesmo tamanho, por isso preciso escalar as imagens 720px × 480px para os 448px × 336px corretos.

  • Todo arquivo deve ter 448px × 336px.
  • Como existem 10.000 arquivos, é difícil verificar cada um deles para ver quais são muito grandes.

Existe alguma maneira de usar o ImageMagick ou uma ferramenta em lote semelhante para redimensionar seletivamente apenas essas imagens de tamanho errado?

    
por Village 24.10.2014 / 10:23

2 respostas

3

Você pode encontrar os arquivos com 720 pixels de largura com o seguinte comando:

identify -format '%w %i\n' *.jpg | awk '/^720/ {print $2}'

Possivelmente use essa variação se realmente houver muitos arquivos que possam levar à expansão * .jpg para dar o erro "lista de argumentos muito longa":

find -name '*.jpg' -exec identify -format '%w %i\n' {} + | awk '/^720/ {print $2}'

Com essa lista, você pode redimensionar esses arquivos, por exemplo:

find -name '*.jpg' -exec identify -format '%w %i\n' {} + | awk '/^720/ {print $2}' | xargs -I {} convert -resize 488x336! {} {}

O ponto de exclamação! depois que o 488x336 força a nova imagem a ter exatamente esse tamanho; sem ele, a proporção é preservada e o tamanho dado é dimensões máximas para largura e altura.

    
por 24.10.2014 / 11:28
3

Pode-se esperar que

convert in.jpg -resize "448x336!" out.jpg

não tocaria no arquivo se o tamanho já estiver correto?
Não é claro - mas pensando na forma como o formato da linha de comando da imagemagic funciona, isso não é surpreendente.

Portanto, as dimensões da imagem de cada arquivo precisam ser verificadas primeiro. Agora, queremos usar o ImageMagic, que possui o comando identify para esse propósito;

identify -format "%wx%h\n" file.jpg

mostra apenas o tamanho em WxH format, como 448x336 .

Queremos redimensionar se o tamanho não for 448x336 . Nesse caso, usamos convert para redimensionar para 448x336 - precisamos informar convert que queremos redimensionar mesmo que isso signifique alterar a proporção para forçar a imagem para as novas dimensões - fazemos isso adicionando um ! como uma opção / sinalizador na especificação de tamanho:

convert in.jpg -resize "448x336!" out.jpg

faz o redimensionamento de que precisamos. Mas nós não temos um nome de arquivo fixo para a saída. Vamos pegar o nome original e inserir -res antes do .jpg , como in-res.jpg :

convert in.jpg -resize "448x336!" -set filename:path "%d/%t-res.%e" "%[filename:path]"

Nós usamos o comando find para percorrer os diretórios para ' .jpg' images - or " .JPG". A parte identify é executada em um shell para usar o comando test , [ ... ] . Eu também uso um shell para o comando convert , que é executado se a primeira ação -exec (não a opção) for bem-sucedida. Neste caso, é apenas para executar um segundo comando depois de redimensionar, mostrando uma mensagem para cada arquivo redimensionado.

find  . -type f -iname "*.jpg" -exec bash -c \
    '[ $(identify -format "%wx%h\n" "{}") != 448x336 ]' \;  -exec bash -c \
    'convert "{}" -resize "448x336!" -set filename:path "%d/%t-res.%e" \
    "%[filename:path]" ; echo "Resized {}"' \; 

Em vez do segundo bash , pode-se usar -exec convert ... simples e adicionar uma nova ação, como -print ou -ls , para mostrar os nomes dos arquivos redimensionados.

O comando é uma linha tecnicamente (mostrada com linhas de continuação para evitar a rolagem). E, após essa explicação, de alguma forma eu sinto que a linha ainda não é fácil de ler ...

    
por 24.10.2014 / 11:29