Ich versuche ein paar Kunstbilder auszuwählen, um sie an einige neue Rahmen anzupassen. Ich möchte in der Lage sein, diese Bilder nach Nähe zu einem bestimmten Seitenverhältnis zu sortieren und sie dann in abnehmender Reihenfolge der Nähe durch so etwas wie Feh zu betrachten.
Gibt es einen herrlichen einzeiligen Unix-Ausdruck? Andernfalls sollten ein paar Dutzend Python-Zeilen dies aufklären.
identify -format "%[fx:w/h]:%M\n" *.jpg
. Ich weiß nicht, wie ich leicht nach der Nähe zu einem beliebigen Wert sortieren kann.sort
scheint eine solche Sortierung nicht zu unterstützen.Antworten:
Wenn Sie den ImageMagick-Kommentar von NN als Hinweis verwenden, können Sie im Rahmen der
-format
Ausgabe beliebige Berechnungen durchführen . Also ein möglicher Weg:sollte tun, was du willst. Beachten Sie, dass 4/3 darin eine Konstante ist, das gewünschte Seitenverhältnis. Sie könnten das natürlich als Ausgabe einer vorherigen finden
identify
(entspricht "diesem Bild am nächsten").Zur Erklärung nehmen wir den einfachen Unterschied zwischen dem gewünschten und dem tatsächlichen Seitenverhältnis. Dann mit einer großen Zahl multiplizieren und runden. Das Multiplizieren und Runden ist, weil sort nur Ganzzahlen behandelt, keine Rationalen.
bearbeiten
Es hat sich herausgestellt
sort
, dass dies nicht nur Ganzzahlen, sondern auch Rationalitäten sind. Es ist sogar in der Single Unix Specification (v4) spezifiziert. So können Sie diese Problemumgehung loswerden:quelle
33333:cover.jpg
wo cover.jpg 500x500 ist.Am einfachsten geht das mit ImageMagick . Es sollte sich in den Repositories Ihrer Linux-Distribution befinden und für Debian-basierte Systeme ausgeführt werden:
Eines der Programme der ImageMagick-Suite ist
identify
, dass hiermit die Eigenschaften einer Liste von Eingabebilddateien gedruckt werden. Wenn Sie es mitsort
kombinieren, erhalten Sie eine Liste der Bilder, sortiert nach Größe (Sie können png für jede Erweiterung ändern, die Sie haben:Wenn Sie tatsächlich das Seitenverhältnis und nicht nur die Größe benötigen , versuchen Sie Folgendes:
Einfache Option, vorausgesetzt Ihre Bildnamen haben keine Leerzeichen :
Der Befehl gawk teilt das 3. Feld (die Bildgröße im Format LxH) in das Array "Größen" auf und druckt dann das 1. Feld (den Bildnamen) und das Ergebnis der Division der Länge des Bildes durch seine Höhe. Der
sed
Befehl verschönert lediglich die Ausgabe undsort
sortiert das Ergebnis nach dem Bildgrößenverhältnis.Komplexer kann dieser mit Leerzeichen in Dateinamen umgehen:
Hier
find
identifizieren wir die Dateien, an denen wir interessiert sind, führen denidentify
Befehl aus und leiten seine Ausgabe über ein kleines PERL-Skript weiter. Der reguläre Ausdruck sucht nach drei Großbuchstaben ([A-Z]{3}
), die das Bildformat haben sollen. Sobald wir das gefunden haben, ist es einfach, den Bildnamen und die Abmessungen zu identifizieren.Ich benutze gawk hier nicht, weil das Vorhandensein von Leerzeichen in den Eingabedateinamen die Feldnummern verwirren wird. Schließlich druckt das Skript den Namen des Bildes und das Ergebnis der von uns
sort
numerisch ermittelten Längen- / Höhenunterteilung aus .Wenn das einfache Durchsuchen der verfügbaren Seitenverhältnisse nicht ausreicht und Sie mindestens ein Bild mit dem gewünschten Seitenverhältnis haben, extrahieren Sie mit grep die Bilder, deren Verhältnis am nächsten liegt:
quelle
Sie können die Differenz jedes Seitenverhältnisses mit der Referenz berechnen. Sieht aus wie die Antwort von derobert, ist aber einfacher:
quelle
Ein Seitenverhältnis ist nur eine Zahl, so dass Sie die Bilder nach ihren Namen durchsuchen können, wenn dem Namen das Seitenverhältnis vorangestellt wird. Wenn Sie symbolische Verknüpfungen mit dem vorher festgelegten Seitenverhältnis erstellen, können Sie die Bilder nach Seitenverhältnis sortieren.
Die folgenden Viewer funktionieren wie erwartet. ( feh nicht vorwärts / rückwärts, auch für echte Bilder - auf meinem System)
Gehen Sie in das
ar-sort
Verzeichnis und navigieren Sie von einem beliebigen Ausgangspunkt (Seitenverhältnis) aus, an dem Sie interessiert sind.Die symbolischen Linknamen sehen folgendermaßen aus:
quelle
Meine übliche Argumentationsweise ist die Verwendung der Quadratfehlerdistanz-Metrik, wo immer ich Wörter "Grad der Nähe" höre. Man kann sicherlich absolute Werte verwenden, und es wäre schneller. Das Skript verwendet als Argument das ideale Seitenverhältnis, verarbeitet alle * .jpg-Dateien im aktuellen Verzeichnis und gibt sie sortiert in der aufsteigenden Reihenfolge der Abweichung vom idealen Verhältnis aus.
head
Entfernt das von ImageMagick eingefügte hintere Zeilenendezeichen.Das Skript enthält einen Befehl gawk, der das Ausgabefeldtrennzeichen auf ein unwahrscheinliches Zeichen setzt, die quadratische Differenz berechnet und den Paardifferenzdateinamen zurückgibt. Die Sortierung wird durchgeführt und unnötige Informationen (quadratische Seitenverhältnisdifferenz) werden von entfernt
cut
.quelle