Skip to main content

icnsutil

A fully-featured python library to handle reading and writing .icns files.

Install

The easy way is to use the PyPi.org index:

pip3 install icnsutil

Or you can install it manually by creating a symlink to cli.py:

ln -s '/absolute/path/to/icnsutil/icnsutil/cli.py' /usr/local/bin/icnsutil
ln -s '/absolute/path/to/icnsutil/icnsutil/autosize/cli.py' /usr/local/bin/icnsutil-autosize

Or call the python module (if the module is in the search path):

python3 -m icnsutil
python3 -m icnsutil.autosize

Usage

See #tools for further options on icns processing (e.g., autosize).

positional arguments:
  command
    extract (e)   Read and extract contents of icns file(s).
    compose (c)   Create new icns file from provided image files.
    update (u)    Update existing icns file by inserting or removing media entries.
    info (i)      Print contents of icns file(s).
    test (t)      Test if icns file is valid.
    convert (img) Convert images between PNG, ARGB, or RGB + alpha mask.

Use command line interface (CLI)

# extract
icnsutil e Existing.icns -o ./outdir/

# compose
icnsutil c New.icns 16x16.png 16x16@2x.png *.jp2 --toc

# update
icnsutil u Existing.icns -rm toc ic04 ic05
icnsutil u Existing.icns -set is32=16.rgb dark="dark icon.icns"
icnsutil u Existing.icns -rm dark -set ic04=16.argb -o Updated.icns

# print
icnsutil i Existing.icns

# verify valid format
icnsutil t Existing.icns

# convert image
icnsutil img 1024.png 512@2x.jp2
# or reuse original filename
icnsutil img argb 16x16.png
icnsutil img rgb 32.png
icnsutil img png 16.rgb 16.mask

Use python library

import icnsutil

# extract
img = icnsutil.IcnsFile('Existing.icns')
img.export(out_dir, allowed_ext='png',
           recursive=True, convert_png=True)

# compose
img = icnsutil.IcnsFile()
img.add_media(file='16x16.png')
img.add_media(file='16x16@2x.png')
img.write('./new-icon.icns')

# update
img = icnsutil.IcnsFile('Existing.icns')
img.add_media('icp4', file='16x16.png', force=True)
if img.remove_media('TOC '):
    print('table of contents removed')
img.write('Existing.icns', toc=True)

# print
# return type str
desc = icnsutil.IcnsFile.description(fname, indent=2)
print(desc)

# verify valid format
# return type Iterator[str]
itr = icnsutil.IcnsFile.verify(fname)
print(list(itr))
# If you just want to check if a file is faulty, you can use `any(itr)` instead.
# This way it will not test all checks but break early after the first hit.

Converting between (A)RGB and PNG

You can use the library without installing PIL. However, if you want to convert between PNG and ARGB files, Pillow is required.

pip install Pillow
import icnsutil

# Convert from ARGB to PNG
icnsutil.ArgbImage(file='16x16.argb').write_png('16x16.png')

# Convert from PNG to 24-bit RGB
img = icnsutil.ArgbImage(file='32x32.png')
with open('32x32.rgb', 'wb') as fp:
    fp.write(img.rgb_data())
with open('32x32.mask', 'wb') as fp:
    fp.write(img.mask_data())

Note: the CLI export command will fail if you run --convert without Pillow.

Tools

Autosize

icnsutil.autosize is a tool to automatically generate smaller icon sizes from a larger one. Currently, autosize has support for “normal” raster images (via sips or Pillow) and SVG images (via resvg or Chrome Headless).

icnsutil-autosize icon.svg -32 intermediate.png -16 small.svg
# or
python3 -m icnsutil.autosize icon.svg -32 intermediate.png -16 small.svg

Additionally, autosize will also try to convert 32px and 16px PNG images to ARGB. If Pillow is not installed, this step will be skipped (without negative side effects). The output is an iconset folder with all necessary images.

You may ask why this tool does not create the icns file immediatelly? This way you can modify the generated images before packing them into an icns file. For example, you can run ImageOptim to compress the images and reduce the overall icns filesize.

HTML icon viewer

Here are two tools to open icns files directly in your browser. Both tools can be used either with an icns file or a rgb / argb image file.

  • The inspector shows the structure of an icns file (useful to understand byte-unpacking in ARGB and 24-bit RGB files).
  • The viewer displays icons in ARGB or 24-bit RGB file format.

Help needed

  1. Do you have an old macOS version running somewhere?
    You can help and identify what file formats / icns types were introduced and when. Download the format-support-icns.zip file and report back which icons are displayed properly and in which macOS version.
    See the Apple Icon Image wikipedia article.

  2. You can run make sys-icons-test and report back whether you find some weird icons that are not handled properly by this library.

Metadata

Release files for icnsutil 1.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for icnsutil 1.1.0
File Size Uploaded Provenance
icnsutil-1.1.0.tar.gz 23.7 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for icnsutil 1.1.0
File Interpreter ABI Platform
icnsutil-1.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 50.3 kB

Release files / icnsutil-1.1.0.tar.gz

Download URL icnsutil-1.1.0.tar.gz
Size 23.7 kB
Tags Source
SHA-256 checksum
How to use checksums
fb1556edf0077af5d78934d8da887d3810acc29ee28716df70b7f805f781ed77
BLAKE2b-256 checksum
How to use checksums
50fdfa849e34e71468ffce0a8067cf1a99f15697b7d3d192b233ffa9ef112039
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.8.2

Release files / icnsutil-1.1.0-py3-none-any.whl

Download URL icnsutil-1.1.0-py3-none-any.whl
Size 26.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fd8a16e385b75bbf76735762b03b3c9319d1fa6624e5dba9d320c7ee30cb6425
BLAKE2b-256 checksum
How to use checksums
b657030441e24d057dacbbbc0eaec4cc94160984a295cebe1e9f69f0a55717d9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.8.2

Security for icnsutil 1.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

1.1.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page