Jak działa bezstratna kompresja obrazu Google Page Speed?

138

Po uruchomieniu wtyczki Google PageSpeed ​​dla Firebug / Firefox na stronie internetowej zasugeruje ona przypadki, w których obraz można skompresować bezstratnie, i poda link do pobrania tego mniejszego obrazu.

Na przykład:

Dotyczy to zarówno plików JPG, jak i PNG (nie testowałem GIF ani innych).

Zwróć także uwagę na miniatury Flickr (wszystkie te obrazy mają 75x75 pikseli). To całkiem spora oszczędność. Jeśli to naprawdę świetne, dlaczego Yahoo nie stosuje tej strony serwera do całej biblioteki i nie zmniejsza obciążenia pamięci masowej i przepustowości?

Nawet Stackoverflow.com oznacza bardzo drobne oszczędności:

Widziałem, jak PageSpeed ​​sugeruje całkiem przyzwoite oszczędności na plikach PNG, które utworzyłem za pomocą funkcji „Zapisz dla sieci Web” programu Photoshop.

Moje pytanie brzmi więc, jakie zmiany wprowadzają w obrazach, aby je tak bardzo zmniejszyć? Domyślam się, że istnieją różne odpowiedzi dla różnych typów plików. Czy to naprawdę bezstratne dla JPG? Jak mogą pokonać Photoshopa? Powinienem być wobec tego trochę podejrzliwy?

Drew Noakes
źródło
Wygląda na to, że Pagespeed wymaga teraz stratnej kompresji. Zanim wyniki powiedziały: "Bezstratna kompresja xxx.jpg może zaoszczędzić xx kb (xx% redukcji)". Teraz jest napisane: „Kompresja xxx.jpg może zaoszczędzić xx kb (redukcja xx%)”. Co ważne, Google wydaje się żądać stratnej kompresji tylko mniejszych obrazów (miniatury itp.). Czy ktoś może dowiedzieć się, jakich narzędzi i parametrów kompresji stratnej używa Google?
Martin

Odpowiedzi:

83

Jeśli naprawdę interesują Cię szczegóły techniczne, sprawdź kod źródłowy:


W przypadku plików PNG używają OptiPNG z pewnym podejściem prób i błędów

// we use these four combinations because different images seem to benefit from
// different parameters and this combination of 4 seems to work best for a large
// set of PNGs from the web.
const PngCompressParams kPngCompressionParams[] = {
  PngCompressParams(PNG_ALL_FILTERS, Z_DEFAULT_STRATEGY),
  PngCompressParams(PNG_ALL_FILTERS, Z_FILTERED),
  PngCompressParams(PNG_FILTER_NONE, Z_DEFAULT_STRATEGY),
  PngCompressParams(PNG_FILTER_NONE, Z_FILTERED)
};

Po zastosowaniu wszystkich czterech kombinacji zachowywany jest najmniejszy wynik. Proste.

(Uwaga: optipngnarzędzie wiersza poleceń robi to również, jeśli zapewniasz -o 2przez -o 7)


W przypadku plików JPEG używają jpeglib z następującymi opcjami:

 JpegCompressionOptions()
     : progressive(false), retain_color_profile(false),
       retain_exif_data(false), lossy(false) {}

Podobnie, WEBP jest kompresowany przy użyciu libwebp z następującymi opcjami:

  WebpConfiguration()
      : lossless(true), quality(100), method(3), target_size(0),
        alpha_compression(0), alpha_filtering(1), alpha_quality(100) {}

Istnieje również image_converter.cc, który służy do bezstratnej konwersji do najmniejszego formatu.

