Projekt Google WebM oparty na wolnym i otwartym kodeku VP8 oferuje kuszące korzyści dla fanów Linuksa i otwartego oprogramowania: lepszą jakość oraz pełną obsługę w przeglądarce i innych aplikacjach dzięki braku tantiem. Często pomijanym w historii WebM jest inny format ujawniony przez Google w tym samym czasie, WebP – format stratnej kompresji obrazu zapewniający lepszą niż w przypadku JPEG jakość przy znacznie mniejszym rozmiarze. Czy WebP jest gotowy zastąpić ciężki i stary format zdjęć? Spójrzmy na darmowe narzędzia służące do zapisu, konwersji i wyświetlania plików WebP aby się przekonać.
Zdjęcie jest wszystkim
Na początek musimy zrozumieć czym jest WebP. Ten format jest stratny tak jak standard JPEG oznacza to, że używa kompresji do usuwania bitów w sposób którego (na szczęście) ludzkie oko nie dostrzega. JPEG zazwyczaj dzieli obraz na 8 x 8 bloków, a następnie przeprowadza na każdym z nich dyskretną transformatę kosinusową (DCT) i wyrzuca niektóre z najmniej znaczących cyfr o najwyższych częstotliwościach. To stąd pochodzi większość oszczędności rozmiaru. Nasze oczy nie są na tyle czułe żeby dostrzec duże częstotliwości więc JPEG zamiata je pod dywan.
Aktualnie jest kilka opcji zdefiniowanych przez standard kodeka JPEG (wliczając stratną kompresję) co jest tym co daje początek ustawieniom jakości JPEG – jeśli zmniejszasz jakość w czasie eksportowania obrazu, algorytm dostosowuje się do wyrzucania coraz większej i większej ilości danych. Ale zasada pozostaje taka sama.
Przykład kompresi JPEG i WebP -
Zdjęcie WebP jest o 39,3% mniejsze.
Kompresja WebP to zasadniczo adaptacja jednej klatki z kodeka video WebM. Tu również obraz jest dzielony na bloki (chociaż na 4 x 4 a nie na 8 x 8 ) ale zamiast dyskretnej transformaty kosinusowej JPEG i usuwania bitów o wysokiej częstotliwości, używa algorytmu wewnątrz-ramkowego kodowania z WebM. Wewnątrz-ramkowe kodowanie to kodowanie w dół w jednym kadrze w przeciwstawnie do dwóch kolejnych ramek (eng. coding down within a single frame, as opposed to between two consecutive frames). Metoda WebM wykorzystuje do budowy prognozy każdego bloku bloki z nim sąsiadujące. Koder zapisuje prognozy i różnice pomiędzy prognozą a prawdziwymi blokami wchodzącymi do pliku wynikowego – jeśli prognoza przebiega dobrze, tak jak powinna dla większości kontynuowanych tonów obrazu takich jak zdjęcia, wynik jest mniejszy niż dane wejściowe i rezultat kompresji stratnej.
Zabawne jest to, że algorytm przewidywania bloków WebM może użyć kilku różnych technik mogących generować lepsze rezultaty niż metoda JPEG- jeden rozmiar pasuje do wszystkich przypadków. Z drugiej strony kodek jest znacznie bardziej złożony matematycznie więc kodowanie trwa dłużej. W WebP możliwe jest równoległe dekodowanie obrazu dzięki czemu, użytkownik traci mniej czasu.
Zestaw narzędzi od Google
Google oferuje implementację zestawu narzędzi o nazwie libwebp do ściągnięcia na Google Code. Pakiet jest aktualnie w wersji 0.1 i zawiera dwa narzędzia wiersza poleceń, statyczną bibliotekę i nagłówki plików C do użycia z innymi aplikacjami. Wszystko jest na licencji BSD – styl warunków określa projekt WebM jako jedną całość. Binarne pakiety przygotowane są dla 32 i 64 bitowych Linuksów jak również Mac OS X i Windows, dostępny jest też kod źródłowy.
Aby rozpocząć korzystanie z pakietu na Linuksie musisz rozpakować archiwum, przenieść pliki binarne cwebp i dwebp do wybranej przez siebie lokalizacji upewniając się, że mają uprawnienia do wykonywania. Pliki te połączone są z libjepeg i libpng ale w pakiecie nie ma skryptu instalacyjnego więc nie ma możliwości sprawdzenia czy masz zainstalowane obie te biblioteki. Ze względu na to, że są one jednymi z podstawowych bibliotek w większości systemów, pewnie już je masz.
Biblioteka WebP nazywa się libwebp.a i może być użyta do dodania wsparcia dla kodowania i dekodowania do każdej aplikacji. Dołączony plik README zawiera opis kodowania i dekodowania API oraz kilku funkcji kodowania dla różnych typów danych RGB jak również pseudokod. Niezbędne nagłówki są dołączone w folderze include. Dla deweloperów muszących wdrożyć WebP jest to dobry punkt wyjścia ale do eksperymentowania z formatem szybszą drogę będzie wykorzystanie narzędzi CLI.
Kodowanie WebP
Narzędzie cwebp jako pliki wejściowe bierze obraz w formacie PNG lub JPEG i konwertuje go do formatu WebP. Narzędzie dwebp bierze pliki w formacie WebP i konwertuje je do bezstratnego formatu PNG. To pozwala Ci wyświetlić efekty konwersji WebP nawet gdy aplikacja klienta nie posiada wsparcia dla WebP (których jest kilka w tej chwili).
Cwebp posiada kilka poziomów regulacji algorytmu, którymi możesz się bawić aby dostosować wyniki kompresji albo zbadać różne parametry formatu. Najprostszą opcją jest flaga -quality NN.nn która pobiera liczbę zmiennoprzecinkową z zakresu 0 – 100 gdzie 100 reprezentuje najwyższą jakość wyjściową a więc największy rozmiar pliku. Dla porównania wartością domyślną jest 75. Tak więc najbardziej podstawowym wykorzystaniem cwebp będzie cwebp filename.png co stworzy obraz wyjściowy WebP o jakości 75 i nazwie pliku filename.webp.
Następnym krokiem jest wykorzystanie wbudowanych w cwebp schematów z których każdy dostarcza za jednym razem pełną gamę ustawieni kodera. Schematy to photo, picture, drawing, icon i text, możesz ich użyć przez wpisanie nazwy po opcji -preset w konsoli w następujący sposób cwebp -preset drawing filename.png Użycie schematu zastępuje wszystkie inne przełączniki konsoli podając ich argumenty.
Niestety ani strona internetowa ani dokumentacja do ściągnięcia nie zawiera szczegółów na temat dokładnych parametrów każdego z schematów – a dostępnych jest wiele parametrów. Dla osób poszukujących najbardziej złożonych regulacji cwebp zawiera jedenaście konsolowych przełączników do samodzielnego dostosowania parametrów kodowania. Pełna lista to:
-f strength of deblocking filter, integer 0 to 100, default 20
-m thoroughness of compression method option examination, integer 0 to 6, default 4
-sns spatial noise-shaping, integer 0 to 100, default 80
-segments number of segments used by sns algorithms, integer 1 to 4, default 4
-sharpness filter sharpness, integer 0 to 7
-strong use "strong" filter rather than "simple," default off
-pass number of analysis passes, integer 1 to 10
-size target size in bytes
-psnr target peak signal-to-noise ratio in decibels.
-af auto-adjust filter strength, default off
-pre pre-processing filter, integer
Również w tym przypadku ilość parametrów jest niezła ale dokumentacja jest obecnie sporadyczna. Google twierdzi, że 30 – 40% spadek wielkości pliku JPEG bez dostrzegalnej utraty jakość jest wartością średnią możliwą do zwiększenia pod pewnymi warunkami. Widziałem użytkowników stwierdzających 80% spadek wielkości mimo że nie posiadali pełnych danych z testów. Istnieje galeria na stronie WebP zawierająca próbne obrazy – i co ważniejsze – opisy ustawień cwebp użytych do ich stworzenia.
Dekodowanie WebP
Oszczędzanie miejsca jest świetne, o ile nie jesteś zdeterminowanym archiwistą obrazu, nie ma sensu przechodzić na nowy format chyba, że ludzie będą mogli zobaczyć rezultaty. Do wyświetlania WebP jest kilka ciekawych opcji wartych rozważenia.
Po pierwsze, zestaw narzędzi WebP zawiera konwerter dwebp. Jak cwebp jest to konsolowe narzędzie które po prostu konwertuje pliki WebP do bezstratnych plików wyjściowych. Podstawowa składnia jest prosta dwebp filename.webp Możesz określić alternatywną nazwę pliku za pomocą przełącznika -o outputfilename. Dwebp standardowo tworzy pliki PNG ale możesz również dokonać konwersji do pliku PPM za pomocą flagi -ppm lub PGM z flagą -pgm
Fakt, że możesz dokonać konwersji tylko do tych kilku bezstratnych formatów zdradza, że dwebp jest przeznaczony tylko do eksperymentów, więc możesz porównać wyniki kodowania za pomocą cwebp z JPEG lub innymi formatami szukając artefaktów. Ale czy ktoś w realnym świecie może zdekodować obrazy WebP? Co ciekawe, tak.
Google zaimplementowało obsługę WebP w Chrome i Chromium począwszy od wersji 9 więc możesz wyświetlić treści WebP bezpośrednio w przeglądarce. Jest więc dobrym pomysłem aby wspomnianą wcześniej galerię przeglądać za pomocą Chrome a nie innej przeglądarki, ponieważ można porównać jakość kompresji pomijając konwersję do formatów bezstratnych. Również dzięki temu te zdjęcia otwierają się w Chrome dużo szybciej niż te konwertowane przez dwebp. Opera dodała obsługę WebP w najnowszej rozwojowej migawce więc wsparcie zostanie już niedługo wprowadzone.
Firefox nie ma jeszcze wsparcia dla WebP nawet w dopiero co wypuszczonym Firefox 4, chociaż są poprawki nakierowane na następny cykl wydawniczy. Normalnie dodanie do Firefoxa wsparcia dla nowego formatu zostało by dostarczone przez wtyczki do przeglądarki ale w przypadku WebP nie jest to konieczne. Dlatego, że Firefox 4 zawiera wbudowane dekodery treści wideo WebM a jak pamiętasz WebP to tylko pojedyncza ramka z WebM wideo.
Od kiedy dekodowanie WebM jest dostarczane przez renderer Gecko a nie przez plug-in może być wykorzystywane przez JavaScript. Mały skrypt JavaScript o nazwie Weppy jest hostowany na GitHub który może wziąć .webp elementu i skonwertować go pojedynczej ramki WebM elementu . Więc jeśli chcesz opublikować treści WebP bezpośrednio w sieci do wykorzystania przez użytkowników Firefox-a możesz to zrobić włączając wepby.js do swojej strony – twoi odwiedzający nie będą nawet widzieć różnicy. Możesz przeczytać więcej o funkcjonalności Weppy i zobaczyć przykładowy kod na blogu autora.
Jeśli narzędzia wyświetlające wydają się być centrum przeglądarki to właśnie dlatego, że WebP jest zaplanowany do publikacji treści w sieci zamiast archiwalnego formatu TIFF lub formatu edycji obrazu XCF czy OpenRaster. Ale wsparcie dla WebP powoli wchodzi do innych aplikacji. Jest już plug-in do Photoshopa a wsparcie dla otwartych aplikacji prawdopodobnie pojawi się w dalszym rozwoju libwebp. Jeszcze nie wylądował on w wielkim stylu ale jest coś do oglądania.
Pytanie miliona pikseli brzmi Czy WebP zastąpi JPEG jako główny format graficzny w Internecie? Jest za wcześnie żeby to stwierdzić. W przeszłości były już inne zamienniki JPEG włączając w to JPEG2000 nawet wśród profesjonalnych grafików, niektórzy nawet je jeszcze pamiętają. Ale WebP ma jedną zaletę, większość innych rozwiązań nie jest wolna od opłat patentowych tak jak oryginalny format JPEG.
Wojna multimedialnych formatów – w szczególności odnosząca się do sieci – co zrozumiałe jest gorącym tematem dla użytkowników Linuksa i otwartego oprogramowania ponieważ często wiąże się z patentami na oprogramowanie, tantiemami i otwartymi standardami. WebP jest wolny a otwarty status daje mu rozpęd ale nie wolne przejście. Google twierdzi, że pomimo szybkiego wzrostu ilości treści video w sieci nadal zdjęcia stanowią większość wykorzystywanej przepustowości. Nie jestem pewien czy oszczędność rozmiaru dla każdej małej strony jest tym co determinuje jego wykorzystanie ale jeśli duże magazyny publikujące zdjęcia takie jak Flickr zostałyby zobowiązane do przyjęcia WebP oszczędności były by ogromne a sam format odniósłby natychmiastowy sukces.
Tekst jest tłumaczeniem artykułu Using Google’s WebP Image Format with Open Tools on Linux