J'essaie de sélectionner quelques images d'art pour s'adapter à de nouveaux cadres. J'aimerais pouvoir trier ces images par proximité à un rapport d'aspect particulier, puis les visualiser dans un ordre décroissant de proximité à travers quelque chose comme feh.
Existe-t-il une glorieuse expression Unix sur une seule ligne? Sinon, quelques dizaines de lignes de Python devraient clarifier cela.
identify -format "%[fx:w/h]:%M\n" *.jpg
. Je ne sais pas comment trier facilement par proximité d'une valeur arbitraire.sort
ne semble pas supporter un tel tri.Réponses:
En utilisant le commentaire ImageMagick de NN comme piste, il s'avère que vous pouvez lui faire faire des calculs arbitraires dans le cadre de sa
-format
sortie. Donc, une façon possible:devrait faire ce que vous voulez. Notez que 4/3 dans il y a une constante, le rapport d'aspect souhaité. Vous pouvez bien sûr trouver cela en sortie d'un précédent
identify
(pour correspondre à "le plus proche de cette image").Pour expliquer, nous prenons la différence évidente entre la ration d'aspect souhaitée et réelle. Puis multiplier par un grand nombre et arrondir. La multiplication et l'arrondi sont dus au fait que le tri ne gère que les entiers, pas les rationnels.
Éditer
Il s'avère que
sort
cela semble faire des rationnels, pas seulement des entiers. Il est même spécifié dans la spécification Single Unix (v4). Donc, vous pouvez vous débarrasser de cette solution de contournement:la source
33333:cover.jpg
où cover.jpg est 500x500.Eh bien, la façon la plus simple de le faire serait d'utiliser ImageMagick . Il devrait être dans les référentiels de votre distribution Linux, pour les systèmes basés sur Debian, exécutez:
L'un des programmes de la suite ImageMagick est
identify
, cela imprimera les caractéristiques d'une liste de fichiers d'images d'entrée. La combinaison avecsort
vous donnera une liste d'images triées par taille (vous pouvez changer le png pour n'importe quelle extension):Si vous avez réellement besoin du rapport d'aspect et pas seulement de la taille, essayez quelque chose comme ceci:
Option simple, suppose que vos noms d'images n'ont pas d'espaces :
La commande gawk divise le 3ème champ (la taille d'image qui a le format LxH) en "tailles" de tableau puis imprime le 1er champ (le nom de l'image) et le résultat de la division de la longueur de l'image par sa hauteur. La
sed
commande embellit simplement la sortie et lasort
commande trie le résultat en fonction du rapport de taille d'image.Plus complexe, celui-ci peut gérer les espaces dans les noms de fichiers:
Ici, nous utilisons
find
pour identifier les fichiers qui nous intéressent et exécuter laidentify
commande, puis canaliser sa sortie via un petit script PERL. L'expression régulière recherche trois lettres majuscules ([A-Z]{3}
) qui devraient être le format d'image. Une fois que nous avons trouvé cela, il est facile d'identifier le nom et les dimensions de l'image.Je n'utilise pas gawk ici parce que la présence d'espaces dans les noms de fichiers d'entrée confondra les numéros de champ. Enfin, le script imprimera le nom de l'image et le résultat de la division longueur / hauteur que nous avons
sort
numériquement.Si le simple fait de parcourir les rapports d'aspect disponibles ne suffit pas, si vous avez au moins une image avec le rapport d'aspect souhaité, utilisez simplement grep pour extraire les images dont le rapport est le plus proche:
la source
Vous pouvez calculer la différence de chaque rapport d'aspect avec la référence. Ressemble à la réponse de Derobert, mais plus simple:
la source
Un rapport d'aspect n'est qu'un nombre, vous pouvez donc parcourir les images en fonction de leurs noms, si le nom est préfixé par le rapport d'aspect. La création de liens symboliques avec le rapport d'aspect pré-suspendu vous permet de parcourir les images triées par rapport d'aspect.
Les visionneuses suivantes fonctionnent comme prévu. ( feh ne fait pas avancer / reculer, même pour de vraies images - sur mon système)
Allez dans le
ar-sort
répertoire et naviguez à partir du point de départ (rapport d'aspect) qui vous intéresse.Les noms des liens symboliques ressemblent à ceci:
la source
Mon raisonnement habituel consiste à utiliser la mesure de la distance d'erreur au carré partout où j'entends des mots "degré de proximité". On peut sûrement utiliser des valeurs absolues, et ce serait plus rapide. Le script prend comme argument le rapport hauteur / largeur idéal , traite tous les fichiers * .jpg du répertoire courant et les sort triés dans l'ordre croissant de divergence par rapport au rapport idéal.
head
supprime le caractère de fin de ligne inséré par ImageMagick.Le script contient une commande gawk qui définit le séparateur de champ de sortie sur un caractère improbable, calcule la différence au carré et imprime la différence de paire | nom de fichier. Le tri est effectué et les informations inutiles (différence de rapport hauteur / largeur au carré) sont supprimées
cut
.la source