Optymalizacja obrazu dla Linuksa

  1. Wyszukiwanie i analiza identycznych obrazów
  2. Szybkość optymalizacji obrazu
  3. Optymalizacja obrazu dzięki Leptonowi
  4. Optymalizacja obrazu za pomocą FLIF
  5. Szkicowanie
  6. Szersza implementacja FLIF

Z całą popularnością pamięci masowej w chmurze wielu użytkowników Linuksa zachowuje biblioteki obrazów na swoich dyskach twardych - a następnie są zdziwieni, jak zoptymalizować swoje miejsce. W naszej lekcji zajmujemy się ogromną biblioteką zdjęć, która rośnie od lat, idealnym zadaniem dla administratorów serwerów, którzy obsługują ogromną ilość danych użytkownika lub którzy jeszcze muszą przechowywać kilka obrazów.

Pokażemy, jak zwolnić miejsce bez poświęcania jakości obrazu i powiedzieć, jak przeglądać nową zoptymalizowaną bibliotekę obrazów z komfortem i wygodą. Przyjrzymy się sposobom usuwania duplikatów plików za pomocą prostych, niezawodnych narzędzi, a następnie wyodrębniamy dodatkowe bity z istniejących plików JPEG i PNG, a na koniec śmiało konwertujemy nasze obrazy na kilka formatów następnej generacji.

Zanim zanurzymy się w ekscytującym świecie nowych technologii, przypomnijmy sobie bardziej brutalny, ale bardzo skuteczny sposób na sprawienie, że pliki będą ściśnięte. Powiedzmy, że masz wiele obrazów PNG i chcesz zmniejszyć ich wagę. Możesz nieznacznie zmniejszyć ich skalę i ponownie skompresować je w trybie JPEG ze stratami, a na ekranie będą nadal wyglądać dobrze:

$ mogrify - ścieżka. - zmień rozmiar 70 x 70% - jakość 75 - format jpg *. png

Ten przykład używa mogrify z ImageMagick, który jest dostępny w prawie wszystkich dystrybucjach Linuksa. Poinstruowano go, aby zmniejszył rozmiar wszystkich plików PNG w bieżącym katalogu do 70% i przekonwertował je na JPEG z 75% kompresją. Jest to podstawowe podejście i działa tylko wtedy, gdy możesz sobie pozwolić na utratę nieco jakości obrazu. Jeśli to nie przemawia do Ciebie, czytaj dalej, znajdziesz wspaniałe wskazówki na temat magii bez strat!

POLECAM: Najprostsze dystrybucje Linuksa

Wyszukiwanie i analiza identycznych obrazów

Te same pliki obrazów są często wynikiem kopiowania zdjęć z nośników zewnętrznych na dysk twardy podczas próby ręcznego sortowania obrazów przy użyciu katalogów według daty. Ostatecznie w takich katalogach są częściowo zduplikowane zestawy obrazów, co nie jest idealne.

Nadmiarowa kopia zapasowa i proste kopie również przyczyniają się do rosnącej liczby dodatkowych plików. Większość dystrybucji Linuksa ma w repozytoriach aplikację fdupes, która powinna znaleźć te same pliki, ale obrazy potrzebują czegoś potężniejszego.

Zduplikowane obrazy mogą mieć inne nazwy i rozmiary, a także możemy potrzebować znaleźć nie identyczne, ale bardzo podobne obrazy, na przykład edytowane lub te, które zostały nakręcone podczas długiej sesji zdjęciowej. Oczywiście, możemy rozwiązać problem za pomocą jakiejś sieci neuronowej, ale będzie to jak walenie orzechów młotkiem kowala.

Istnieje znacznie bardziej lekkie rozwiązanie - choć o dziwnej nazwie. Jest to zestaw skryptów Go, który analizuje zawartość określonego katalogu i umieszcza odciski palców obrazu w swojej bazie danych. Findimagedupes analizuje czynniki podobieństwa i przedstawia listę identycznych lub wizualnie podobnych zestawów obrazów, które możesz usunąć. Możesz skonfigurować próg podobieństwa, pominąć sprawdzanie obecności identycznych obrazów i użyć wyszukiwania rekurencyjnego w Findimagedupes. Oto przykład:

$. / findimagedupes - R ~ / Pictures

To polecenie przeszuka wewnątrz ~ / Pictures, w tym podkatalogi. Wynik jest wyświetlany w formie prostej listy, gdzie każda linia składa się z pełnej ścieżki do obrazu, oddzielonej spacjami. Aby skonfigurować podobieństwo, określ opcję -t, po której następuje liczba od 0 do 63, gdzie 0 oznacza, że ​​Findimagedupes zidentyfikuje tylko identyczne obrazy, a 63 oznacza, że ​​wszystkie obrazy będą traktowane jako podobne. W poniższym przykładzie użyliśmy rozsądnej i realistycznej liczby między tymi dwoma skrajnościami:

