Dropbox niedawno wydał Lepton ( GitHub ), metodę, która bezstratnie kompresuje obrazy JPEG w obie strony, oszczędzając średnio 22%.
Z powodu zasady szufladki nie można zagwarantować , że dowolny ogólny algorytm kompresji spowoduje powstanie mniejszego pliku ( ogólnie, ponieważ nie ma zastosowania do danych wejściowych ograniczonych do określonego formatu). Lepton wykorzystuje typowe cechy plików JPEG, które, jeśli zostaną przewrócone, mogą zaszufladkować go, aby utworzyć plik większy niż źródło.
Wymagania
Napisz program, który generuje:
- Prawidłowy obraz JPEG / JFIF,
- o wielkości od 0,5 MB do 1 MB,
- nie mniejszy niż 256 × 256 px,
- nie większy niż 4096 × 4096 px,
- rozpoznawalny przez Leptona (może z powodzeniem „kompresować” się do
.lep
obrazu), oraz - dekompresuje na identyczne
.jpg
(jako wejście). APPx
,COM
i inne metadane, niegeograficzne sekcje znaczników są ograniczone w formacie JPEG (wstrzykiwanie dowolnych ilości losowych bajtów do obrazu w celu asymptotycznego podejścia do kompresji 1: 1 jest kiepskie).APP0
JFIF znacznik jest dozwolone, ale nie wolno miniatur (powinien być dokładnie 16 bajtów)- tl; dr Jeśli celowo nie umieszczasz metadanych w segmencie EXIF i wyłączasz dowolną miniaturę, którą chcesz wstawić do biblioteki, którą chcesz wybrać, powinno to być w porządku.
Opublikuj kod i obraz.
Jeśli chcesz napisać program, który produkuje obraz Lepton, który po konwersji daje JPEG spełniający kryteria, to w porządku. Musi pozostać identyczny w dowolnie wielu cyklach JPEG → Lepton → JPEG → ...
Punktacja
Rozmiar bajtu obrazu Lepton podzielony przez źródłowy obraz JPEG. Im wyższa (gorsza kompresja Leptona), tym lepiej. Uruchom Lepton z domyślnymi flagami i przełącznikami.
Coraz Lepton
5-sekundowy kurs do zbudowania Leptona:
git clone https://github.com/dropbox/lepton.git
cd lepton
./autogen.sh && ./configure && make
# fish shell: ./autogen.sh ;and ./configure ;and make
Więc ./lepton --help
powinienem ci powiedzieć.
Odpowiedzi:
Python 3 + mozjpeg + / dev / urandom, 720 × 720: śr. ocena 102%
W zależności od
mozjpeg
pakietu kod zakłada, że jest on zainstalowany/usr/local/opt/mozjpeg
. (w OS X instalacja jest prosta, wystarczy uruchomićbrew install mozjpeg
)Zależy to również od
/dev/urandom
specjalnego pliku, który służy do generowania losowych danych.Kod po prostu podaje losowe dane do
mozjpeg
kompresora (w formacie TGA, ponieważ cjpeg to rozumie i ma bardzo prosty nagłówek), i pozwala stworzyć zoptymalizowany plik jpeg. Jakość jest ustawiona na maksimum, ponieważ sprawia, że współczynniki DCT są najmniej kompresowalne i nie ma znaczenia, jaki algorytm jest używany do kompresji danych nieskompresowalnych.Sprawdziłem, że cykl jpeg-> lepton-> jpeg jest bezstratny - to prawda.
Oczywiście kod nie jest golfowy.
Przykładowy obraz:
Ciekawostka: wygenerowany plik JPEG jest większy niż źródłowy nieskompresowany obraz TGA, mimo że JPEG stosuje kompresję stratną.
Ciekawostka 2: Imgur (domyślny hosting obrazów dla SO) wykonuje w tym pliku bardzo złą robotę - z jakiegoś powodu kompresuje go do niższej jakości, nawet jeśli ma mniej niż 1 MB. Więc użyłem Github do przesłania przykładowego obrazu.
Ciekawostka 3: Ogólnie rzecz biorąc, mozjpeg rzeczywiście lepiej kompresuje JPEG, zachowując zgodność z istniejącymi dekoderami JPEG. Ma także narzędzie do bezstratnej optymalizacji plików JPEG -
jpegtran
.źródło
Naiwny hałas, 1024 × 1024: wynik 85,55%
Zgodny przykład w Pythonie, aby uruchomić piłkę. Nie zoptymalizowane w żaden sposób; prawdopodobne wady:
Następnie trochę bash, aby to zrobić:
źródło