Czy możemy zmienić rozmiar obrazu JPEG bez jego dekodowania i ponownego kodowania?

12

Chcę przekonwertować obraz JPEG 640 x 480 na 320 x 240. Wiem, że można tego dokonać dekodując obraz JPEG do surowego YCbCr, skalując go i ponownie kodując do JPEG. Ale czy jest możliwe z kodowaniem JPEG bezpośrednie skalowanie obrazu bez dekodowania?

Krawat
źródło

Odpowiedzi:

14

Możesz, ale tylko wtedy, gdy przeglądarka JPEG obsługuje rozszerzenie JPEG SmartScale . jpegtran może to zrobić dla rozmiarów N / 8, przy N = 1..16. Zasadniczo rozmiar bloku DCT zmienia się z 8x8 na coś innego podczas rekompresji (np. 4x4), co skutecznie skaluje obraz.

Uwaga: SmartScale został wprowadzony w wersji 8 biblioteki libjpeg, ale nie jest szeroko obsługiwany przez przeglądających.

Dokument opisujący szczegółowe zmiany można znaleźć tutaj: Ewolucja JPEG .

EDYCJA: Wygląda na to, że większość widzów nie jest w stanie wyświetlić tych obrazów, ponieważ są one oparte na libjpeg-turbo. A libjpeg-turbo zdecydowało się nie implementować tej funkcji . W rzeczywistości wypróbowałem sporo programów (na Ubuntu 14.04 i Windows 8) i żaden nie był w stanie wyświetlić zmniejszonego obrazu utworzonego za pomocą jpegtrans. Nawet Photoshop, IrfanView i GIMP zawiodły.

EDYCJA 2: W rzeczywistości Ubuntu i Fedora nawet nie dostarczają biblioteki libjpeg8, ale całkowicie zastępują ją wersją libjpeg-turbo. Dlatego żaden z programów nie będzie w stanie odczytać plików JPEG SmartScale, z wyjątkiem kilku plików binarnych, które są statycznie powiązane z oryginalną biblioteką libjpeg8.

jmiserez
źródło
Czy istnieje kodek, który konstruuje obraz, który rośnie w wyniku dodania kolejnych danych do obrazu?
Necktwi
co z progresywnym JPEG? Czy nie robi dokładnie tego, o co pytam?
Necktwi
Nie, robi to coś nieco innego, zwiększając jakość obrazu (od niskiej do pełnej), ale rozdzielczość jest zawsze niezmieniona ( odniesienie ). Istnieje jednak inne rozszerzenie JPEG o nazwie „tryb hierarchiczny”, które koduje różne rozdzielczości ( patrz także tutaj ). Ale znowu libjpeg-turbo go nie obsługuje (patrz tutaj , wyszukaj „progresywny” w tekście).
jmiserez
1
Aby odpowiedzieć na pierwszy komentarz, oczywiście istnieją takie kodeki. Po prostu nie JPG. To, czego szukasz, nazywa się piramidą obrazową lub reprezentacją wieloskalową. Np. JPEG2000 używa transformaty falkowej, która tworzy piramidę falkową. Istnieją inne piramidy, takie jak piramidy Gaussa lub Laplaciana. Ten zestaw slajdów daje dobry przegląd tego, jak to działa, podczas gdy JPEG2000 jest omawiany tutaj i tutaj .
jmiserez
Dziękujemy za informację o nowych formatach JPEG. Nie oczekuję, że wiele obrazów źródłowych (aparaty fotograficzne, skanery itp.) Jeszcze ich użyje.
AFH
3

Krótka odpowiedź brzmi: nie. Obraz JPEG wykorzystuje kompresję, co oznacza, że ​​każdy bajt wyjściowy zależy od wszystkich pozostałych. Jeśli zmienisz liczbę bajtów obrazu, musisz rozpakować i ponownie skompresować.

W wyniku rekompresji nastąpi utrata jakości, ponieważ JPEG stosuje kompresję stratną, ale i tak tracisz jakość, dzieląc rozdzielczość na ćwiartki. Możesz uzyskać najlepszą możliwą jakość obrazu o niskiej rozdzielczości, zwiększając poziom jakości JPEG podczas ponownej kompresji, choć oczywiście zwiększy to rozmiar pliku.

Jeśli dużo pracujesz z obrazami, najlepiej pracować w formacie bezstratnej kompresji, takim jak PNG, konwertując na JPEG tylko po sfinalizowaniu obrazów, oczywiście pod warunkiem, że masz dodatkowe miejsce na dysku.

AFH
źródło