Як працює стиснення зображення без втрат у програмі Page Speed ​​Google?


138

Коли ви запускаєте плагін Google PageSpeed ​​для Firebug / Firefox на веб-сайті, він запропонує випадки, коли зображення можна стискати без втрат, та надасть посилання для завантаження цього меншого зображення.

Наприклад:

Це стосується файлів JPG та PNG (я не тестував GIF та ін.)

Зверніть увагу також на ескізи Flickr (усі ці зображення розміром 75x75 пікселів.) Вони є досить великими заощадженнями. Якщо це дійсно так чудово, чому Yahoo не застосовує цей сервер до всієї своєї бібліотеки і не зменшує їх навантаження та пропускну здатність?

Навіть Stackoverflow.com розраховує на дуже незначні заощадження:

Я бачив, що PageSpeed ​​пропонує досить пристойну економію файлів PNG, створених за допомогою функції «Зберегти для Інтернету» Photoshop.

Отже, моє запитання полягає в тому, які зміни вони вносять у зображення, щоб зменшити їх на стільки? Я здогадуюсь, що існують різні відповіді на різні типи файлів. Це справді без втрат для JPG? І як вони можуть перемогти Photoshop? Чи варто мені трохи підозріло ставитися до цього?


Схоже, що Pagespeed вимагає стиснення втрат. Перед результатами було сказано: "Стиснення xxx.jpg без втрат може врятувати xx kb (xx% зменшення)". Тепер написано, що "Стиснення xxx.jpg може врятувати xx kb (xx% зменшення)" Важливо, Google, схоже, вимагає втратити лише стиснення менших зображень (ескізів тощо). Чи може хтось зрозуміти, якими інструментами та параметрами стиснення збитків користується Google?
Мартін

Відповіді:


83

Якщо вас справді цікавлять технічні деталі, перегляньте вихідний код:


Для файлів PNG вони використовують OptiPNG з деяким підходом до проб і помилок

// 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)
};

Коли застосовуються всі чотири комбінації, зберігається найменший результат. Просто як це.

(NB: optipngінструмент командного рядка робить це занадто , якщо ви надаєте -o 2через -o 7)


Для файлів JPEG вони використовують jpeglib із наступними параметрами:

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

Аналогічно WEBP стискається за допомогою libwebp із цими параметрами:

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

Існує також image_converter.cc, який використовується для безперервного перетворення в найменший формат.


3
Зокрема, retain_color_profile (false) для JPEG може бути поганою ідеєю. По мірі того, як відображення розширеної кольорової гами стає більш поширеним, чітко визначена інструкція щодо передачі кольорів стає неоднозначною. Якщо в оригінальному зображенні було зашифровано sRGB, це все ще працюватиме в деяких браузерах (Safari, Firefox з модифікацією about: config), а в інших може бути керовано кольором лише фактично розмічені зображення (Firefox за замовчуванням). Звичайно, браузери без будь-яких можливостей управління кольором не хвилюються…
CO

2
Я бігав optipng file.png -o7і ніде не дістаюсь до того, що показує Google. Можливо, вони перетворюються на SVG, коли це можливо?
Nateowami

@Nateowami У мене був той самий випуск ... для деяких PNG Google робить краще, ніж optipng -o7. Для цього ви можете завантажити оптимізовані зображення з самого веб-сайту.
chrisvdb

46

Я використовую jpegoptimдля оптимізації файлів JPG та optipngоптимізації файлів PNG.

Якщо ви ввімкнули bash, команда для оптимізації без втрат усіх JPG в каталозі (рекурсивно):

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

Ви можете додати -m[%]до jpegoptimвтрачених стискання зображень JPG, наприклад:

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

Для оптимізації всіх PNG в каталозі:

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

-o2- це рівень оптимізації за замовчуванням, ви можете змінити це o2на o7. Зауважте, що більш високий рівень оптимізації означає триваліший час обробки.


29

