Формат изображения значка Apple (.icns) — это формат значков , используемый в macOS компании Apple Inc. Он поддерживает значки размером 16 × 16, 32 × 32, 48 × 48, 128 × 128, 256 × 256, 512 × 512 точек в масштабе 1x и 2x, с 1- и 8 - битными альфа-каналами и несколькими состояниями изображения (пример : открытые и закрытые папки). Значки фиксированного размера могут масштабироваться операционной системой и отображаться в любом промежуточном размере.
Начиная с macOS 11 , каталоги ресурсов являются предпочтительным форматом файлов для пользовательских значков macOS. [1]
Структура файла
Формат файла состоит из 8-байтового заголовка, за которым следует любое количество значков.
Заголовок
Данные значка
Типы значков
- 1. Значение в скобках — это несжатая длина значков ARGB и 24-битного RGB.
- 2. Данные it32 всегда начинаются с заголовка из четырех нулевых байтов (проверялись все файлы icns в macOS 10.15.7 и macOS 11). Использование неизвестно, четыре нулевых байта могут иметь любое значение и игнорируются.
- †. Эти форматы поддерживаются в отдельных файлах icns, но не отображаются должным образом, если они используются в качестве значка приложения внутри пакета .app .
Формат данных изображения
- Моно-значки с альфа-маской могут отображать три цвета: белый, черный и прозрачный.
- 4-битные и 8-битные значки используют фиксированную цветовую палитру из 16 и 256 цветов соответственно.
- 24-битный формат RGB состоит из трех плотно упакованных сжатых каналов (см. Сжатие). Значок it32 должен начинаться с четырехбайтового заголовка, см. сноску выше.
- Формат ARGB состоит из значений ascii для «ARGB» и четырех плотно упакованных сжатых каналов (см. «Сжатие»).
Совместимость
- поля ARGB также принимают файлы в формате PNG, но не наоборот: вы не можете поместить изображения ARGB ни в одно из полей только для PNG (проверено на macOS 11).
- Изображения ARGB поддерживаются только в macOS 11 и более поздних версиях — macOS 10.15.7 не отображает изображения ARGB. Тем не менее, даже клавиши ARGB могут отображаться в macOS 10.15, если вы установите изображение JPEG 2000 или PNG (см. сноску об использовании в пакетах приложений выше).
- 24-битные значки RGB ( is32 , il32 , ih32 , it32 ) также поддерживают изображения в формате JPEG 2000 и PNG (протестировано на macOS 10.15.7 и macOS 11).
- Поддержка новых типов изображений, похоже, будет введена позже, чем ключевое поле (см. два предыдущих пункта). Таким образом, поддерживаемая версия ОС может быть неточной или корректироваться в зависимости от формата файла.
Другие типы
- Оглавление представляет собой список всех содержащихся типов (4 байта имени типа + 4 байта длины).
- Данные для всех вложенных файлов icns не содержат заголовка файла icns. Итак, если вы хотите сохранить данные в файл, вам необходимо добавить заголовок icns.
Типы элементов, отличных от PNG/JPEG2000
Типы элементов, которые работают с форматами изображений ARGB (32-бит) или RGB (24-бит), требуют разных типов заголовков перед двоичными данными. Важно отметить, что этот заголовок является частью данных изображения, а не 4-байтовым значением типа элемента значка с прямым порядком байтов (например, ic04 или ic05). [5]
Элементы ARGB
Изображения ARGB должны иметь двоичную часть данных изображения, которой предшествует четырехбайтовый заголовок «ARGB». После этого вместо каждого пикселя, каждый из четырех каналов которого хранится вместе (например, ARGBARGBARGB), изображение с тремя пикселями будет храниться в отдельных каналах данных пикселей (например, AAARRRGGGBBB). Кроме того, каждый канал данных пикселей необходимо закодировать, как указано ниже.
Элементы RGB
Изображения RGB имеют двоичную часть данных изображения, которой предшествуют четыре нулевых символа, только если тип элемента — «it32». Во всех остальных случаях заголовок не требуется. Данные канала разделяются так же, как и двоичные данные ARGB (например, RRRGGGBBB вместо RGBRGBRGB). Каждый канал также должен быть закодирован, как указано ниже.
Элементы маски
Элементы маски не кодируются подобно данным цветового канала изображения ARGB и RGB. Данные такие же, как и для изображения ARGB, за исключением того, что предоставляются только данные альфа-канала. Таким образом, для изображения с двумя пикселями, ARGBARGB, данные маски — AA.
Сжатие
Со временем формат был улучшен и появилась поддержка сжатия некоторых частей пиксельных данных. 24-битные данные пикселей RGB ( is32 , il32 , ih32 , it32 , icp4 , icp5 ) и ARGB ( ic04 , ic05 , icsb ) сжимаются (на канал) в формате, аналогичном PackBits . [6]
В некоторых источниках упоминается, что ОС поддерживает как сжатые, так и несжатые фрагменты данных. [ нужна цитация ] Однако создание файлов icns вручную с несжатыми 24-битными изображениями RGB или ARGB не будет отображаться должным образом — по крайней мере, в новых выпусках macOS (проверено на macOS 11).
Вот репозиторий GitHub с некоторым быстрым кодом, который, похоже, проходит тест как на кодирование, так и на декодирование, как описано здесь: ByteRunLengthCoder
Следующий псевдокод распаковывает данные:
Пока есть сжатые данные: Считайте один байт как беззнаковое число N. Если N < 0x80: Выведите следующие (N + 1) байты Еще : Вывести следующий байт (N — 0x80 + 3) раз.
Пример: 02 01 02 02 80 03 81 04 82 05
следует распаковать в01 02 02 03 03 03 04 04 04 04 05 05 05 05 05
Следующий псевдокод сжимает данные:
функция Encode (входные данные) Инициализировать вывод как пустой массив Установить индекс в 0 Пока индекс < количество данных. Инициализировать последовательность как пустой массив. Установить счетчик равным 0. // Уникальная последовательность While count ≤ 0x7F и индекс < количество данных If index + 2 < количество данных и data = data и data = data ] Прервать цикл / / Начало повторяющейся последовательности End If Добавить данные в последовательность Индекс приращения Количество приращений Конец пока Если последовательность не пуста . Добавить (счетчик - 1) к выходным данным . Добавить все элементы последовательно к выходным данным . Конец, если Если индекс ≥ количества данных. Прервать цикл . Конец. Если. // Повторяющаяся последовательность Установить повторенный Байт в data Установить счетчик в 0 Пока счетчик ≤ 0x7F и индекс ≤ данные и данные = повторенный Байт Индекс приращения Количество приращений Конец пока Если count ≥ 3 Добавить (0x80 + count - 3) к выходным данным Добавить повторенный байт к выходным данным Else // Менее 3 повторяющихся байтов Добавить (count - 1) к выходным данным Повторить (счетное количество) раз Добавить повторенный байт к выходным данным End Повторить End If End While Обратный вывод Конечная функция
Пример: 01 02 02 03 03 03 04 04 04 04 05 05 05 05 05
следует сжать до02 01 02 02 80 03 81 04 82 05
Известные вопросы
Начиная с macOS 11, существуют определенные проблемы/ошибки с форматом файла:
- При настройке is32+ics8 или ih32+ich8 будет отображаться правильный значок. Но установка il32+icl8 игнорирует маску прозрачности и отображает значок без прозрачности.
- Сжатые данные ARGB интерпретируются неправильно. Последнее значение синего канала (то есть самое последнее значение) игнорируется и обрабатывается так, как если бы оно было нулевым байтом. Обычно это не проблема, поскольку большинство значков в любом случае имеют прозрачность в правом нижнем углу. Однако это может стать проблемой, если последнее значение представляет собой повторяющийся байт (см. Сжатие). Потенциально до 130 пикселей может не иметь значения синего канала.
Обходной путь — добавить в конец дополнительный байт, который интерпретируется как управляющий символ без последующих данных. Вы можете сравнить разницу с этими двумя примерами:69636E73 00000024 69633034 0000001C 41524742 FFFFFBFF FF00FB00 FF00FB00 FFFFFBFF
69636E73 00000025 69633034 0000001D 41524742 FFFFFBFF FF00FB00 FF00FB00 FFFFFBFF 00
- В macOS 10.15.7 (вероятно, более ранней) и более поздних версиях возникает проблема с отображением значков PNG и JPEG 2000 для клавиш icp4 (16x16), icp5 (32x32) и icp6 (64x64). Клавиши работают нормально в отдельном файле icns, но если они используются в приложении, значки отображаются полностью зашифрованными. Либо используйте новый формат ARGB ic04 и ic05 (macOS 11+), либо старый 24-битный формат RGB + альфа-маска. Используйте последний со старыми ключами is32+s8mk и il32+l8mk или с новыми ключами icp4+s8mk и icp5+l8mk (записывая данные RGB в поля PNG [2] ). При использовании данных изображения ARGB обязательно укажите альтернативные форматы для macOS 10.15 и более ранних версий. Эту проблему особенно сложно обнаружить, если вы предоставляете оба значка: 16x16 и 16x16@2x, потому что если вы подключаете свой Mac к монитору без Retina, будет использоваться значок 16x16 без Retina, и поэтому значок будет отображаться в зашифрованном виде. Поле icp6 , похоже, не используется в значках приложений, и его можно смело игнорировать. Кроме того, если вы вообще не предоставите значки меньшего размера, ошибка также проявится, когда ОС уменьшит ваши большие значки PNG/JPEG 2000, поэтому обязательно визуализируйте меньшие размеры и включите их.
Поддерживать
Различные программы просмотра изображений могут загружать файлы, а также существуют *.icnsбесплатные конвертеры с открытым исходным кодом из PNG или в PNG . [7] [8] GTK+ может загружать *.icnsресурсы с 2007 года. [9] Другие инструменты, поддерживающие этот формат, включают Apple Icon Composer и icns Browser , The Iconfactory и IconBuilder .
MacOS [ необходимы пояснения ] предлагает встроенный iconutil
инструмент командной строки для упаковки и распаковки *.icnsфайлов.
Смотрите также
Рекомендации
- ^ «Руководство по человеческому интерфейсу». Apple Inc. Архивировано из оригинала 18 июня 2018 года . Проверено 10 апреля 2021 г.
- ^ abc Значок системы: /System/Library/CoreServices/Applications/Screen Sharing.app/Contents/Resources/InternetLocationVNC.icns , macOS 11
- ^ Значок системы: /System/Library/PrivateFrameworks/PassKitCore.framework/Versions/A/Resources/GenericIcon.icns , macOS 10.15.7
- ^ Значок системы: /System/Library/PrivateFrameworks/ConsoleKit.framework/Versions/A/Resources/SidebariPhone.icns , macOS 10.15.7
- ^ Репозиторий Fiahfy ICNS
- ^ Иконки Macintosh
- Ссылки _ Иконки проекта SourceForge . 2009 . Проверено 18 августа 2016 г.
- ^ "png2icns". Мойн Уддин. 2016 . Проверено 25 мая 2017 г.
- ^ Лионель Винсент (2007). «Значки Mac OS X для GTK+» . Проверено 18 августа 2016 г.
Внешние ссылки
- IconFamily (последнее обновление 2013 г.) — класс Objective C с открытым исходным кодом для чтения и записи файлов Apple icns.
- osxiconutils (не поддерживается) — инструменты командной строки для работы с файлами Apple icns.
- icnsutil — библиотека Python для чтения и записи файлов icns.
- icns — крейт Rust для чтения и записи файлов icns.
- createicns — библиотека C для чтения и записи файлов icns
- icon_records_extractor — библиотека C для извлечения всех записей icns, поскольку их собственные значки включают icns темного режима.