$. / findimagedupes - R - t 30 ~ / Pictures

W tej chwili nie jest do końca jasne, co dalej robić, ale na szczęście Findimagedupes umożliwia otwieranie każdego zestawu obrazów przy użyciu zewnętrznej aplikacji, takiej jak ta:

$. / findimagedupes - R - t 30 - p feh ~ / Pictures

W tym przykładzie użyliśmy Feh, ponieważ jest to najmniej zaawansowane narzędzie do przeglądania obrazów, ale wybór programu należy do Ciebie. Ta ręczna metoda da najbardziej dokładne wyniki, jeśli chcesz dokładnie usunąć duplikaty.

Inny sposób obliczenia podobieństwa obrazu polega na obliczeniu skalarnego oszacowania podobieństwa dla każdej pary. Użyjemy Butteraugli z www.github.com/google/but-teraugli, prostym i przyjaznym dla użytkownika programem do pomiaru zidentyfikowanych różnic między obrazami opartymi na naukowym podejściu. Butteraugli jest łatwy do skompilowania (wystarczy uruchomić $ make) i oferuje prostą składnię wiersza poleceń:

$. / plik butteraugli1 plik2

Butteraugli akceptuje pliki JPEG i PNG i wymaga, aby oba pliki w parze miały ten sam rozmiar w pikselach. Wyświetlana jest liczba - wskaźnik podobieństwa, gdzie 0 oznacza, że ​​obrazy są takie same, a każda inna liczba dodatnia odzwierciedla stopień różnicy. Doskonałą dodaną cechą Butter-augli jest możliwość rysowania „mapy cieplnej” różnic między obrazami. Wszystko, co musisz zrobić, to zdefiniować plik wyjściowy:

$. / plik butteraugli1 plik2 ciepło. ppm

Wynikowy plik PPM pokaże obszary, w których występują różnice między obrazami. Praktycznym celem Butteraugli jest pomoc w identyfikacji zmian, które nie są widoczne gołym okiem. A jeśli Findimagedupes pomaga zidentyfikować podobne obrazy, Butteraugli pokazuje, co dokładnie w nich jest.

Załóżmy teraz, że wszystkie obrazy, które przetrwały naszą Wielką Czystkę, są cenne, ale nadal musimy zmniejszyć zajmowaną przez nie przestrzeń. Inżynierowie Google stworzyli narzędzie, które redukuje pliki jpeg bez poświęcania jakości. Guetzli deklaruje zmniejszenie o 20-30% rozmiaru pliku w porównaniu ze zwykłym sposobem zapisywania plików JPEG do systemu Linux za pomocą libjpeg. Według twórców Guetzli, osiąga on równowagę między minimalną stratą a rozmiarem pliku za pomocą algorytmu wyszukiwania, który próbuje przezwyciężyć różnicę między psycho-wizualnym modelowaniem formatu JPEG a psycho-wizualnym modelem Guetzli.

Szybkość optymalizacji obrazu

Guetzli pracuje powoli. Zgodnie z dokumentacją Google kodowanie danych rastrowych o rozdzielczości jednego megapiksela zajmuje około minuty. Oznacza to, że Guetzli będzie przetwarzać każde z twoich zdjęć boleśnie długo, ale program wygeneruje najlepszą optymalizację rozmiaru pliku JPEG dla obrazów, które zostały skompresowane między 84 a 100. Innymi słowy, Guetzli jest przydatny, jeśli musisz utrzymać bardzo wysoki jakość obrazu bez zwiększania kompresji JPEG. Świetnie nadaje się do jednorazowej optymalizacji, która zwolni miejsce na serwerze plików lub innej pamięci masowej.

Świetnie nadaje się do jednorazowej optymalizacji, która zwolni miejsce na serwerze plików lub innej pamięci masowej

Dla tych, którzy wciąż podejmują pierwsze kroki w optymalizacji, Guetzli zawiera podstawową aplikację GUI, która daje możliwość zapisywania istniejących obrazów w różnych formatach.

Pobierz kod ze strony www.github.com/google/guetzli, sprawdź, czy masz pliki rozwojowe libpng i libjpeg i uruchom $ make w katalogu projektu. Zobaczysz binaria bin / Release, a teraz nadszedł czas, aby dać Guetzli możliwość wykonania swojej pracy:

$. / guetzli - jakość 84 cali. jpg. jpg

