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?
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.
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 Perl
sort 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
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
Geeqie peut trier par taille d'image.
Sudo apt install geeqie
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
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