Ще раз про favicon


Майже все добре, але мій favicon.ico важив цілих 4286 байт. Зменшив до 766. Розкажу́ як.

Спершу я позбувся згладжування та полутоні́в. Для іко́нки 32×32 зі звичайної, «розмитої» версії я вручну у Gimp’і зробив чітку «піксельну»:

Збільшена іко́нка сайту, оригінальна Збільшена іко́нка сайту, піксельна версія

Як бачите, у новій версії є жовтий колір, є чорний колір і є прозорі пікселі. І все. Це значить, що можна обійтися палітрою з трьох кольорів, чи не так?

Спочатку роблю версію з палітрою через pngnq, потім мінімізую розмір за допомогою optipng та advpng. У результаті я маю супер-легкий PNG файл 32-pixart.png, 32×32 пікселі, палітра з трьох кольорів (всі три містять альфа-канал), загальний розмір файлу 175 байт.

Далі намагаюся звичайними методами зробити ICO.

  • convert icon/32-pixart.png favicon.ico
  • icotool -c -b 32 -p 3 -o favicon.ico icon/32-pixart.png

Ніт. Обидва варіанти дають файл вагою 4286 байт. Срака!

Наскільки я розумію, проблема починається з того, що всі три кольори в палітрі містять альфа-канал. Це якимось чином призводить до того, що генерується «важка» версія ICO-файлу, у якій 32×32 пікселі з 24-бітним кольором і 8-бітною альфою.

Я ж добре пам’ятаю, що замість «напівпрозорості», тобто повноцінного 8-бітного альфа-каналу, колись була «однобітна прозорість», як у GIF, піксель або 100% прозорий, або 100% непрозорий. А, стоп, GIF! Спробував GIF як проміжний формат.

convert icon/32-pixart.png favicon.gif
convert favicon.gif favicon.ico

І це, нарешті, дало кращий результат. Наразі це 766 байт. Можливо, можна ще круті́ше стиснути?

Upd.: Крутіше саму favicon я не стиснув, але трохи виправив гамму (жовтий був якийсь темний) та випадково зменшив оптимізовану версію 32-pixart.png ще на один байт. Прико́льно :)