user123444555621
źródło
3
Zwłaszcza retain_color_profile (false) dla plików JPEG może być złym pomysłem. Ponieważ wyświetlacze z rozszerzoną gamą kolorów stają się coraz bardziej powszechne, jasno określona instrukcja odwzorowania kolorów staje się niejednoznaczna. Jeśli oryginalny obraz był zakodowany w sRGB, będzie to nadal działać w niektórych przeglądarkach (Safari, Firefox z modyfikacją about: config), podczas gdy w innych tylko faktycznie otagowane obrazy mogą być zarządzane kolorami (domyślnie Firefox). Oczywiście przeglądarki bez możliwości zarządzania kolorami nie będą się tym przejmować…
CO
2
Biegałem optipng file.png -o7i nie zbliżam się do tego, co pokazuje Google. Być może w miarę możliwości przechodzą na SVG?
Nateowami
@Nateowami Miałem ten sam problem ... dla niektórych PNG Google radzi sobie lepiej niż optipng -o7. W tym celu możesz pobrać zoptymalizowane obrazy z samej witryny Pagespeed.
chrisvdb
46

Używam jpegoptimdo optymalizacji plików JPG i optipngoptymalizacji plików PNG.

Jeśli jesteś włączony bash, polecenie bezstratnej optymalizacji wszystkich plików JPG w katalogu (rekurencyjnie) to:

find /path/to/jpgs/ -type f -name "*.jpg" -exec jpegoptim --strip-all {} \;

Możesz dodać -m[%]do jpegoptimstratnej kompresji obrazów JPG, na przykład:

 find /path/to/jpgs/ -type f -name "*.jpg" -exec jpegoptim -m70 --strip-all {} \;

Aby zoptymalizować wszystkie pliki PNG w katalogu:

find /path/to/pngs/ -type f -name "*.png" -exec optipng -o2 {} \;

-o2jest domyślnym poziomem optymalizacji, możesz go zmienić z o2na o7. Zauważ, że wyższy poziom optymalizacji oznacza dłuższy czas przetwarzania.

Hoang Huynh
źródło
29

Spójrz na http://code.google.com/speed/page-speed/docs/payload.html#CompressImages, który opisuje niektóre techniki / narzędzia.

Bursztyn
źródło
1
Dzięki za link. Myślę, że naprawdę chcę dowiedzieć się więcej o rodzajach nadmiarowości w plikach obrazów, które można usunąć, jeśli głównym problemem jest rozmiar pliku. Wiem, że informacje są dostępne w sieci, chciałem tylko mieć fajne miejsce do ich zestawiania na SO.
Drew Noakes
Używam niestandardowego narzędzia do kompilacji, które kompresuje obrazy za pomocą optipng i pngcrush, a następnie wybiera mniejszy plik. Mimo to Page Speed ​​narzeka na nieoptymalne obrazy. Więc jakiego narzędzia naprawdę używają?
user123444555621
@ Pumbaa80 Możesz także wypróbować advsys.net/ken/util/pngout.htm (który wyraźnie mówi, że czasami może uzyskać mniejsze rozmiary niż zarówno optipng, jak i pngcrush).
Amber
Właśnie dowiedziałem się, że Page Speed ​​rzeczywiście używa optipng, z niestandardowym opakowaniem, które określa najlepsze opcje konfiguracji. @Amber Brak opcji, nie używam Windowsa;)
user123444555621
15

To kwestia wymiany czasu procesora kodera na wydajność kompresji. Kompresja to poszukiwanie krótszych reprezentacji, a jeśli będziesz szukać mocniej, znajdziesz krótsze.

Jest też kwestia maksymalnego wykorzystania możliwości formatu obrazu, np. PNG8 + a zamiast PNG24 + a, zoptymalizowane tabele Huffmana w JPEG itp.

Photoshop tak naprawdę nie stara się tego robić podczas zapisywania obrazów do Internetu, więc nie jest zaskakujące, że każde narzędzie go pokonuje.

Widzieć

Kornel
źródło
Jedyna odpowiedź, która próbuje odpowiedzieć na rzeczywiste pytanie, które faktycznie zadał operator, zamiast innego pytania „jak najbardziej skompresować moje obrazy”? lol
toddmo
13

