15 releases (stable)
2.0.1 | Jan 4, 2021 |
---|---|
1.7.0 | Dec 4, 2020 |
1.7.0-beta | Jan 3, 2021 |
1.3.0 | Nov 30, 2020 |
0.1.6 |
|
#586 in Images
42 downloads per month
55KB
927 lines
IconWriter
A simple solution for encoding common icon file-formats, such as .ico
, .icns
and favicon.
This crate is mostly a wrapper for other libraries, unifying existing APIs into a single, cohesive interface.
Overview
An icon consists of a map between entries and images. An entry is simply the key type of an icon.
IconWriter simply automates the process of re-scaling images, creating entries and combining them into an icon.
Keys
Each icon format is associated with a particular key type, which determines how entries are labeled. Each key can only be associated with a single image.
For example, icon formats that only differentiate entries by the dimensions of their associated
images are labeled by positive integers, such as the .ico
and .icns
file-formats.
On the other hand, icon formats that distinguish their entries by path, such as png sequeces and FreeDesktop icon themes , are labeled by path.
Note that, since the dimensions
of the images contained in an entry are dictated by their associated entries, every key
must be convertible to a positive integers. Therefore, all key types are required to implement
AsRef<u32>
.
Resampling
Pictures are scaled using resampling filters, which are represented by functions that take a source image and a size and return a re-scaled image.
This allows the users of this crate to provide their custom resampling filters. Common resampling
filters are provided in the
resample
module.
Examples
IconWriter simply automates the process of re-scaling pictures and combining them into an icon.
Pictures are scaled using resampling filters, which are represented by functions that take a source image and a size and return a re-scaled image.
Resampling filters are represented by functions that take a source image and a size and return a rescaled raw RGBA buffer. This allows the users of this crate to provide their custom resampling filters. Common resampling filters are provided by the resample
module.
Examples
General Usage
The Icon::add_entry
can be used to automatically resample
source images and converts them to entries in an icon.
use iconwriter::{Ico, Image, Icon, IconError};
fn example() -> Result<(), IconError> {
let icon = Ico::new();
let src = Image::open("image.svg")?;
icon.add_entry(resample::linear, &img, 32)
}
Writing to Disk
Implementors of the Icon
trait can be written to any object
that implements io::Write
with the Icon::write
method.
use iconwriter::favicon::Favicon;
use std::{io, fs::File};
fn example() -> io::Result<()> {
let icon = Favicon::new();
// Process the icon ...
let file = File::create("out.icns")?;
icon.write(file)
}
Alternatively, icons can be directly written to a file on
disk with Icon::save
method.
use iconwriter::favicon::Favicon;
use std::{io, fs::File};
fn example() -> io::Result<()> {
let icon = Favicon::new();
/* Process the icon */
icon.save("./output/")
}
Support
Icon Formats
This are the output formats IconWriter nativally supports. Be aware that custum output types can
be created using the Icon
trait.
ico
icns
- favicon
Icns Support
IconWriter uses the icns
crate for generating .icns
files. The
supported icon types are specified
by the creators of such crate as follows:
OSType | Description | Supported? |
---|---|---|
ICON |
32×32 1-bit entry | No |
ICN# |
32×32 1-bit entry with 1-bit mask | No |
icm# |
16×12 1-bit entry with 1-bit mask | No |
icm4 |
16×12 4-bit entry | No |
icm8 |
16×12 8-bit entry | No |
ics# |
16×16 1-bit mask | No |
ics4 |
16×16 4-bit entry | No |
ics8 |
16x16 8-bit entry | No |
is32 |
16×16 24-bit entry | Yes |
s8mk |
16x16 8-bit mask | Yes |
icl4 |
32×32 4-bit entry | No |
icl8 |
32×32 8-bit entry | No |
il32 |
32x32 24-bit entry | Yes |
l8mk |
32×32 8-bit mask | Yes |
ich# |
48×48 1-bit mask | No |
ich4 |
48×48 4-bit entry | No |
ich8 |
48×48 8-bit entry | No |
ih32 |
48×48 24-bit entry | Yes |
h8mk |
48×48 8-bit mask | Yes |
it32 |
128×128 24-bit entry | Yes |
t8mk |
128×128 8-bit mask | Yes |
icp4 |
16x16 32-bit png /jp2 entry |
png only |
icp5 |
32x32 32-bit png /jp2 entry |
png only |
icp6 |
64x64 32-bit png /jp2 entry |
png only |
ic07 |
128x128 32-bit png /jp2 entry |
png only |
ic08 |
256×256 32-bit png /jp2 entry |
png only |
ic09 |
512×512 32-bit png /jp2 entry |
png only |
ic10 |
512x512@2x "retina" 32-bit png /jp2 entry |
png only |
ic11 |
16x16@2x "retina" 32-bit png /jp2 entry |
png only |
ic12 |
32x32@2x "retina" 32-bit png /jp2 entry |
png only |
ic13 |
128x128@2x "retina" 32-bit png /jp2 entry |
png only |
ic14 |
256x256@2x "retina" 32-bit png /jp2 entry |
png only |
Image Formats
IconWriter uses image
for raster graphics manipulations and
resvg
with the raqote
backend for svg
rasterization. Note that raqote
requires cmake
to build.
Format | Supported? |
---|---|
png |
All supported color types |
jpeg |
Baseline and progressive |
gif |
Yes |
bmp |
Yes |
ico |
Yes |
tiff |
Baseline(no fax support), lzw , PackBits |
webp |
Lossy(Luma channel only) |
pnm |
pbm , pgm , ppm , standard pma |
svg |
Static SVG Full 1.1 |
Dependencies
~15–24MB
~372K SLoC