Погляньте на http://code.google.com/speed/page-speed/docs/payload.html#CompressImages, де описано деякі методи / інструменти.


1
Дякуємо за посилання Напевно, я шукаю справді, щоб дізнатися більше про види надмірностей у файлах зображень, які можна позбавити, якщо розмір файлів є вашою основною проблемою. Я знаю, що інформація там в Інтернеті, я просто хотів мати гарне місце, щоб зібрати її тут, так.
Дрю Ноакс

Я використовую спеціальний інструмент побудови, який стискає зображення як з optipng, так і з pngcrush, а потім вибирає менший файл. Тим не менш, Page Speed ​​скаржиться на неоптимальні зображення. То який інструмент вони реально використовують?
користувач123444555621

@ Pumbaa80 Ви також можете спробувати advsys.net/ken/util/pngout.htm (який конкретно говорить про те, що іноді він може набувати менших розмірів, ніж як optipng, так і pngcrush).
Бурштин

Щойно я з’ясував, що Page Speed ​​дійсно використовує optipng, зі спеціальною обгорткою, яка визначає найкращі параметри конфігурації. @Amber Не варіант, я не використовую Windows;)
user123444555621

15

Це питання часу CPU кодера для ефективності стиснення. Стиснення - це пошук коротших уявлень, і якщо ви будете шукати більш важко, ви знайдете більш короткі.

Існує також питання використання можливостей формату зображення в повній мірі, наприклад, PNG8 + a замість PNG24 + a, оптимізованих таблиць Хаффмана в JPEG тощо.

Photoshop насправді не дуже намагається це зробити, зберігаючи зображення в Інтернеті, тому не дивно, що будь-який інструмент обіграє його.

Побачити


Єдина відповідь, яка намагається відповісти на власне запитання, на яку насправді задається O / P, замість іншого питання "як я можу найбільше стискати свої зображення"? lol
toddmo

13

Щоб повторити результати стиснення JPG PageSpeed ​​у Windows:

Мені вдалося отримати абсолютно такі ж результати стиснення, що і PageSpeed, використовуючи версію jpegtran для Windows, яку ви можете отримати на веб- сайті www.jpegclub.org/jpegtran . Я запустив виконуваний файл, використовуючи підказку DOS (використовуйте Пуск> CMD). Щоб отримати точно такий же розмір файлу (до байта), як і стиснення PageSpeed, я вказав оптимізацію Хаффмана наступним чином:

jpegtran -optimize source_filename.jpg output_filename.jpg

Щоб отримати додаткову допомогу щодо параметрів стиснення, у командному рядку просто введіть: jpegtran

Або використовувати Автогенеровані зображення на вкладці PageSpeed ​​у Firebug:

Я зміг дотримуватися порад Pumbaa80, щоб отримати доступ до оптимізованих файлів PageSpeed. Сподіваємось, скріншот тут надає додаткову чіткість для середовища FireFox. (Але мені не вдалося отримати доступ до локальної версії цих оптимізованих файлів у Chrome.)

А для очищення брудних імен файлів PageSpeed ​​за допомогою Adobe Bridge та регулярних виразів:

Хоча PageSpeed ​​у FireFox міг генерувати оптимізовані файли зображень для мене, він також змінив їхні імена, перетворивши прості імена на кшталт:

nice_picture.jpg

в

nice_picture_fff5e6456e6338ee09457ead96ccb696.jpg

Я виявив, що це, здається, є звичайною скаргою. Оскільки я не хотів перейменовувати всі свої зображення вручну, я використав інструмент перейменування Adobe Bridge разом із регулярним виразом. Ви можете використовувати інші команди / інструменти для перейменування, які приймають регулярні вирази, але я підозрюю, що Adobe Bridge доступний для більшості з нас, які працюють із проблемами PageSpeed!

  1. Запустіть Adobe Bridge
  2. Виберіть усі файли (за допомогою керування A)
  3. Виберіть Інструменти> Перейменування партії (або Control Shift R)
  4. У полі Попередньо виберіть "Заміна рядків". У полях "Нові імена файлів" тепер повинно відображатися "Заміна рядків", а потім "Оригінальне ім'я файлу"
  5. Увімкніть прапорець під назвою "Використовувати регулярне вираження"
  6. У полі «Знайти» введіть регулярний вираз (який вибере всі символи, починаючи з правого красного роздільника підкреслення):

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

  7. У полі «Замінити на» введіть:

    .jpg

  8. За бажанням натисніть кнопку «Попередній перегляд», щоб побачити запропоновані результати перейменування партії, а потім закрийте

  9. Натисніть кнопку Перейменувати

