Apple provides Icon Composer as part of their free developer tools. This is the only officially sanctioned way to create icns files. Most other editors don't support all the possible features. The idea is you create a png file for each size you want, then create an icns file in Icon Composer, and import your various png files into it. Mac icns Icons - Download 225 Free Mac icns icons @ IconArchive. Search more than 600,000 icons for Web & Desktop here.
| Filename extension | |
|---|---|
| Type code | icns |
| Uniform Type Identifier (UTI) | com.apple.icns |
| Developed by | Apple Inc. |
| Type of format |
The Apple Icon Image format is the icon format used in Apple Inc.'s macOS. It supports icons of 16 × 16, 32 × 32, 48 × 48, 128 × 128, 256 × 256, 512 × 512 points at 1x and 2x scale, with both 1- and 8-bitalpha channels and multiple image states (example: open and closed folders). The fixed-size icons can be scaled by the operating system and displayed at any intermediate size.
The file format consists of an 8 byte header, followed by any number of icons.
| Offset | Size | Purpose |
|---|---|---|
| 0 | 4 | Magic literal, must be 'icns' (0x69, 0x63, 0x6e, 0x73) |
| 4 | 4 | Length of file, in bytes, msb first |
| Offset | Size | Purpose |
|---|---|---|
| 0 | 4 | Icon type, see OSType below. |
| 4 | 4 | Length of data, in bytes (including type and length), msb first |
| 8 | Variable | Icon data |
| lead value | tail bytes | result uncompressed |
|---|---|---|
| 0…127 | 1…128 | 1…128 bytes |
| 128…255 | 1 byte | 3…130 copies |
Over time the format has been improved and there is support for compression of some parts of the pixel data. The 32-bit ('is32', 'il32', 'ih32','it32') and ARGB ('ic04', 'ic05') pixel data are often compressed (per channel) with a format similar to PackBits.[1]Some sources mentioned that the OS supports both compressed or uncompressed data chunks.
The following pseudocode decompresses the data:
Example: 02 01 02 02 80 03 81 04 82 05 should decompress to 01 02 02 03 03 03 04 04 04 04 05 05 05 05 05
| OSType | Length (bytes) | Size (pixels) | Supported OS Version | Description |
|---|---|---|---|---|
| ICON | 128 | 32 | 1.0 | 32×32 1-bit mono icon |
| ICN# | 256 | 32 | 6.0 | 32×32 1-bit mono icon with 1-bit mask |
| icm# | 48 | 16 | 6.0 | 16×12 1 bit mono icon with 1-bit mask |
| icm4 | 96 | 16 | 7.0 | 16×12 4 bit icon |
| icm8 | 192 | 16 | 7.0 | 16×12 8 bit icon |
| ics# | 64 (32 img + 32 mask) | 16 | 6.0 | 16×16 1-bit mask |
| ics4 | 128 | 16 | 7.0 | 16×16 4-bit icon |
| ics8 | 256 | 16 | 7.0 | 16x16 8 bit icon |
| is32 | varies (768) | 16 | 8.5 | 16×16 24-bit icon |
| s8mk | 256 | 16 | 8.5 | 16x16 8-bit mask |
| icl4 | 512 | 32 | 7.0 | 32×32 4-bit icon |
| icl8 | 1,024 | 32 | 7.0 | 32×32 8-bit icon |
| il32 | varies (3,072) | 32 | 8.5 | 32x32 24-bit icon |
| l8mk | 1,024 | 32 | 8.5 | 32×32 8-bit mask |
| ich# | 288 | 48 | 8.5 | 48×48 1-bit mask |
| ich4 | 1,152 | 48 | 8.5 | 48×48 4-bit icon |
| ich8 | 2,304 | 48 | 8.5 | 48×48 8-bit icon |
| ih32 | varies (6,912) | 48 | 8.5 | 48×48 24-bit icon |
| h8mk | 2,304 | 48 | 8.5 | 48×48 8-bit mask |
| it32 | varies (49,152) | 128 | 10.0 | 128×128 24-bit icon |
| t8mk | 16,384 | 128 | 10.0 | 128×128 8-bit mask |
| icp4 | varies | 16 | 10.7 | 16x16 icon in JPEG 2000 or PNG format |
| icp5 | varies | 32 | 10.7 | 32x32 icon in JPEG 2000 or PNG format |
| icp6 | varies | 64 | 10.7 | 64x64 icon in JPEG 2000 or PNG format |
| ic07 | varies | 128 | 10.7 | 128x128 icon in JPEG 2000 or PNG format |
| ic08 | varies | 256 | 10.5 | 256×256 icon in JPEG 2000 or PNG format |
| ic09 | varies | 512 | 10.5 | 512×512 icon in JPEG 2000 or PNG format |
| ic10 | varies | 1024 | 10.7 | 1024×1024 in 10.7 (or 512x512@2x 'retina' in 10.8) icon in JPEG 2000 or PNG format |
| ic11 | varies | 32 | 10.8 | 16x16@2x 'retina' icon in JPEG 2000 or PNG format |
| ic12 | varies | 64 | 10.8 | 32x32@2x 'retina' icon in JPEG 2000 or PNG format |
| ic13 | varies | 256 | 10.8 | 128x128@2x 'retina' icon in JPEG 2000 or PNG format |
| ic14 | varies | 512 | 10.8 | 256x256@2x 'retina' icon in JPEG 2000 or PNG format |
| ic04 | varies | 16 | 16x16 ARGB | |
| ic05 | varies | 32 | 32x32 ARGB | |
| icsB | varies | 36 | 36x36 | |
| icsb | varies | 18 | 18x18 |

