Морфинг иконок

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

Итак, сегодня я расскажу о внутреннем устройстве формата Ico. Он неплохо описан на msdn, и полный его разбор выходит за рамки этой статьи.

Теория:

;формат ICO таков:
;ICO - это набор иконок разных разрешений.
;ICONDIR - заголовок
;ICONDIRECTORY [n] - данные о конкретной иконке, фактически это оглавление.
;ICONIMAGE  [n]  - сам растр и заголовок

;Заголовок имеет размер 6 байт:
ICONDIR struct
Reserved1    WORD    ?
ResourceType    WORD    ? ;1 - ico, 2 - cur
ImageCount    WORD    ? ;количество ICONDIRECTORY и ICONIMAGE
;[n] ICONDIRECTORY
ICONDIR ends

ICONIMAGE struct
BITMAPINFOHEADER <>
;[n] IMAGEDATA
ICONIMAGE ends

;Каталог информации об изображениях
ICONDIRECTORY struct
_Width        BYTE    ?
_Height        BYTE    ?
Colors        BYTE    ?
Reserved2    BYTE    ?
Planes        WORD    ? ;количество плоскостей
BitsPerPixel    WORD    ?
ByteInRes dword ? ;размер ICONIMAGE
ImageOffset dword ? ;его смещение в файле
ICONDIRECTORY ends

BITMAPINFOHEADER struct
biSize           DWORD    ? ;размер структуры
biWidth           DWORD     ?
biHeight         DWORD     ?
biPlanes         WORD      ?
biBitCount     WORD      ? ;битность
biCompression   DWORD     ?
biSizeImage     DWORD     ?
biXPelsPerMeter DWORD     ?
biYPelsPerMeter   DWORD     ?
biClrUsed       DWORD     ? ;The number of color indexes
biClrImportant   DWORD     ? ;The number of color indexes that are required for displaying the bitmap.
BITMAPINFOHEADER ends

RGBQUAD struct
rgbBlue       BYTE  ?
rgbGreen      BYTE  ?
rgbRed        BYTE  ?
rgbReserved   BYTE  ?
RGBQUAD ends

IMAGEDATA struct
;[n] RGBQUAD - палитра цветов, для 8 битных - 256 записей
;[n] BITMAPLINE - массив с описанием конкретной строки,
; количество строк равно высоте изображения из ICONDIRECTORY, количество элементов в строке - длине изображения.
IMAGEDATA ends

В зависимости от метода хранения изображения, IMAGEDATA может содержать палитру цветов и список линий или 2 массива. Первый это массив строк, в каждой из которых есть массив RGBQUAD, отвечающий за конкретный цвет. Второй отвечает за маску иконки. Я так и не понял за кой хер она нужна, потому что цвет rgbReserved отвечает за НЕпрозрачность, видимо это какой-то пережиток. Как нам определить как закодировано изображение? Это зависит от поля BITMAPINFOHEADER.biBitCount:
1,4,8 – используется таблица цветов.
24 – строки содержат цвета, в группах по 3 байта, без альфа-канала.
32 – строки содержат массив RGBQUAD, с альфа-каналом.

Такие дела, формат видоизменялся от версии к версии, но не утрачивал обратную совместимость.
Вот так это выглядит в 010 editor:

ico_1]

Перейдем к практике
Т.к. размер файла бывает весьма критичен, обычно используется только одна иконка большого разрешения, система сама её отмаштабирует при необходимости. Таким образом алгоритм морфинга иконки таков:

1)берем иконку и выдираем из неё изображение размера 48 на 48 пикселей, с biBitCount== 32.
2)морфим её цвета
3)собираем новую иконку

И тут начинается самое важное, как их морфить?
1)Будем добавлять рандомные параметры от нуля до 10 к каждому пикселю.

ico_2

Хуйня получилась, будем думать! Каждый цвет задаётся одним байтом, соответственно резкий переход цветов будет только если байт будет переполнен: 0ffh+2=101h -> 01
Значит, будем проверять каждый цвет: если он больше 7fh – вычитаем число, если меньше – прибавляем.

Так же, не трогаем пустые пиксели, и пиксели у которых нулевая прозрачность.

ico_3

Что в итоге? Не отличить от оригинала!
Имейте в виду, что винда кеширует иконки, и нужно их переименовать, чтобы увидеть новый эскиз.

 

p.s. Привет пидору, который пытался продавать материалы этой статьи.

7 thoughts on “Морфинг иконок

  1. На факаве читал, юзверь под ником Multik писал, что подобная техника от совсем лоховских ав. На примере битдефендера расписал, что ав мутит маску на ico (1/0 ака цвет/прозрачность), и сдвигай не сдвигай цвета, толку никакого.

    Спасибо за ресурс парни!

  2. Действительно замечательная статья + простая и интересная идея. Лови пятюню автор.
    По поводу блога: стоит убрать поля E-mail, Сайт. лишнее это.

  3. Только я вот не могу понять, какая цель этого ритуала? У нас получится файл с другим хэшем и (почти) тем же видом. Но в чем это можно использовать?

Добавить комментарий