![]() | |
| ファイル名拡張子 |
.icns |
|---|---|
| インターネットメディアの種類 | 画像/x-icns |
| タイプコード | アイコン |
| 統一型識別子 (UTI) | com.apple.icns |
| 魔法の数字 | 69 63 6e 73 |
| 開発者 | アップル社 |
| フォーマットの種類 | アイコン ファイル形式 |
Apple Icon Image 形式(.icns) は、Apple Inc.のmacOSで使用されるアイコン形式です。1 倍および 2 倍のスケールで 16 × 16、32 × 32、48 × 48、128 × 128、256 × 256、512 × 512 ポイントのアイコンをサポートし、1 ビットおよび8ビットのアルファ チャネルと複数の画像状態 (例: 開いているフォルダと閉じているフォルダ) をサポートします。固定サイズのアイコンは、オペレーティング システムによって拡大縮小され、任意の中間サイズで表示できます。
macOS 11以降では、macOSカスタムアイコンのファイル形式としてアセットカタログが推奨されています。[1]
ファイル構造
ファイル形式は、8 バイトのヘッダーと、それに続く任意の数のアイコンで構成されます。
ヘッダ
アイコンデータ
アイコンの種類
- 1.括弧内の値は、ARGB および 24 ビット RGB アイコンの非圧縮長さです。
- 2. it32データは常に 4 つのゼロ バイトのヘッダーで始まります (macOS 10.15.7 および macOS 11 のすべての icns ファイルをテスト済み)。使用法は不明で、4 つのゼロ バイトは任意の値になる可能性があり、黙って無視されます。
- †.これらの形式はスタンドアロンの icns ファイルではサポートされていますが、 .appパッケージ内のアプリケーション アイコンとして使用した場合は正しく表示されません。
画像データ形式
- アルファマスク付きのモノアイコンは、白、黒、透明の 3 色を表示できます。
- 4 ビット アイコンと 8 ビット アイコンは、それぞれ 16 色と 256 色の固定カラー パレットを使用します。
- 24 ビット RGB 形式は、密に圧縮された 3 つのチャネルで構成されます (圧縮を参照)。it32アイコンは 4 バイトのヘッダーで始まる必要があります (上記の脚注を参照)。
- ARGB 形式は、「ARGB」の ASCII 値と、密に圧縮された 4 つのチャネルで構成されます (「圧縮」を参照)。
互換性
- ARGB フィールドは PNG 形式のファイルも受け入れますが、その逆はできません。PNG のみのフィールドに ARGB 画像を配置することはできません (macOS 11 でテスト済み)。
- ARGB 画像は macOS 11 以降でのみサポートされています。macOS 10.15.7 では ARGB 画像は表示されません。ただし、JPEG 2000 または PNG 画像を設定すると、ARGB キーも macOS 10.15 で表示できます (上記のアプリ パッケージでの使用に関する脚注を参照)。
- 24 ビット RGB アイコン ( is32、il32、ih32、it32 ) では、JPEG 2000 および PNG 形式の画像も使用できます (macOS 10.15.7 および macOS 11 でテスト済み)。
- 新しいイメージタイプのサポートは、キーフィールドよりも後に導入されたようです (前の 2 つのポイントを参照)。そのため、サポートされている OS バージョンは正確ではないか、ファイル形式に基づいて調整される可能性があります。
その他のタイプ
- 目次は、含まれるすべての型 (4 バイトの型名 + 4 バイトの長さ) のリストです。
- ネストされたすべての icns ファイルのデータには、icns ファイル ヘッダーが含まれていません。そのため、データをファイルに保存する場合は、icns ヘッダーを先頭に追加する必要があります。
PNG / JPEG2000以外の要素タイプ
ARGB(32ビット)またはRGB(24ビット)画像形式を扱う要素タイプでは、バイナリデータの前に異なるタイプのヘッダーが必要です。このヘッダーは画像データの一部であり、4バイトのビッグエンディアンアイコン要素タイプ値(例:ic04またはic05)ではないことに注意することが重要です。[5]
ARGB 要素 ARGB 画像では、画像データのバイナリ部分の前に 4 バイトの「ARGB」ヘッダーが必要です。その後、各ピクセルの 4 つのチャネルが一緒に保存されるのではなく (例: ARGBARGBARGB)、3 つのピクセルを含む画像がピクセル データの個別のチャネルに保存されます (例: AAARRRRGGGBBB)。さらに、ピクセル データのそれぞれのチャネルは、以下のようにエンコードする必要があります。
RGB 要素 RGB 画像では、要素タイプが 'it32' の場合のみ、画像データのバイナリ部分の先頭に 4 つのゼロ バイト文字が付きます。その他の場合は、ヘッダーは必要ありません。チャンネル データは、ARGB バイナリ データと同様に分離されます (例: RGBRGBRGB ではなく RRRGGGBBB)。各チャンネルは、以下のようにエンコードされる必要があります。
マスク要素 マスク要素は、 ARGB や RGB イメージのカラー チャネル データのようにエンコードされません。アルファ チャネル データのみが提供される点を除いて、データは ARGB イメージのデータと同じです。したがって、2 つのピクセルを持つイメージ (ARGBARGB) の場合、マスク データは AA です。
圧縮
時間の経過とともにフォーマットは改良され、ピクセルデータの一部の圧縮がサポートされるようになりました。24ビットRGB(is32、il32、ih32、it32、icp4、icp5)およびARGB(ic04、ic05、icsb )ピクセルデータは、 PackBitsに似た形式で(チャネルごとに)圧縮されます。[6] 一部の情報源によると、OSは圧縮データチャンクと非圧縮データチャンクの両方をサポートしています。[要出典]ただし、圧縮されていない24ビットRGBまたはARGB画像を含むicnsファイルを手動で作成すると、少なくとも新しいmacOSリリース(macOS 11でテスト済み)では適切に表示されません。
ここに、エンコードとデコードの両方のテストに合格したと思われる Swift コードが含まれた GitHub リポジトリがあります: ByteRunLengthCoder
次の疑似コードはデータを解凍します。
圧縮されたデータがある場合:
1バイトを符号なし数値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に設定します。
// 一意のシーケンス
count ≤ 0x7Fかつ index < データ数 の場合index + 2
<データ数かつdata [ index] = data [ index +1]かつdata [index] = data [index+2]の場合ループを中断// 繰り返しシーケンスの開始End If
シーケンスにデータ[インデックス]を追加する
インデックスを増分
カウントを増分する
終了 中
シーケンスが空でない
場合、出力に(count - 1)を追加します。シーケンス内のすべての項目を出力
に追加します。
終了
インデックス≥データ数の
場合、ループを終了し、
// 繰り返しシーケンス
repeatByte をdata [index]に設定countを0
に設定count ≤ 0x7Fかつindex ≤ dataかつdata [index] = repeatByteの場合
インデックスを増分
カウントを増分する
終了 中
count ≥ 3
の場合、出力
に(0x80 + count - 3)を追加します。出力
にrepeatByte を追加します。それ以外の場合// 繰り返しバイトが 3 未満の場合、出力
に(count - 1)を追加します。 (count) 回
繰り返します。出力
にrepeatByte を追加します。End Repeat 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 ピクセルに青チャンネル値が欠落する可能性があります。
回避策としては、後続のデータなしで制御文字として解釈される追加のバイトを末尾に追加します。次の 2 つの例で違いを比較できます。69636E73 00000024 69633034 0000001C 41524742 FFFFFBFF FF00FB00 FF00FB00 FFFFFBFF69636E73 00000025 69633034 0000001D 41524742 FFFFFBFF FF00FB00 FF00FB00 FFFFFBFF 00
- macOS 10.15.7(おそらくそれ以前)以降のバージョンでは、icp4(16x16)、icp5(32x32)、icp6(64x64)のキーのPNGおよびJPEG 2000アイコンの表示に問題があります。キーはスタンドアロンの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 モニターに接続すると、非 Retina 16x16 アイコンが使用され、アイコンが乱れて表示されるからです。icp6 フィールドはアプリケーション アイコンでは使用されていないようで、無視しても問題ありません。さらに、小さいアイコン サイズをまったく提供しない場合は、OS が大きな PNG/JPEG 2000 アイコンを縮小したときにもバグが発生します。そのため、小さいサイズをレンダリングして含めるようにしてください。
サポート
さまざまな画像ビューアで*.icnsファイルを読み込むことができ、PNGとの間で無料のオープンソースコンバータも存在します。[7] [8] GTK+は*.icns2007年からリソースを読み込むことができます。 [9]この形式をサポートする他のツールには、Apple Icon Composerとicns Browser、The Iconfactory、IconBuilderなどがあります。MacOS
[要説明]
には、ファイルを
パックおよびアンパックするための組み込みのコマンドラインツールが用意されています。iconutil*.icns
参照
参考文献
- ^ 「Human Interface Guidelines」。Apple Inc. 2018年6月18日時点のオリジナルよりアーカイブ。2021年4月10日閲覧。
- ^ 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 アイコン
- ^ "libicns". SourceForgeプロジェクト icns. 2009 . 2016 年8 月 18 日閲覧。
- ^ "png2icns". Moin Uddin. 2016年. 2017年5月25日閲覧。
- ^ Lyonel Vincent (2007). 「GTK+ 用 Mac OS X アイコン」 . 2016 年8 月 18 日閲覧。
外部リンク
- IconFamily (最終更新 2013) – Apple icns ファイルの読み取りと書き込みを行うオープンソースの Objective C クラス
- osxiconutils (メンテナンスされていません) – Apple icns ファイルを操作するコマンドライン ツール
- icnsutil – icns ファイルを読み書きするための Python ライブラリ
- icns - icns ファイルを読み書きするための Rust クレート
- createicns - icns ファイルを読み書きするための C ライブラリ
- icon_records_extractor - ダーク モードの icns を含むすべての icns レコードを独自のアイコンとして抽出する C ライブラリ。

