Статьи

Автор: Николай Мациевский aka sunnybear
Опубликована: 26 мая 2008

Разгоняем favicon.ico — это как?

В очередной презентации Yahoo! о клиентской производительности был поднят вопрос о favicon.ico. Они проводили несколько интересных фактов о данном явлении и давали пару советов. Процитирую их рекомендации:

  • www.example.org/favicon.ico
  • Необходимое зло:
    • Браузер ее запросит
    • Лучше не отвечать 404-ошибкой
    • Будут отправлены cookie
    • Не может быть в CDN
    • Мешается в последовательности загрузки ресурсов
  • Уменьшайте ее (<=1 Кб)
  • Использовать анимированные иконки ни разу не хорошо
  • Выставляйте заголовок Expires
  • Инструменты: imagemagick, png2ico, favicon.ru
  • Материал для изучения: в поиске Yahoo! favicon.ico занимает 9% всех просмотров страниц (для webo.in это 7%)

Поскольку favicon.ico не является обычной картинкой при загрузке сайта (она, во-первых, запрашивается едва ли не один-единственный раз браузером при посещении сайта, во-вторых, загружается, игнорируя обычный порядок загрузки), то в дополнение к уже имеющейся информацией я захотел провести ряд дополнительных исследований и объединить все, что известно прогрессивному человечеству на данную тему. Однако, в ходе изучения материала оказалось, что проблема совсем не так прозрачна, как представлялось изначально. Формат .ico предстал в новом, весьма выгодном для использования в вебе, свете.

Краткое описание формата

favicon.ico имеет формат .ico (на самом деле, такой формат есть, а соответствующий MIME-тип прижился не везде, при этом он объединяет несколько довольно специфических типов, подробнее можно посмотреть в статье на Wikipedia). С одной стороны, он позволяет представлять информацию без потерь (в отличие от JPEG). С другой стороны, он, фактически, аналог BMP, но на этом все сравнение быстро заканчивается.

Я не буду приводить точную его спецификацию (она не так сложна, и ее можно обнаружить здесь или здесь), однако, сразу в глаза бросилось две вещи: возможность использования индексированных цветов (ага, это уже почти GIF) и возможность использования линейного сжатия (а это уже почти PNG). Все еще здесь? Тогда мы продолжаем.

Собственно, следует эта информация из следующих частей формата:

BitCount 	2 bytes 	bits per pixel = 1, 4, 8
Compression 	4 bytes 	Type of Compression = 0

Боевое крещение

После небольших поисков удалось собрать тестовое окружение под Firefox 3, использующее base64-кодирование картинки в виде .ico. Результат можно покрутить здесь: webo.in/tests/favicon-shrink/. Удалось сделать однотонное изображение (палитра 4 бита) размером в 318 байтов (против 894 стандартных, почти 3 раза). С палитрой в 2 бита возникли трудности под Safari, поэтому здесь результат этот не привожу, однако, возможно, его также можно использовать).

Тем, кто уже собрался кидать в меня камни: столько воды из-за 576 байтов — я замечу, что, во-первых, иконку Хабра (использует, фактически, только 2 цвета) можно сжать до еще меньшего размера. Во-вторых, при использовании больших размеров (32x32, 48x48) выигрыш будет таким же в процентах. Т.е. иконки в 16Кб можно будет спокойно уменьшить раза в 3—7. И это без учета вырезание неиспользуемых фреймов в них (ведь формат позволяет создавать анимированные иконки).

К сожалению, линейное сжатие использовать не удалось (если у кого-то есть положительный практический опыт в этом — пожалуйста, поделитесь в комментариях).

Оптимальные размеры

Путем нехитрых вычислений заголовков, смещений и палитр можно вычислить некоторые цифры для размера наиболее стандартных favicon.ico. Для 32х32 и 48х48 размер файлов должен увеличиться примерно в 4 и 9 раз, соответственно.

