Como encontro todas as imagens quadradas em um diretório

4

As imagens são armazenadas em arquivos JPEG e PNG. Quero obter uma lista daqueles que são quadrados.

    
por nwk 26.10.2015 / 22:30

3 respostas

6

Você pode fazer isso usando o comando convert do ImageMagick e do Awk:

convert *.png *.jp* -format '%w %h %f\n' info: | awk '$1==$2 { $1=$2=""; print substr($0, 3) }'

O comando acima mostrará a lista de imagens que têm exatamente o mesmo número de pixels na horizontal e na vertical. Se, em vez disso, o que você deseja encontrar são imagens que apenas aproximam visualmente um quadrado, você pode fazer isso:

# Find all images in which one side is no more than 5% larger than the other.
convert *.png *.jp* -format '%w %h %f\n' info: | awk '($1>$2?$1:$2)/($1>$2?$2:$1)<=1.05 { $1=$2=""; print substr($0, 3) }'

Note que nenhum comando funcionará corretamente se os nomes de arquivo das suas imagens contiverem caracteres de nova linha.

    
por 26.10.2015 / 22:30
3

Aqui está outra maneira de fazer isso (via fx operador especial) que deve funcionar com nomes de arquivos arbitrários :

for f in ./*.jpg
  do
    identify -format '%[fx:(h == w)]' "$f" | grep -q 1 && printf '%s\n' "$f"
  done
    
por 26.10.2015 / 22:43
0

A seguinte solução é baseada na ideia do comentário de @ loa_in_. Ele usa file , que para essa tarefa é consideravelmente mais rápido que convert . Ele também lida com nomes de arquivos "estranhos" corretamente.

file -F '' -0 *.png \
| sed -e 's/^\(.*\)\x00.*PNG.*, \([0-9]\+\) x \([0-9]\+\).*$/  /;s/^\(.*\)\x00.*JPEG.*, \([0-9]\+\)x\([0-9]\+\).*$/  /' \
| awk '$1==$2 { $1=$2=""; print substr($0, 3) }'

A parte de resolução da saída de file parece diferente para arquivos JPEG e PNG, então analisamos separadamente.

    
por 27.10.2015 / 13:07