Зауважте, що після обробки Bridge скасовує вибір файлів, на які не вплинуло. Якщо ви хочете очистити всі ваші .png файли, вам потрібно переібрати всі зображення та змінити конфігурацію, що була вище (для "png" замість "jpg"). Ви також можете зберегти конфігурацію, вказану вище, як попередньо встановлену настройку, наприклад, "Очистити зображення jpg".

Знімок екрана конфігурації / усунення несправностей

Якщо у вас є проблеми, можливо, деякі веб-переглядачі можуть не відображати вираз RegEx вище (звинувачувати мої вихідні символи).

Як використовувати інструмент пакетного перейменування Adobe Bridge для очищення оптимізованих зображень сторінок швидкості, що мають брудні імена файлів


Дякуємо, що поділилися цим!
rotaercz

1
Якщо ви використовуєте IIS, PageSpeed ​​нещодавно був перенесений у Windows і виконує ці самі оптимізації автоматично. iispeed.com Для кращого зменшення, хоча без будь-яких втрат, я проводив групове перетворення цілих каталогів JPEG, використовуючи JPEGmini jpegmini.com
James Moberg

Здається, що вже немає розширення PageSpeed ​​для Firebug.
Стефан Шильке

10

На мою думку, найкращий варіант, який ефективно обробляє більшість форматів зображень у ході, - це триміаж . Він ефективно використовує optipng, pngcrush, advpng та jpegoptim на основі формату зображення та забезпечує майже ідеальне стиснення без втрат.

Реалізація досить проста, якщо використовувати командний рядок.

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

і вуаля! :-)
Крім того, ви знайдете досить простий інтерфейс, щоб зробити це і вручну.


2
Будь-які альтернативи для Windows?
Mathias Lykkegaard Lorenzen

2

Існує дуже зручний пакетний сценарій, який рекурсивно оптимізує зображення під папкою за допомогою OptiPNG (з цього блогу ):

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

ОДНА ЛІНІЯ!


1
FOR /F "tokens=*" %G IN ('dir /s /b *.png') DO optipng -nc -nb -o7 -full "%G" якщо у вашому імені файлу є пробіли
Нед Мартін,

0

Якщо ви шукаєте пакетну обробку, майте на увазі скарги на триміжа, якщо у вас немає Xserver. У такому випадку просто напишіть скрипт bash або php, щоб зробити щось подібне

<?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 {} \;");
?>

Змініть параметри відповідно до своїх потреб.


0

Для вікон існує кілька інтерфейсів drag'n'drop для легкого доступу.

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

Для файлів PNG я знайшов цей для задоволення, мабуть, 3 різних інструменти, загорнуті в цей GIU. Просто перетягніть і це зробить це за вас.

https://pnggauntlet.com/

Хоча потрібно час, спробуйте стиснути файл PNG розміром 1 Мб - я був вражений, скільки процесора увійшло в це порівняння стиснення, яке має бути тим, що тут відбувається. Здається, зображення стиснуто 100 способами, і найкращий виграє: D

Що стосується стиснення JPG, то я відчуваю себе ризиковано знімати кольорові профілі та всю додаткову інформацію - однак - якщо всі це роблять - це його бізнес стандарт, тому я просто робив це сам: D

Я зберег 113 Мб на 5500 файлах на WP, встановлених сьогодні, тож це, безумовно, варто!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.