Próbuję wybrać kilka obrazów artystycznych, aby pasowały do nowych ramek. Chciałbym móc sortować te obrazy według odległości od określonego współczynnika kształtu, a następnie wyświetlać je w malejącej kolejności bliskości przez coś w rodzaju feh.
Czy jest jakaś chwalebna jednowierszowa ekspresja Uniksa? W przeciwnym razie kilkadziesiąt linii Pythona powinno to wyjaśnić.
identify -format "%[fx:w/h]:%M\n" *.jpg
. Nie wiem, jak łatwo sortować według bliskości dowolnej wartości.sort
nie obsługuje takiego sortowania.Odpowiedzi:
Używając komentarza ImageMagick firmy NN jako potencjalnej szansy, okazuje się, że możesz mieć do wykonania dowolnych obliczeń w ramach
-format
wyników. Więc jeden możliwy sposób:powinien robić co chcesz. Zauważ, że 4/3 jest tam stała, pożądany współczynnik kształtu. Można oczywiście znaleźć to jako wynik poprzedniego
identify
(w celu dopasowania „najbliżej tego obrazu”).Aby wyjaśnić, bierzemy wyraźną różnicę między pożądanym a rzeczywistym współczynnikiem proporcji. Następnie pomnożenie przez dużą liczbę i zaokrąglenie. Mnożenie i zaokrąglanie jest spowodowane tym, że sort obsługuje tylko liczby całkowite, a nie racjonalne.
edytować
Okazuje się,
sort
że robi racjonalne, nie tylko liczby całkowite. Jest nawet określony w specyfikacji Single Unix (v4). Możesz więc pozbyć się tego obejścia:źródło
33333:cover.jpg
cover.jpg to 500 x 500.Najłatwiejszym sposobem na to byłoby użycie ImageMagick . Powinien znajdować się w repozytoriach twojej dystrybucji Linuksa, dla systemów opartych na Debianie uruchom:
Jednym z programów pakietu ImageMagick jest
identify
to, że wydrukuje on charakterystykę listy wejściowych plików obrazów. Łącząc go zsort
, otrzymasz listę zdjęć posortowanych według rozmiaru (możesz zmienić png dla dowolnego rozszerzenia (-ów):Jeśli faktycznie potrzebujesz proporcji, a nie tylko rozmiaru, spróbuj czegoś takiego:
Prosta opcja, zakłada , że w nazwach obrazów nie ma spacji :
Polecenie gawk dzieli trzecie pole (rozmiar obrazu, który ma format LxH) na tablicę „rozmiary”, a następnie drukuje pierwsze pole (nazwa obrazu) i wynik podziału długości obrazu przez jego wysokość.
sed
Komenda jest tylko upiększania wyjścia isort
polecenie sortuje wyniki według wskaźnika rozmiaru obrazu.Bardziej złożony, ten może zajmować się spacjami w nazwach plików:
Tutaj używamy
find
do identyfikowania plików, którymi jesteśmy zainteresowani, i uruchamiamyidentify
polecenie, a następnie przesyłamy dane wyjściowe za pomocą małego skryptu PERL. Wyrażenie regularne szuka trzech wielkich liter ([A-Z]{3}
), które powinny być formatem obrazu. Po stwierdzeniu, że łatwo jest zidentyfikować nazwę i wymiary obrazu.Nie używam tutaj gawk, ponieważ obecność spacji w nazwach plików wejściowych myli numery pól. Na koniec skrypt wydrukuje nazwę obrazu i wynik podziału długości / wysokości, który
sort
liczbowo.Jeśli samo przeglądanie dostępnych współczynników proporcji nie wystarczy, jeśli masz co najmniej jeden obraz o pożądanym współczynniku proporcji, po prostu użyj grep, aby wyodrębnić te obrazy, których współczynnik jest najbliższy:
źródło
Możesz obliczyć różnicę dla każdego współczynnika kształtu z odniesieniem. Wygląda na odpowiedź deroberta, ale prostszą:
źródło
Współczynnik kształtu to tylko liczba, więc możesz przeglądać obrazy według ich nazw, jeśli nazwa jest poprzedzona współczynnikiem kształtu. Tworzenie dowiązań symbolicznych z uprzednio przygotowanym współczynnikiem proporcji pozwala przeglądać obrazy posortowane według współczynników proporcji.
Następujący przeglądający działają zgodnie z oczekiwaniami. ( feh nie przesyła dalej / wstecz, nawet dla prawdziwych obrazów - w moim systemie)
Przejdź do
ar-sort
katalogu i po prostu przeglądaj od dowolnego punktu początkowego (proporcji), który Cię interesuje.Nazwy dowiązań symbolicznych wyglądają tak:
źródło
Moje zwykłe rozumowanie polega na stosowaniu kwadratowej miary odległości błędu wszędzie tam, gdzie słyszę słowa „stopień bliskości”. Z pewnością można użyć wartości bezwzględnych i byłoby to szybsze. Skrypt przyjmuje jako argument idealny współczynnik proporcji, przetwarza wszystkie pliki * .jpg w bieżącym katalogu i wysyła je posortowane w rosnącym porządku rozbieżności od idealnego współczynnika.
head
usuwa końcowy znak końca linii wstawiony przez ImageMagick.Skrypt zawiera polecenie gawk, które ustawia separator pola wyjściowego na mało prawdopodobny znak, oblicza różnicę do kwadratu i wypisuje różnicę nazwy pliku | Sortowanie jest wykonywane, a zbędne informacje (różnica kwadratów) są usuwane
cut
.źródło