| OSType | Length (bytes) | Description |
|---|---|---|
| 'TOC ' | varies | 'Table of Contents' a list of all image types in the file, and their sizes (added in Mac OS X 10.7) |
| 'icnV' | 4 | 4-byte big endian float - equal to the bundle version number of Icon Composer.app that created to icon |
| 'name' | Unknown | |
| 'info' | 259 | Info binary plist. Usage unknown |
Various image viewers can load *.icns files, and free and open source converters from or to PNG also exist.[2][3]GTK+ can load *.icns resources since 2007.[4] Other tools supporting the format include the Apple Icon Composer and icns Browser, The Iconfactory, and IconBuilder.
MacOS[clarification needed] offers the built-in iconutil command line tool to pack and unpack *.icns files.
Developing an application for Mac OS, sooner or later you’ll want to add an icon to it. And Mac OS uses Apple’s own format for application icons - Apple Icon Image format - files with .icns extension. But how does one create such a file?
It is actually not so hard, but there are some tricky moments. I’ll cover those and as a bonus I’ll show you how to use .icns icon in Qt-based application (deadly simple).
There is an out-of-the-box Mac OS tool for such conversion - iconutil (documentation for which is nowhere to find at Apple’s website, so this brief man page is all we have).
However, you cannot just take a random PNG and feed it to iconutil. I mean, you can, but it will give you the following error:
Because iconutil takes only specially named folders. Just how am I supposed to know about that? And it shows similar short and useless error messages for other things it doesn’t like. For example, here’s an output for the situation when files inside iconset folder are not named “properly” or have “wrong” dimensions:
Go figure.
After a set of trials and browsing the internet I found out (hopefully) all the requirements:
.iconset “extension”, for example some.iconset;Correct dimensions can be found in Apple Guidelines. So it’s 5 different dimensions, but actually 10 “physical” files as each dimension is represented twice (you’ll see why). And these files have to be named according to the following format:
So here’s the full list of proper filenames:
At the same time, I’ve got a commit to my script, and this commit adds more sizes, which supposedly solves some missing size error. I never got such an error, so even though I accepted the commit, I won’t add those changes to the article.
But that’s rather boring to create all those files manually in some graphics editor, right? So let’s use sips utility (although, I recommend using ImageMagick, as it gives better quality results):
Better, but still - we have to run it 10 times. So let’s write a Python script for that:
The full script is published here.
As an example, I prepared a square picture with a resolution of 2048x2048 and 150 pixel per inch, so there is plenty room to prevent upscaling:
Pass picture path to the script like that:
The script will:
~/Desktop/apple.iconset;iconutil on this folder and put resulting apple.icns to ~/Desktop/.Here’s how the final apple.icns looks like in Preview:
So everything from that folder is bundled into one file.
And now the bonus part - how to use .icns as an icon for a Qt-based application.
As I said, it’s deadly simple: put apple.icns into your Qt project folder and add the following line into your-project.pro:
And that’s it: