web-dev-qa-db-fra.com

Trier par résolution d'image (dimensions)

Quel programme a une fonction pour trier les images en fonction de leur taille/résolution/dimensions de pixel.

Très étrange mais même si puissant, DigiKam n’a pas une fonction aussi simple.

Aucune suggestion?

7
Bartek

Je ne sais pas du tout comment cela fonctionne, mais ImageMagick a une application identify que je dois apprendre au cours des dix dernières minutes. Mieux que tout, il possède un argument -format permettant de faire des calculs!

find -iname '*.jpg' -exec identify -format "%[fx:w*h] %i\n" {} \+ | sort -g

Malheureusement, si vous dépassez une certaine taille, vous obtenez une notation scientifique (p. Ex. 1.2 * 10 ^ 3) au lieu d’un nombre entier identique à Ident. Heureusement, sort a un argument -g qui les analysera.

Sur les mêmes fichiers ici, cette version (non destinée à Perl) ne prend que 60% du temps de la version Perl. Cela ne veut pas dire que Perl est lent, mais entrer dans Perl et sous-traiter est une complication inutile qui ralentit les choses (je pense).

Le mien n'est toujours pas idéal. Il est assez lent de devoir ré-analyser les nombres en entiers. Idéalement, vous feriez tout cela en interne dans une langue où la taille restera identique à tout le temps ... Mais ce qui précède est le plus court et le plus net des monolignes que je puisse faire.

7
Oli

Si vous recherchez un outil de ligne de commande, la commande suivante triera les fichiers image dans lesquels la résolution la plus élevée est prioritaire:

find . -iname "*.png" -o -iname "*.jpg" | Perl -e '$f=sub{eval(`identify -format %w*%h ${\quotemeta(shift)} 2>/dev/null`)};print sort{$f->($b)<=>$f->($a)}<>'

En gros, je trie les fichiers en utilisant Perlsort où la clé est ici pour appeler la commande identify et évaluer sa sortie formatée.

identify est disponible avec le package imagemagick:

Sudo apt-get install imagemagick

UPDATE:

La commande suivante affichera également la résolution:

find . -iname "*.png" -o -iname "*.jpg" | Perl -e '$f=sub{`identify -format %w*%h ${\quotemeta(shift)} 2>/dev/null`};chomp&&print "$_\t".$f->($_) for sort{eval($f->($b))<=>eval($f->($a))}<>'

Exemple:

./foo bar.png   1600*900
./baz.png       1600*900
./img_0004.jpg  1280*720
./img_0006.jpg  1280*720
./img_0001.jpg  1280*720
./img_0003.jpg  1280*720
./img_0002.jpg  1280*720
./img_0005.jpg  1280*720
./launcher.png  385*632
./textfield.png 402*329
./foo2.png      202*229
5
Sylvain Pineau

Utilisation de find, file --mime-type, identify, awk et sort

En utilisant file --mime-type nous trouvons toutes les images , même sans extension.

La ligne à la fin de cette réponse présente un problème de nouvelles lignes dans le nom du fichier. Donc voici une autre version:

find . -type f -exec sh -c 'file --brief --mime-type "$0" |\
grep -q ^image/ && identify -format "%[fx:w*h] %i\n" "$0"' {} \; |\
sort -g

Exemple de sortie

26696 ./OWoHp.png
37975 ./hUXnc.png
47275 ./foo
bar.png

C'est le fichier avec la nouvelle ligne dans le nom du fichier:

47275 ./foo
bar.png

Merci beaucoup @ terdon , @ don_crissti et @ glennjackman pour les réponses ici .


Ancienne version avec un problème si le nom du fichier contient des retours à la ligne

find . -type f -print0 | \
    xargs -0 -I{} file --mime-type {} | \
    awk -F$"\0" -F": " '/image/ {print $1}' | \
    xargs -I{} identify -format "%[fx:w*h] %i\n" {} | \
    sort -g

Exemple de sortie

9216 ./.face
27918 ./Unbenannt.png
1.0368e+06 ./Images/Wallpapers/14-13.jpg
1.57292e+07 ./Images/Wallpapers/wallpaper_19.jpg
1.57292e+07 ./Images/Wallpapers/wallpaper_22.jpg
1.92e+06 ./Images/Wallpapers/black (10).jpg
2.304e+06 ./Images/Wallpapers/1920x1200.jpg
2.304e+06 ./Images/Wallpapers/1920x1200_Seria_Lunar-Melodies.png
2.304e+06 ./Images/Wallpapers/Anime_girl_129177.jpg
2.304e+06 ./Images/Wallpapers/wallpaper-1802661.jpg
2.304e+06 ./Images/Wallpapers/wallpaper-264390.jpg
3.14368e+06 ./Images/Wallpapers/14 - 2.jpg
3.6864e+06 ./Images/Wallpapers/14-1.jpg
4.096e+06 ./Images/Wallpapers/wallpaper-2850337.jpg
4.096e+06 ./Images/Wallpapers/wt4NRqA.jpg
7.0969e+06 ./Images/Wallpapers/14 - 1.png
2
A.B.

Geeqie peut trier par taille d'image.

Sudo apt install geeqie
1
pLumo

Tard à la fête mais voici ma version avec find, exiftool et sort:

find . -exec exiftool -S -t -q -FileName -ImageSize {} + | sort -k2n,2

C'est un peu lent, mais ça marche. Exemple de sortie:

$ find Downloads -exec exiftool -S -t -q -FileName -ImageSize  {} + | sort -k2n,2 

1433695350670.jpg   1600x1000
1433695350670.jpg   1600x1000
1434999385912.jpg   2212x3318
1434999385912.jpg   2212x3318
1433524966694.jpg   2688x1520
1433524966694.jpg   2688x1520
1433525301504.jpg   2688x1520
1433525301504.jpg   2688x1520
1

La réponse d'Oli fonctionne. Voici une modification pour lister le minimum de largeur et de hauteur

find * -type f -exec identify -format "%[fx:w>h?h:w] %i\n" {} \+ | sort -g
0
bilabila