Współczynnik 84 jest najlepszy (i najniższy możliwy) dla Guetzli. Podczas testowania zestawu obrazów stało się jasne, że żadna inna metoda kompresji JPEG nie może się równać z Guetzli pod względem rozmiaru pliku z tym współczynnikiem. Oto przykładowe polecenie przetwarzania wsadowego wielu plików jednocześnie:

$ dla pliku w *. jpg; do guetzli - quality 84 „$ file” „$ {file /% ext / out}”; zrobione

Podczas pracy z pojedynczym plikiem można to zrobić bez wiersza poleceń, uzyskując dostęp do narzędzia graficznego innej firmy Guetzli, które można znaleźć na stronie www.github.com/till213/GuetzliImage-IOPlugin. Oferuje bibliotekę współdzieloną i wtyczkę obrazu na Qt5 wraz z przykładową aplikacją przyjazną dla początkujących, gdzie można przesyłać pliki JPEG, konfigurować niektóre opcje i wreszcie upiec Guetzli. I choć to pieczenie niewiarygodnie ładuje procesor, jest to obecnie jedyne najnowsze narzędzie do optymalizacji JPEG. Jakość uzyskanego obrazu jest doskonała - nie można go odróżnić od oryginału.

POLECAM: Monitorowanie w systemie Linux za pomocą wiersza poleceń

Optymalizacja obrazu dzięki Leptonowi

Przechodzimy do kolejnej nowej technologii zmniejszania plików JPEG. Lepton to koder open source z Dropbox. Twierdzi, że może wycisnąć kolejne 22% swoich zwykłych plików JPEG i okazało się interesujące dla nas udowodnienie tej liczby w naszych testach.

Uruchamianie Lepton jest łatwe: sklonuj kod projektu ze strony www.github. com / dropbox / lepton i polecenie $ ./autogen.sh && ./configure && make && sudo make install

Składnia komendy dla Lepton jest również prosta:

Jak widać, Lepton kompresuje plik i daje wynik w nieznanym formacie. Od tego momentu nie możesz już otwierać, edytować ani w inny sposób pracować z plikami - dopóki nie rozpakujesz ich ponownie:

Ponieważ nie ma integracji Lepton z innymi firmami w popularnych przeglądarkach obrazów dla Linuksa, on oczywiście działa po prostu jako menedżer archiwum. Mimo to, w niektórych aplikacjach przydatne jest na przykład przechowywanie ogromnych zbiorów danych na dysku zapasowym. Ważne jest, aby pamiętać, że Lepton zapewnia bezstratne kodowanie, więc plik źródłowy i przetworzone JPEG-LEP-JPEG są takie same.

Ważne jest, aby pamiętać, że Lepton zapewnia bezstratne kodowanie, więc plik źródłowy i przetworzone JPEG-LEP-JPEG są takie same

Kompresja Lepton działa niesamowicie szybko, dając znacznie mniejsze pliki i bardzo poręczny rysunek, który pokazuje oszczędność miejsca w procentach.

Lepton działa bardzo szybko i zapewnia lepszy współczynnik kompresji niż Guetzli, ale pamiętaj, że nie uzyskasz dostępu do plików w systemie bez Leptona, a Guetzli zapewnia doskonałą kompatybilność wsteczną plików JPEG. Dzięki wysokiej wydajności, Lepton jest idealny do pracy z dużymi obrazami.

