shell script para coletar o tamanho do pixel da imagem

1

Estou tentando criar um script de shell que retorne a maior imagem no tamanho total do pixel?

Por exemplo:

Eu tenho muitos diretórios acima de 7000+, cada diretório tem imagens:

dir_1/
picture_1.png = 800x600
picture_2.png = 80x100
picture_3.png = 80x640
picture_4.png = 500x630

dir_2/
p_1.png = 800x600
p_2.jpeg = 800x1000
p_3.png = 180x1640
p_4.gif = 500x30

Portanto, o resultado esperado é:

 the largest one in dir_1 is: picture_1.png 
 the largest one is dir_2 is: p_2.png 

Então eu estava pensando que a melhor maneira é descobrir o total de dimensões depois de coletar os números. por isso eu tento criar script bash com o comando sips que pode coletar as figuras

Exemplo:

 for f in *;
 do
 far=$( cd $f/OEBPS/image/ | ls * | egrep 'jpg|png|jpeg')

 W=$( sips -g pixelWidth $far | cut -f 2 -d":" )
 H=$( sips -g pixelHeight $far | cut -f 2 -d":" )

 coll=$(expr $W + $H)
 echo $f total is: $coll
 cd -
 done

Mas tem erro no resultado.

Alguma ideia ou melhor maneira?

    
por jassim mishal 25.04.2015 / 16:42

2 respostas

3

aqui está uma maneira de obter a altura e a largura em uma etapa:

IFS=x read w h < <(identify "$file" | grep -oP '\d+x\d+(?=\+)')

identify faz parte do pacote ImageMagick.

Seu "$ far" certamente não é o que você quer:

for dir in */OEBPS/image/; do
    for image in "$dir"/*.{jpg,png,jpeg}; do
        IFS=x read w h < <(identify "$image" | grep -oP '\d+x\d+(?=\+)')
        echo $((w*h)) "$image"
    done | sort -n | tail -1 | {
        read size file
        echo "largest in $dir is $file"
    }
done

Na verdade, identify pode receber vários arquivos, portanto, uma técnica mais eficiente:

for dir in */OEBPS/image/; do
    identify "$dir"/*.{jpg,png,jpeg} |
    awk '{split($(NF-6), a, /x/); split($0, b, /[[]/); print a[1]*a[2], b[1]}' |
    sort -n | tail -1 | {
        read size file
        echo "largest in $dir is $file"
    }
done

O comando awk é um pouco complicado porque eu quero manipular nomes de imagens que podem conter espaços

    
por 25.04.2015 / 17:16
0
#!/bin/bash
file=""
max=0
for f in /OEBPS/image/*{png,jpg,jpeg}
do
  id=$(identify "$f") 
  size=$(echo ${id} | sed -r 's/.* (JPEG|PNG) ([0-9]+)x([0-9]+) .*/*/')   
  area=$(($size))
  if (( area >= max ))
  then
    max=$area
    file="$f"
  fi
done
echo $max $file
  • Não use ls para iterar arquivos em scripts - os espaços em branco nos nomes dos arquivos os afetarão.
  • Não faça cd por perto.
  • Não precisamos de classificação para encontrar o maior arquivo por área.
  • Para fazer aritmética no bash, você não precisa expr , mas $ ((a * b)).

Identifique as necessidades ImageMagick .

O comando sed falhará se o nome do seu arquivo parecer muito próximo, como a saída identify .

    
por 25.04.2015 / 19:50

Tags