Формат файла ICO — это формат файла изображения для компьютерных иконок в Microsoft Windows . Файлы ICO содержат одно или несколько небольших изображений с различными размерами и глубиной цвета , так что их можно масштабировать соответствующим образом. В Windows все исполняемые файлы , которые отображают иконку для пользователя на рабочем столе, в меню «Пуск» или в проводнике, должны содержать иконку в формате ICO.
Формат файла CUR — это почти идентичный формат файла изображения для неанимированных курсоров в Microsoft Windows. Единственные различия между этими двумя форматами файлов — это байты, используемые для их идентификации, и добавление горячей точки в заголовок формата CUR; горячая точка определяется как смещение пикселей (в координатах x, y) от верхнего левого угла изображения курсора, куда пользователь фактически наводит мышь. [ необходима цитата ]
Формат файла ANI используется для анимированных курсоров Windows .
Значки, представленные в Windows 1.0, имели размер 32×32 пикселя и были монохромными. [2] Поддержка 16 цветов была представлена в Windows 3.0 . [ требуется ссылка ]
Win32 представила поддержку хранения изображений значков до 16,7 миллионов цветов (TrueColor) и размером до 256×256 пикселей. [3] Windows 95 также представила новый движок Device Independent Bitmap (DIB). [4] Однако в Windows 95 глубина цвета значков по умолчанию составляла 256 цветов. Можно было включить 65535-цветные (Highcolor) значки, либо изменив значение Shell Icon BPP в реестре [3] [5] , либо купив Microsoft Plus! для Windows 95. Значение Shell Icon Size позволяет использовать значки большего размера вместо значков 32×32, а значение Shell Small Icon Size позволяет использовать пользовательские размеры вместо значков 16×16. [3] Таким образом, один файл значка мог хранить изображения любого размера от 1×1 пикселя до 256×256 пикселей (включая неквадратные размеры) с 2 (используется редко), 16, 256, 65535 или 16,7 миллионами цветов; но оболочка не могла отображать очень большие значки. Область уведомлений панели задач Windows была ограничена 16 цветными значками по умолчанию до Windows Me , когда она была обновлена для поддержки значков с высокой цветовой насыщенностью.
В Windows XP добавлена поддержка 32-битных цветных (16,7 миллионов цветов плюс 8-битная прозрачность альфа-канала ) изображений значков, что позволяет отрисовывать на значке полупрозрачные области, такие как тени , сглаживание и эффекты, похожие на стекло. По умолчанию в Windows XP в проводнике Windows используются значки размером 48×48 пикселей . Windows XP можно принудительно использовать значки размером до 256×256, изменив значение размера значка Shell , но это приведет к увеличению масштаба всех значков размером 32×32 во всей оболочке. [3] Microsoft рекомендует для Windows XP только значки размером до 48×48 пикселей. [6] Windows XP может уменьшать масштаб больших значков, если нет изображения меньшего размера. [3]
Windows Vista добавила полную поддержку 256×256-пиксельных 32-битных цветных иконок, [Примечание 1], а также поддержку сжатого формата PNG . Хотя сжатие не требуется, Microsoft рекомендует, чтобы все 32-битные цветные иконки 256×256 в файлах ICO хранились в формате PNG, чтобы уменьшить общий размер файла. Проводник Windows Vista поддерживает плавное масштабирование иконок до нестандартных размеров, которые визуализируются «на лету», даже если изображение для этого размера отсутствует в файле иконки. Оболочка Windows Vista добавляет ползунок для «масштабирования» размеров иконок. При использовании пользователями более высоких разрешений и режимов с высоким DPI рекомендуются более крупные форматы иконок (например, 256×256). [7] [8]
Хотя зарегистрированным в IANA типом MIME для файлов ICO является image/vnd.microsoft.icon
[ 9], он был представлен в IANA в 2003 году третьей стороной и не распознается программным обеспечением Microsoft, которое вместо этого использует image/x-icon
или image/ico
. [10] [11] Ошибочные типы image/ico
, image/icon
, text/ico
и application/ico
также были замечены в использовании. [9]
Файл ICO или CUR состоит из структуры ICONDIR («Каталог значков»), содержащей структуру ICONDIRENTRY для каждого изображения в файле, за которой следует непрерывный блок всех данных растрового изображения (которые могут быть в формате Windows BMP , за исключением структуры BITMAPFILEHEADER, или в формате PNG , сохраненном целиком). [3]
Изображения с глубиной цвета менее 32 бит следуют определенному формату: изображение кодируется как единое изображение, состоящее из цветовой маски («маска XOR») вместе с маской непрозрачности («маска AND»). [6] [3] Маска XOR должна предшествовать маске AND внутри данных растрового изображения; если изображение хранится в порядке снизу вверх (что, скорее всего, так и есть), маска XOR будет нарисована под маской AND. Маска AND составляет 1 бит на пиксель, независимо от глубины цвета, указанной в заголовке BMP, и указывает, какие пиксели полностью прозрачны (1), а какие полностью непрозрачны (0). Маска XOR соответствует глубине цвета, указанной в заголовке BMP, и указывает числовое значение цвета или палитры для каждого пикселя. Вместе маска AND и маска XOR создают непрозрачное изображение, представляющее изображение с прозрачностью 1 бит; они также позволяют инвертировать фон. Высота изображения в структуре ICONDIRENTRY файла ICO/CUR принимает высоту предполагаемых размеров изображения (после того, как маски будут составлены), тогда как высота в заголовке BMP принимает высоту двух объединенных изображений масок (до их составления). Таким образом, маски должны иметь одинаковые размеры, а высота, указанная в заголовке BMP, должна быть ровно в два раза больше высоты, указанной в структуре ICONDIRENTRY. [12]
32-битные изображения (включая 32-битные изображения BMP в формате BITMAPINFOHEADER [Примечания 2] ) — это, в частности, 24-битные изображения с добавлением 8-битного канала для альфа-композиции . Таким образом, в 32-битных изображениях маска AND не требуется, но рекомендуется для рассмотрения. Windows XP и выше будут использовать 32-битное изображение в режиме менее True color , создавая маску AND на основе альфа-канала (если он еще не находится в изображении), если в файле ICO/CUR не указана 24-битная версия изображения. Однако более ранние версии Windows интерпретируют все пиксели со 100% непрозрачностью, если только маска AND не указана вместе с изображением. Предоставление пользовательской маски AND также позволит автору значка выполнять настройку и подсказки. Даже если маска AND не указана, если изображение находится в формате Windows BMP, заголовок BMP все равно должен указывать удвоенную высоту.
Важно отметить, что в маске AND, как и для массива пикселей битовой карты , байты заполнения должны быть добавлены в конец каждой строки, чтобы увеличить ее длину до кратной четырем байтам, поскольку это в основном (монохромная) битовая карта. [3] Маска AND битовой карты 8x8 пикселей будет иметь 1 байт данных и 3 байта заполнения (8*8*1bpp = 64 бита/8 = 8 байтов всех строк, поэтому каждая строка составляет 1 байт и требуется 3 байта заполнения), маска AND битовой карты 16x16 будет иметь 2 байта данных и 2 байта заполнения, маска AND битовой карты 32x32 будет иметь 4 байта данных и никакого заполнения. Обратите внимание, что количество необходимых байтов заполнения зависит от размеров битовой карты, а не от ее цветовой глубины, поскольку маска AND в любом случае составляет 1 бит на пиксель.
Все значения в файлах ICO/CUR представлены в порядке байтов от младшего к старшему .
Все данные изображений, на которые ссылаются записи в каталоге изображений, следуют непосредственно за каталогом изображений. Обычной практикой является хранение их в том же порядке, который определен в каталоге изображений.
Формат BMP
Если изображение сохранено в формате BMP, оно должно исключать открывающую структуру BITMAPFILEHEADER .
Высота изображения BMP должна быть в два раза больше высоты, объявленной в каталоге изображений. Это связано с тем, что фактические данные изображения будут содержать две части: фактическое изображение, за которым сразу следует 1-битная маска того же размера, что и изображение, используемая для определения того, какие пиксели будут нарисованы.
Маска должна быть выровнена по DWORD (32 бита) и должна быть заполнена нулями. Пиксель 0 означает «соответствующий пиксель на изображении будет нарисован», а 1 означает «игнорировать этот пиксель». Цвет пикселя либо явный для 24- и 32-битных версий (не имеющих цветовых таблиц), либо индексируется для других глубин (1,2,4,8,16) в таблице четырехбайтовых (BGRA) цветов, которая следует за BITMAPINFOHEADER.
Для 1 бита обычно используются два цвета: #00000000 и #00FFFFFF, а канал A игнорируется.
Данные пикселей для 1,2,4,8 и 16 бит упакованы побайтно и выровнены по типу DWORD.
24-битные изображения хранятся как тройки BGR, но не выровнены по типу DWORD.
32-битные изображения хранятся в виде квадраторов BGRA.
Первоначально ICO и CUR предназначались для использования на монохромных дисплеях и использовали формулу Output = (Existing AND Mask) XOR Image
, но на цветных экранах курсор формируется с использованием смешивания каналов A, а маска используется для определения того, какие пиксели включены или исключены.
Если изображение сохранено в формате PNG, то BITMAPINFOHEADER отсутствует, и вместо него используется полное содержимое изображения PNG.
Возможность чтения изображений PNG из изображений формата ICO была представлена в Windows Vista . [7] Изображение PNG может быть сохранено в файле image таким же образом, как это делается для стандартного изображения формата Windows BMP, за исключением того, что изображение PNG должно быть сохранено целиком, с заголовком файла и должно быть в формате 32bpp ARGB. [7]
Примечание: файлы CUR не могут использовать данные изображений PNG и должны использовать данные изображений BMP в соответствии с ICO. [7]
Значки и курсоры в файлах Portable Executable ( EXE или DLL ) организованы в ресурсы типа RT_GROUP_ICON , RT_GROUP_CURSOR , RT_ICON и RT_CURSOR . [13]
Ресурсы RT_GROUP_ICON и RT_GROUP_CURSOR содержат структуру NEWHEADER и одну или несколько структур RESDIR , которые имеют почти тот же формат, что и соответствующие структуры ICONDIR и ICONDIRENTRY в файлах ICO/CUR. Главное отличие в RESDIR заключается в том, что последний член структуры содержит двухбайтовый идентификатор ресурса RT_ICON / RT_CURSOR вместо смещения изображения в файле.
Структуры NEWHEADER / RESDIR во многих источниках также называются GRPICONDIR / GRPICONDIRENTRY . [14]
Ресурсы RT_ICON и RT_CURSOR имеют тот же формат данных изображения, что и в файлах ICO, и могут также хранить изображения PNG. Кроме того, первые четыре байта данных ресурса RT_CURSOR содержат данные о точке доступа курсора в виде двух значений WORD (16 бит) (в отличие от файлов CUR, в которых данные о точке доступа содержатся в структуре ICONDIRENTRY ). [15]
Библиотека иконок — это способ упаковки иконок Windows. Обычно это 16-битный новый исполняемый файл или 32-битный портативный исполняемый файл с расширением .ICL, где ресурсы иконок представляют собой упакованные иконки. Windows Vista и более поздние версии не поддерживают просмотр иконок из 16-битных ( новых исполняемых ) файлов. [16]
Курсор загружается правильно, независимо от глубины цвета, при которой был создан курсор. Однако система не может различать несколько кандидатов в одном файле курсора или ресурсе, которые отличаются только глубиной цвета. Значки, однако, полностью поддерживают несколько кандидатов на значки с различной глубиной цвета.
Максимальный размер иконок составляет 256x256 пикселей, что делает их подходящими для дисплеев с высоким разрешением (точек на дюйм). Эти иконки с высоким разрешением обеспечивают высокое визуальное качество в представлениях списков с большими иконками... Следует включать только 32-битную копию изображения размером 256x256 пикселей, и только изображение размером 256x256 пикселей следует сжимать, чтобы уменьшить размер файла.
используем "image/x-icon", потому что это тип MIME, который мы всегда использовали. Кто-то в какой-то момент (насколько мне известно, не связанный с Microsoft) предложил зарегистрировать тип MIME как "vnd.microsoft.icon", но Windows на самом деле его не использует, а использует image/x-icon.
См. второй комментарий.