Sortieren nach Bildauflösung (Abmessungen)


7

Welches Programm hat die Funktion, Bilder nach Pixelgröße / Auflösung / Abmessungen zu sortieren.

Sehr seltsam, aber dennoch so leistungsfähig. DigiKam hat keine so einfache Funktion.

Irgendwelche Vorschläge?

Antworten:


7

Ich habe keine Ahnung, wie dies funktioniert, aber ImageMagick hat eine identifyAnwendung, die ich in den letzten zehn Minuten lernen muss. Besser als alles andere hat es ein -formatArgument, wo man rechnen kann!

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

Wenn Sie eine bestimmte Größe überschreiten, erhalten Sie leider eine wissenschaftliche Notation (z. B. 1,2 * 10 ^ 3) anstelle einer Ganzzahl, die von identify zurückgesetzt wird. Zum Glück hat sort ein -gArgument, das sie auswerten wird.

Bei denselben Dateien dauert diese Version (nicht für Perl) nur 60% der Zeit, die die Perl-Version benötigt. Das heißt nicht, dass Perl langsam ist, aber es ist eine unnötige Komplikation, die die Dinge verlangsamt (glaube ich), in Perl einzusteigen und das Subshelling wieder aufzunehmen.

Meins ist immer noch nicht ideal. Das Sortieren von Zahlen in Ganzzahlen zum Sortieren ist ziemlich langsam. Idealerweise würden Sie dies alles intern in einer Sprache tun, wobei die Größe durchgehend als Ganzzahl bleibt ... Aber das Obige ist der kürzeste und schärfste Einzeiler, den ich machen kann.


Sind Sie sicher, dass Sie sort -gmit der wissenschaftlichen Notation richtig umgehen? Ich frage, weil (echo 1.45e+06; echo 1.15e+06; echo 1.44e+06; echo 5; echo 2) | sort -geine merkwürdige Bestellung zurückgibt (ich habe mit Bash getestet)
Sylvain Pineau

@ SylvainPineau gibt es immer noch etwas Seltsames zurück? Es sortiert für mich richtig (2,5,1,15e + 06,1,44e + 06,1,45e + 06).
Terdon

@terdon es hängt vom Gebietsschema ab, getestet LC_ALL=Cdamit funktioniert es wie erwartet.
Sylvain Pineau

6

Wenn Sie nach einem Befehlszeilentool suchen, sortiert der folgende Befehl Bilddateien, bei denen die höchste Auflösung an erster Stelle steht:

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)}<>'

Ich sortiere die Dateien im Grunde genommen mit der Sub-Subroutine perl sort, wobei der Schlüssel hier darin besteht, den identifyBefehl aufzurufen und seine formatierte Ausgabe auszuwerten.

identifyist mit dem imagemagickPaket erhältlich:

sudo apt-get install imagemagick

UPDATE :

Der folgende Befehl gibt auch die Auflösung aus:

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))}<>'

Beispiel:

./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

Ich habe imagemagick bereits installiert. Ich gebe Ihren Befehl in den Ordner mit JPG- und PNG-Bildern ein, und es gibt auch XMP-Dateien, und es werden mir einige Fehler angezeigt, die ich nicht verstehe: ' identify.im6: unable to open image ./estrada: No such file or directory @ error/blob.c/OpenBlob/2638. identify.im6: no decode delegate for this image format ./estrada @ error/constitute.c/ReadImage/544.' Wenn das wichtig ist, enthalten Dateinamen keine Leerzeichen.
Bartek

Sie müssen den ersten findBefehl korrekt verwenden, um nur Bilder zu filtern. Andernfalls identifyschlägt dieser Fehler fehl. Ich habe es bekommen, als ich es versuchtefind . -iname "*"
Sylvain Pineau

Ich habe Unterstützung für Dateinamen hinzugefügt, die Leerzeichen enthalten. Bitte versuchen Sie es erneut mit dem neuen Befehl
Sylvain Pineau

Das Snippet zur Ausgabeauflösung ist großartig, danke! Es hilft, jedes Bild mit einer neuen Zeile zu trennen: find . -iname "*.png" -o -iname "*.jpg" | perl -e '$f=sub{`identify -format %w*%h ${\quotemeta(shift)} 2>/dev/null`};chomp&&print "$_\t".$f->($_)."\n" for sort{eval($f->($b))<=>eval($f->($a))}<>'
Mike Chelen

2

Mit find, file --mime-type, identify, awkundsort

Mit file --mime-typefinden wir alle Bilder , auch ohne Erweiterung.

Die einzeilige Zeile am Ende dieser Antwort weist ein Problem mit Zeilenumbrüchen im Dateinamen auf. Deshalb hier eine andere 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

Beispielausgabe

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

Dies ist die Datei mit dem Zeilenumbruch im Dateinamen:

47275 ./foo
bar.png

Vielen Dank an @terdon , @don_crissti und @glennjackman für die Antworten hier .


Alte Version mit einem Problem, wenn der Dateiname Zeilenumbrüche enthält

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

Beispielausgabe

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

1

Spät zur Party , aber hier ist meine Version mit find, exiftoolund sort:

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

Es ist etwas langsam, funktioniert aber. Beispielausgabe:

$ 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


0

Olis Antwort funktioniert. Hier ist eine Änderung, um das Minimum an Breite und Höhe aufzulisten

find * -type f -exec identify -format "%[fx:w>h?h:w] %i\n" {} \+ | sort -g
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.