Таблица 1. Стандартные размеры favicon.ico (16x16)
Размер картинкиПалитраРазмер (в байтах)Пример
16x162 бита198
4 бита318webo.in
8 бит1406google
24 бита894habrahabr
32 бита1150yahoo

Для динамических иконок можно смело множить размер одиночной иконки на число фреймов, ибо заголовок у всего файла всего 62 байта, основная часть — именно данные.

PNG — быть или не быть?

В Wikipedia указывается, что вместо .ico можно использовать .png как наиболее перспективный из форматов, используемых для сжатия изображения без потери качества. Что же, давайте проверим, какие браузеры у нас понимают PNG-формат при соответствующем объявлении файла в секции head страницы.

Как обычно, позади планеты всей у нас остается IE, так что данный подход нам не очень подходит. Подчеркну, что, в среднем, размер PNG-файла с иконкой не сильно меньше, чем ICO, но можно совершить дополнительные телодвижения, подключив одну иконку для всех браузеров, а вторую — только для IE. Тут уже на вкус и цвет, как известно, товарищей нет. Если вы работаете над экстремальной оптимизацией, наверное, это стоит попробовать.

А если еще и сжать?

Если мы не можем адекватно использовать нормальные форматы (PNG, GIF) для представления favicon.ico, то почему бы не использовать gzip-сжатие для ее выдачи клиентскому браузеру? Можно. И все актуальные браузеры это понимают. Как пример могу привести webo.in: иконка отдается в виде архива, как и большинство остальных файлов (HTML, например). Размер при этом составляет 225 байтов (уменьшился в 1,5 раза по сравнению с исходным).

Повторюсь, речь идет о возможностях для уменьшения favicon.ico в целом, а не абсолютных цифрах. Если у вас на сервере уже используется сжатие, просто добавьте туда image/x-icon и забудьте о ней.

data:URL нас спасет?

В качестве технологии экстремальной оптимизации можно рассмотреть возможность включения favicon.ico по протоколу data:URL, чтобы отобразить страницу в клиентском браузере после первого запроса на сервер (подразумевается, что с сервера уйдет один-единственный HTML-файл, содержащий все необходимые составляющие в себе).

Однако, для рядовых сайтов такой подход совершенно бессмысленнен, потому что будет отдавать пользователю лишние байты каждый раз. Самым логичным его применением будут рекламные страницы, которые пользователь должен увидеть только один раз.

Заключение

Одним из наиболее спорных моментов (лично для меня) в презентации Yahoo! было заявление о том, что favicon.ico «мешается» при загрузке страницы. Как можно судить по логам сервера при загрузке страницы, этот файл, действительно, запрашивается где-то в середине общего процесс загрузки, ориентировочно после CSS-файлов до фоновых изображений, поэтому его оптимизация может оказаться одним из ключевых моментов для загрузки вашего сайта в первый раз (с пустым кешем).

Также ради простого уважения к пользователям (зачем им загружать лишние 10 Кб кода, который отрисуется у них в области 16x16 пикселей?) не стоит раздувать ее размер без особой необходимости. Уважайте своих посетителей.

Замечательный онлайн-сервис favicon.ru предлагает приличный инструментарий для создания иконок (вплоть до ручного их рисования), однако, к сожалению, не учитывает возможности создания «облегченной» палитры для уменьшения размера файла.

Использованный материал

  1. Favicon - Википедия
  2. ICO (icon image file format) - Wikipedia
  3. Icons in Win32
  4. Creating Windows XP Icons
  5. ICO file format
  6. File Formats Collection: ICO
  7. IconLib - Icons Unfolded
  8. Лабораторная работа №1. Форматы изображений

P.S. хорошей новостью будет то, что ImageMagick поддерживает создание .ico с уменьшенной палитрой, поэтому его активно можно использовать для нормальной конвертации PNG/GIF-файлов в иконки (однако, выплыли проблемы с прозрачностью, если у кого имеется информация, как поправить создание прозрачных иконок, — поделитесь, пожалуйста).

Читать дальше

Все комментарии (habrahabr.ru)