Najprostszym sposobem przeprowadzenia prawdziwego testu jest pobranie pliku, na przykład, w otwartym repozytorium Wikimedia (http://bit.ly/wiki-big-im-ages) i spróbowanie zakodowania go za pomocą Lepton. Pamiętaj, że Lepton może działać tylko z plikami JPEG, które nie przekraczają 128 MB, więc nie zapomnij o tym przy wyborze dużych plików, aby to sprawdzić. Co więcej, na pewno będziesz musiał zrobić dodatkowe argumenty, aby Lepton przetworzył obraz o takim rozmiarze, taki jak ten:

$ lepton - pamięć = 4096M - wątek = 128M w. jpg. lep

Próbowaliśmy skompresować plik 0-cynefin-ORIGINEEL.jpg (93,9 MB) i otrzymaliśmy plik 0-cynefin-ORIGINEEL.lep , tylko 64 MB. To 31% kompresji! Rzeczywiste wyniki są różne dla różnych obrazów i wszystko zależy od tego, z którym obrazem pracujesz. Na przykład, jeśli obraz zawiera obszary z ciągłym wypełnianiem, grafiką linii lub rysunkami, koder poradzi sobie znacznie lepiej niż podczas pracy ze zdjęciem rzeczywistego obiektu.

Biorąc pod uwagę, że Guetzli i Lepton pracują z JPEG, byliśmy ciekawi kompresji pliku tekstowego przy użyciu obu koderów. Po zastosowaniu do zestawu zwykłych zdjęć 11-15 MP, pierwszy etap dał nam kompresję między 14 a 20%, a drugi dał kompresję o kolejne 20-25%. Ogólna wydajność tej kombinacji wynosiła od 30 do 40%, co jest niesamowite przy prawie bezstratnej kompresji (w końcu jest to JPEG).

Optymalizacja obrazu za pomocą FLIF

Postawiliśmy już stopę na prawie niezbadanej krainie alternatywnych formatów plików graficznych, a teraz czas zmienić format JPEG na PNG.

Istnieje wiele przypadków, w których PNG jest korzystniejszy niż JPEG, na przykład na zrzutach ekranu, obrazach w Internecie i na wszystko inne, z wyjątkiem zdjęć. FLIF oznacza Free Lossless Image Format i jest oparty na kompresji MANIAC. MANIAC (Meta-Adaptive Near-Zero Integer Arithmetic Coding) to algorytm do kodowania entropijnego z wykorzystaniem kontekstowej arytmetyki binarnej.

Z naszego doświadczenia wynika, że ​​FLIF jest niemal idealnym zamiennikiem PNG, bezstratnego WebP, bezstratnego BPG, bezstratnego JPEG2000 i bezstratnego JPEG XR pod względem współczynnika kompresji. Ogromną zaletą FLIF jest to, że jest to uniwersalny format odpowiedni do kodowania wszelkiego rodzaju obrazów, czy to zdjęcie, rysunek, mapa lub coś innego, a mimo to i tak zyskasz dodatkowe kilobajty.

Zacznij od klonowania kodu, a następnie przejdź do katalogu src wewnątrz drzewa głównego. FLIF nie ma zbyt wielu zależności oprócz pakietu deweloperskiego libpng, ale aby skompilować program, musisz ręcznie określić cele Automake:

$ make flif libflif. więc libflif_dec. więc viewflif

To polecenie nie wymaga wyjaśnienia: otrzymujesz koder wykonywalny, dwie biblioteki dostępu rozproszonego do kodowania i dekodowania oraz prostą przeglądarkę plików FLIF. Skopiuj pliki flif i viewfif do / usr / bin (lub dowolnego innego miejsca w $ PATH ), skopiuj biblioteki do miejsca takiego jak / usr / lib64 (w różnych dystrybucjach Linuksa jest inaczej) i jesteś gotowy. Koder FLIF ma wiele opcji wiersza poleceń (patrz $ flif - wyjście pomocnicze), ale jeśli ich nie użyjesz, zdecyduje, że potrzebujesz kompresji bezstratnej z przeplotem, jak w poniższym przykładzie:

Możesz używać tylko plików PNG lub PNM z FLIF i dla wygody powinieneś zawsze używać rozszerzenia .flif dla plików wynikowych. W rezultacie plik jest o ponad 40% mniejszy niż zwykły PNG (jak te skompresowane przy użyciu domyślnych ustawień GIMP) i prawie 15% mniejszy niż bezstratny WebP. FLIF zapewnia niesamowitą optymalizację plików i przewyższa wszystkie inne formaty plików. Ponadto koder jest dość szybki, a jeśli spojrzeć na obciążenie procesora, to jest gdzieś pomiędzy Guetzli i Leptonem.

FLIF istnieje już od jakiegoś czasu i domyślnie są już programy obsługujące FLIF. Najbardziej intrygującą jest wtyczka Qt FLIF (www.github.com/spillerrec/qt-flif-plugin), która radzi sobie z zadaniem wyjścia z FLIF do szerokiego świata. Wtyczka pozwala wszystkim programom Qt domyślnie obsługiwać FLIF, tak jakby to był inny podstawowy format rastrowy, taki jak PNG, TIFF, JPEG i inne.

Natywna obsługa Qt otwiera więcej opcji dla FLIF. Oto obsługa ikon FLIF w Dolphin.

Aby wtyczka działała, musisz ostrożnie umieszczać jej pliki. Po skompilowaniu kodu otrzymujesz bibliotekę z dostępem rozproszonym libflif.so, którego nazwa pokrywa się z nazwą biblioteki, która pochodzi z samego FLIF. Dlatego, chociaż masz już /usr/lib64/libflif.so, powinieneś skopiować wtyczkę libflif.so do domyślnego miejsca docelowego wtyczek obrazu systemu, na przykład / usr / lib64 / qt5 / plugins / imageformats /. Pliki * .desktop powinny zostać wysłane do / usr / share / kservices5 / qimageio-plugins, a x-flif.xml powinno się znajdować w / usr / share / mime / packages.

Jeśli nie używasz Plazmy KDE, nadal możesz ułatwić sobie życie dzięki oddzielnej aplikacji Imgviewer (www.github.com/spillerrec/imgviewer). Połącz .flif z Imgviewer w swoim menedżerze plików - i możesz oglądać obrazy FLIF na dowolnym pulpicie.

POLECAM: Zarządzanie programami z konsoli Linux

Szkicowanie

Podczas oglądania obrazów w menedżerze plików spodziewasz się zobaczyć ich miniatury. Tworzenie miniatur dla obrazów JPEG lub PNG jest łatwe dla wszystkich głównych menedżerów plików, takich jak Dolphin, Nautilus lub Nemo. Ale jeśli wybierzesz alternatywne formaty plików, wszystko stanie się bardziej interesujące.

Wcześniej wspomnieliśmy o wtyczce Qt FLIF, która rozwiązuje problem szkiców FLIF w Dolphin, ale możesz także pobrać szkice FLIF w Nautilusie lub Nemo przy użyciu innej technologii. Utwórz plik wykonywalny / usr / local / bin / flif-thumbnailer, używając:

#! / bin / bash

temp = $ (mktemp). png

flif - d „1 $” „$ temp”

przelicz „$ temp” - zmień rozmiar „3 USD” x ”3 USD” „2 USD”

rm „$ temp”

Następnie utwórz kolejny plik / usr / share / thumbnailers / flif. miniatura i wypełnij ją tym kodem:

[Wpis miniatury]

TryExec = / usr / local / bin / flif - miniatura

Exec = / usr / local / bin / flif - miniatura% i% o% s

MimeType = image / flif;

Na koniec zarejestruj nowy typ MIME pliku, tworząc plik /usr/share/mime/packages/flif.xml . Wypełnij go następującymi liniami:

<? xml version = „1.0�� encoding = „UTF - 8”?>

<mime - info xmlns = 'http: //www.freedesktop.org/standards/shared-mime-info'>

<mime - wpisz type = „image / flif”>

<comment> obraz FLIF </ comment>

<glob pattern = “*. flif ”/>

</ mime - type>

</ mime - info>

Więc zrobiłeś wszystko. Powyższa metoda nie jest zbyt piękna, ponieważ prosisz miniaturkę o konwersję FLIF do PNG, aby narysować każdą miniaturę, ale działa niezawodnie i zapewnia przyzwoitą wydajność.

To samo można zrobić dla dowolnego innego formatu pliku, jeśli znasz polecenie dekodowania. W przypadku Leptona po prostu zastąp flif -d „$ 1” „$ temp” leptonem „$ 1” „$ temp” i zmień odpowiednio inne pliki dla Lepton, a wszystko powinno działać płynnie. Proces dekodowania Lepton jest znacznie szybszy niż proces wykorzystywany w FLIF, więc miniatury będą tworzone szybciej dla plików .lep .

Szersza implementacja FLIF

Bez względu na to, jak obszerny może być nowy format pliku, opinia publiczna nie zaakceptuje go, dopóki nie będzie domyślnie obsługiwana przez standardowe aplikacje branżowe. W FLIF wszystko idzie dobrze, ponieważ możemy już kodować i dekodować pliki .flif za pomocą ImageMagick (komendy takie jak mogrify i convert są jego składnikami). Nie gwarantujemy, że istniejąca instalacja ImageMagick będzie teraz w stanie współpracować z FLIF, ponieważ wielu producentów Linuksa nadal uważa FLIF za format eksperymentalny i nie zawiera dodatkowych flag kompilacji podczas tworzenia pakietów ImageMagick. Ale kompilacja własnej instancji ImageMagick w Linuksie nie jest taka trudna.

Innym wielkim osiągnięciem byłoby włączenie obsługi FLIF doifer drzewa przeglądarki Chromium. Chromium jest najpopularniejszą technologią bazową dla dziesiątek pochodnych na całym świecie (jeśli jesteś w stanie poradzić sobie z kompilacją ogromnego pakietu źródłowego Chromium, możesz stworzyć własną przeglądarkę internetową!).

Do tej pory FLIF nie jest częścią Chromium, ponieważ nie osiągnął jeszcze dojrzałości. Z drugiej strony Google promuje własny format WebP, jest bezpośrednim konkurentem FLIF. W większości testów FLIF znacznie przewyższa WebP, ale jeśli chodzi o korzystanie z grafiki w Internecie, różnica nie jest znacząca.

? encoding = „UTF - 8”?