Aby zreplikować wyniki kompresji JPG PageSpeed ​​w systemie Windows:

Udało mi się uzyskać dokładnie takie same wyniki kompresji, jak w przypadku PageSpeed, używając wersji jpegtran dla systemu Windows, którą można pobrać ze strony www.jpegclub.org/jpegtran . Uruchomiłem plik wykonywalny za pomocą wiersza poleceń DOS (użyj Start> CMD). Aby uzyskać dokładnie ten sam rozmiar pliku (z dokładnością do bajtów) co kompresja PageSpeed, określiłem optymalizację Huffmana w następujący sposób:

jpegtran -optimize source_filename.jpg output_filename.jpg

Aby uzyskać więcej informacji na temat opcji kompresji, w wierszu polecenia wpisz: jpegtran

Lub użyć obrazów generowanych automatycznie z karty PageSpeed ​​w Firebug:

Udało mi się postępować zgodnie z radą Pumba80, aby uzyskać dostęp do zoptymalizowanych plików PageSpeed. Mamy nadzieję, że zrzut ekranu tutaj zapewnia większą przejrzystość dla środowiska FireFox. (Nie udało mi się jednak uzyskać dostępu do lokalnej wersji tych zoptymalizowanych plików w przeglądarce Chrome).

Aby wyczyścić niechlujne nazwy plików PageSpeed ​​za pomocą programu Adobe Bridge i wyrażeń regularnych:

Chociaż PageSpeed ​​w FireFox był w stanie wygenerować dla mnie zoptymalizowane pliki graficzne, zmienił również ich nazwy, zmieniając proste nazwy, takie jak:

nice_picture.jpg

w

nice_picture_fff5e6456e6338ee09457ead96ccb696.jpg

Odkryłem, że wydaje się, że to częsta skarga. Ponieważ nie chciałem ręcznie zmieniać nazw wszystkich moich zdjęć, użyłem narzędzia zmiany nazwy programu Adobe Bridge wraz z wyrażeniem regularnym. Możesz użyć innych poleceń / narzędzi zmiany nazwy, które akceptują wyrażenia regularne, ale podejrzewam, że Adobe Bridge jest łatwo dostępny dla większości z nas pracujących z problemami z PageSpeed!

  1. Uruchom Adobe Bridge
  2. Wybierz wszystkie pliki (używając Control A)
  3. Wybierz Narzędzia> Zmiana nazwy partii (lub Control Shift R)
  4. W polu Preset wybierz „String Substitution”. W polach Nowe nazwy plików powinno być teraz wyświetlane „Podstawienie ciągu”, a po nim „Oryginalna nazwa pliku”
  5. Zaznacz pole wyboru „Użyj wyrażenia regularnego”
  6. W polu „Znajdź” wprowadź wyrażenie regularne (co spowoduje zaznaczenie wszystkich znaków zaczynających się od skrajnego prawego podkreślenia):

    _ (?!. * _) (. *) \. jpg $

  7. W polu „Zamień na” wpisz:

    .jpg

  8. Opcjonalnie kliknij przycisk Podgląd, aby zobaczyć proponowane wyniki zmiany nazwy partii, a następnie zamknij

  9. Kliknij przycisk Zmień nazwę

Zwróć uwagę, że po przetworzeniu program Bridge usuwa zaznaczenie plików, na które nie miało to wpływu. Jeśli chcesz wyczyścić wszystkie pliki .png, musisz ponownie wybrać wszystkie obrazy i zmodyfikować powyższą konfigurację (dla „png” zamiast „jpg”). Możesz również zapisać powyższą konfigurację jako ustawienie wstępne, takie jak „Wyczyść obrazy jpg PageSpeed”, aby w przyszłości móc szybko wyczyścić nazwy plików.

Zrzut ekranu konfiguracji / Rozwiązywanie problemów

