Я пытаюсь выбрать несколько художественных изображений для новых кадров. Я хотел бы иметь возможность сортировать эти изображения по близости к определенному соотношению сторон, а затем просматривать их в порядке убывания близости через что-то вроде feh.
Есть ли какое-нибудь великолепное однострочное выражение Unix? В противном случае несколько десятков строк Python должны прояснить это.
identify -format "%[fx:w/h]:%M\n" *.jpg
. Я не знаю, как легко отсортировать по близости к произвольному значению.sort
похоже не поддерживает такую сортировку.Ответы:
Используя комментарий NM ImageMagick в качестве ведущей, получается, что вы можете сделать произвольные вычисления как часть его
-format
вывода. Итак, один из возможных способов:должен делать то, что вы хотите. Обратите внимание, что 4/3 есть постоянное, желаемое соотношение сторон. Конечно, вы можете найти это как вывод предыдущего
identify
(для соответствия «ближе всего к этому изображению»).Чтобы объяснить, мы берем явную разницу между желаемым и фактическим соотношением сторон. Затем умножаем на большое число и округляем. Умножение и округление происходит потому, что сортировка обрабатывает только целые числа, а не рациональные.
редактировать
Оказывается,
sort
это действительно рациональные, а не целые числа. Это даже указано в спецификации Single Unix (v4). Итак, вы можете избавиться от этого обходного пути:источник
33333:cover.jpg
где cover.jpg 500x500.Ну, самый простой способ сделать это - использовать ImageMagick . Он должен быть в репозиториях вашего дистрибутива Linux, для систем на основе Debian:
Одной из программ пакета ImageMagick является
identify
печать характеристик списка файлов входных изображений. В сочетании с нимsort
вы получите список изображений, отсортированных по размеру (вы можете изменить png для любого расширения:)Если вам действительно нужно соотношение сторон, а не только размер, попробуйте что-то вроде этого:
Простой вариант, предполагает, что имена ваших изображений не имеют пробелов :
Команда gawk разделяет 3-е поле (размер изображения в формате LxH) на массив «размеры», а затем печатает 1-е поле (имя изображения) и результат деления длины изображения на его высоту. Команда
sed
просто украшает вывод, иsort
команда сортирует результат в соответствии с размером изображения.Более сложный, этот может иметь дело с пробелами в именах файлов:
Здесь мы используем
find
для идентификации интересующих нас файлов и запускаемidentify
команду, а затем передаем ее вывод с помощью небольшого сценария PERL. Регулярное выражение ищет три заглавные буквы ([A-Z]{3}
), которые должны быть форматом изображения. Как только мы нашли это, легко определить имя и размеры изображения.Я не использую gawk здесь, потому что наличие пробелов в именах входных файлов будет путать номера полей. Наконец, скрипт распечатает имя изображения и результат деления длины / высоты, которое мы
sort
численно выполнили.Если простого просмотра доступных соотношений сторон недостаточно, если у вас есть хотя бы одно изображение с желаемым соотношением сторон, просто используйте grep, чтобы извлечь те изображения, соотношение которых является ближайшим:
источник
Вы можете вычислить разницу каждого соотношения сторон с помощью ссылки. Выглядит как ответ Дероберта, но проще:
источник
Соотношение сторон - это просто число, поэтому вы можете просматривать изображения в соответствии с их именами, если к имени добавлен префикс отношения сторон. Создание символических ссылок с предварительно установленным соотношением сторон позволяет просматривать изображения, отсортированные по соотношению сторон.
Следующие зрители работают как положено. ( feh не пересылает / назад, даже для реальных изображений - в моей системе)
Зайдите в
ar-sort
каталог и просто просмотрите любую начальную точку (соотношение сторон), которая вас интересует.Имена символических ссылок выглядят так:
источник
Моя обычная аргументация заключается в использовании квадрата метрики расстояния ошибки везде, где я слышу слова «степень близости». Можно, конечно, использовать абсолютные значения, и это будет быстрее. Сценарий принимает в качестве аргумента идеальное соотношение сторон, обрабатывает все файлы * .jpg в текущем каталоге и выводит их, отсортированные в порядке возрастания отклонения от идеального соотношения.
head
удаляет завершающий символ конца строки, вставленный ImageMagick.Сценарий содержит команду gawk, которая устанавливает разделитель выходного поля на маловероятный символ, вычисляет квадратную разницу и выводит обратно разность пар | имя файла. Выполняется сортировка и отбирается ненужная информация (квадратная разница пропорций)
cut
.источник