Главная » Хабрахабр » [recovery mode] Сказ о старинных иконках. Загадка 18-и цветов. Прозрачный и инверсный цвета

[recovery mode] Сказ о старинных иконках. Загадка 18-и цветов. Прозрачный и инверсный цвета

Мало кому ныне не плевать на лишние килобайт-другой. Но такие люди есть, и как раз для такого задрота человека эта заметка и написана. )

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

Иконка 48х48, 1-битовая прозрачность, 256 цветов = 3774 байта, она же в 16 цветах = 1662 байт. Что это даёт? Выигрыш – 2 килобайта, при незначительном падении качества изображения.

Слева — направо: Пример.

  • 256-цветный оригинал
  • фиксированная стандартная 16-цветная палитра (причем здесь пару минут подбирал штриховку, чтоб изображение имело хоть сколько-нибудь приличный вид)
  • адаптивная 16-цветная палитра + штриховка (dithering).

Как это работает? Как ни странно, 16-цветная иконка всегда носит в себе палитру. То есть, 99.9% старинных иконок несут в себе абсолютно одинаковую 64-байтную таблицу цветов (4 байта на цвет). И, да – оказывается, её можно перепрограммировать.
К сожалению, я не знаком с программой, что умеет полноценно работать с такого рода иконками. Поэтому вот рецепт, как «неполноценно» состряпать подобную иконку: возьмите IrfanView, загрузите в него картинку: либо заранее подготовленную 16-цветную, либо уменьшите количество цветов прямо в нём: меню – изображение – уменьшить глубину цвета… – 16 цветов. Теперь: меню – сохранить как… – выбрать формат .ico. Всё? Нет, не всё: Irfan View не умеет работать с прозрачностью, её придется восстановить вручную в другой программе. Microangelo Studio умеет загружать и редактировать такие иконки (увы, создавать из них библиотеку, ровно как и создавать такие иконки «с нуля» он не позволяет). Загружаем иконку в Microangelo и… возможно, с ходу получаем окошко с предупреждением насчет «некорректной палитры» — что это значит на практике, будет рассказано позже. Инструментами «заливка» и «карандаш» отмечаем прозрачные зоны; записываем; готово!

Теперь, внимательно присмотревшись к палитре Microangelo, у меня возникли вопросы. Это было то, что я делал раньше, лет десять назад. Как вообще можно хранить 18 цветов в файле? Что это за странная палитра, 18 цветов? )) Видно, что в палитре есть сплошных 16 цветов и два служебных: «прозрачный» и «инверсный». Число-то не круглое, господа программисты так не поступают; им это просто не удобно. – если такой цвет встречается, он отображает негатив того, что лежит под ним; используется это чаще всего в курсорах; а курсор – он и по сути и по структуре файла – тоже иконка. Что за «инверсный»? Если обычные точки изображения упакованы по 4 бита (16 цветов), то прозрачность может храниться только как отдельная битовая маска (1 бит на каждую точку изображения). Но как хранятся все эти цвета? Ещё одна маска, что ли? Окей, а где же тогда хранится инверсия? Не экономично, но возможно… Давайте-ка посчитаем.

Размер файла 1662 байта. Иконка 48х48, 16 цветов, 1 изображение. Я слабо представляю себе тонкости, но попробуем прикинуть. Что в нём? Палитра: 16*4 = 64 байта. Главная часть, само изображение: 48*48/2 = 1152 байта. Заголовок .ico, официально = 6 байт. Маска прозрачности 48*48/8 = 288 байт. Итого: 1152+64+288+6+16 = 1526. Описание кадра (1 шт.) из документации = 16 байт. Значит… инверсный цвет каким-то образом встроен в саму картинку. Наверное, там есть что-то ещё, ведь реальный размер файла больше – но это не важно; важно другое, остаток «несходняка» мал: 136 байт, и он явно не позволяет разместить еще одну битовую маску размером 288 байт. Может, теперь вы уж догадаетесь сами, как они это сделали?

Если альфа-маска показывала: текущая точка курсора/иконки «прозрачна» — брался цвет под курсором/иконкой и XOR-ился («исключающее “или”»; а может там было и просто вычитание) – внимание! А сделали они это, судя по всему, так: в оригинальных Windows (кажется, начиная с Win 95OSR2 полноценно, а в Win XP и более новых — уже частично), в иконках и курсорах, говоря строго — настоящего прозрачного цвета не существовало. – с текущим цветом точки, взятым из палитры иконки.

Если это был первый цвет (черный в фиксированной палитре), XOR делал с фоном «ничего» — цвет становился просто прозрачным. Что получается? Это и есть весь секрет, как хранились «18 цветов»… Т.е., еще раз: «прозрачный» = черный (+) альфа-маска, «инверсный» = белый (+) альфа-маска. Если это был последний цвет (в фиксированной палитре – белый) – цвет менялся полностью, превращался в негатив. А теперь – поговорим о «глюках».

И вправду, наша адаптивная палитра вполне может обойтись без черного или белого цветов. Упомянутое выше предупреждение Microangelo гласит: «у вас в палитре нет полноценного белого и черного цветов, работа с прозрачностью будет некорректной!». О, именно так, как мы и ожидаем: возьмется какой-то цвет из палитры (например, зеленый), «отксорится» (XOR) с фоном, и мы получим прекрасный фиолетовый цвет вместо прозрачности. Как же тогда отработает прозрачность? )) Или иной пример — на место последнего цвета в палитре случайно попал черный: и «инверсия» превратилась в обычную полноценную прозрачность.

Слева прозрачность (P) и инверсия (I) отрабатывают как надо; справа – явно нет. Пример: слева стандартная палитра, справа перепрограммированная.

Современные ОС, такие как Win 10, игнорируют цвета палитры, и битовая маска «прозрачность» всегда работает именно как прозрачность в чистом виде: XOR-а нет, и инверсии соответственно нет тоже. Впрочем, все эти прелести иконок мы можем наблюдать только в оригинальных Windows. Однако, в механизме отображения курсора, всё-таки есть совместимость – там работает полноценная старая добрая экономичная схема; «тёплая, ламповая», и… мало кому понятная и нужная.

Пример: различное отображение одних и тех же иконок в Windows XP и в Windows 7.


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

Расширяйте кругозор, Холмс! Или зачем физикам скрипка и кулинарные навыки

О современной литературе, философии и политике он, по-видимому, не знал почти ничего.… Однако мое изумление достигло апогея, когда я случайно обнаружил, что он не знаком с теорией Коперника и не представляет себе, как устроена Солнечная система.… «Но не знать о ...

Спам звонки. Можно ли с ними бороться?

Доброго времени суток, Хабр. Есть несколько способов бороться со спамными звонками на мобильный телефон, но бывают такие ситуации, когда это практически невозможно. Я расскажу свой случай о систематических звонках со скрытого номера.Все мы привыкли раз в какое-то время получать спамные ...