Jeśli masz problemy, możliwe, że niektóre przeglądarki mogą nie wyświetlać poprawnie powyższego wyrażenia RegEx (obwiniaj moje znaki ucieczki), więc zrzut ekranu konfiguracji (wraz z tymi instrukcjami) można znaleźć na:

Jak używać narzędzia Batch Rename w Adobe Bridge do czyszczenia zoptymalizowanych obrazów PageSpeed, które mają niechlujne nazwy plików

Thor
źródło
Dzięki za udostępnienie tego!
rotaercz
1
Jeśli korzystasz z usług IIS, PageSpeed ​​został niedawno przeniesiony do systemu Windows i automatycznie przeprowadza te same optymalizacje. iispeed.com Aby uzyskać najlepszą redukcję, ale bez żadnych strat, masowo konwertowałem całe katalogi plików JPEG za pomocą JPEGmini jpegmini.com
James Moberg
Wygląda na to, że nie ma już rozszerzenia PageSpeed ​​dla Firebuga.
Stephan Schielke
10

Moim zdaniem najlepszą opcją, która skutecznie radzi sobie z większością formatów obrazu w ruchu, jest trimage . Skutecznie wykorzystuje optipng, pngcrush, advpng i jpegoptim w oparciu o format obrazu i zapewnia niemal idealną bezstratną kompresję.

Implementacja jest dość łatwa, jeśli używasz wiersza poleceń.

sudo apt-get install trimage    
trimage -d images/*

i voila! :-)
Dodatkowo znajdziesz całkiem prosty interfejs do zrobienia tego ręcznie.

Rohan
źródło
2
Jakieś alternatywy dla systemu Windows?
Mathias Lykkegaard Lorenzen
2

Istnieje bardzo przydatny skrypt wsadowy, który rekurencyjnie optymalizuje obrazy pod folderem za pomocą OptiPNG (z tego bloga ):

FOR /F "tokens=*" %G IN ('dir /s /b *.png') DO optipng -nc -nb -o7 -full %G

JEDNA LINIA!

Mieszkanie
źródło
1
FOR /F "tokens=*" %G IN ('dir /s /b *.png') DO optipng -nc -nb -o7 -full "%G" jeśli masz spacje w nazwie pliku
Ned Martin
0

Jeśli szukasz przetwarzania wsadowego, pamiętaj o reklamacjach trimage, jeśli nie masz dostępu do Xserver. W takim przypadku po prostu napisz skrypt bash lub php, aby zrobić coś takiego

<?php
    echo "Processing jpegs<br />";
    exec("find /home/example/public_html/images/ -type f -name '*.jpg' -exec jpegoptim --strip-all {} \;");
    echo "Processing pngs<br />";
    exec("find /home/example/public_html/images/ -type f -name '*.png' -exec optipng -o7 {} \;");
?>

Zmień opcje, aby dopasować je do swoich potrzeb.

Nate
źródło
0

W przypadku systemu Windows istnieje kilka interfejsów typu drag'n'drop dla łatwego dostępu.

https://sourceforge.net/projects/nikkhokkho/files/FileOptimizer/

W przypadku plików PNG znalazłem ten dla własnej przyjemności, najwyraźniej 3 różne narzędzia zawarte w tym GIU. Po prostu przeciągnij i upuść i zrobi to za Ciebie.

https://pnggauntlet.com/

Zajmuje to jednak trochę czasu, spróbuj skompresować plik png o wielkości 1 MB - byłem zdumiony, ile procesora zajęło to porównanie kompresji, które musi być tym, co się tutaj dzieje. Wygląda na to, że obraz jest skompresowany na 100 sposobów, a najlepszy wygrywa: D

Jeśli chodzi o kompresję JPG, uważam, że jest to ryzykowne dla paska profili kolorów i wszystkich dodatkowych informacji - jednak - jeśli wszyscy to robią - to standard biznesowy, więc zrobiłem to sam: D

Zapisałem dzisiaj 113 MB na 5500 plikach podczas instalacji WP, więc zdecydowanie warto!

Kim Steinhaug
źródło