#icons #icns #ico

iconwriter

编码常见图标文件格式的简单解决方案

15个版本 (稳定)

2.0.1 2021年1月4日
1.7.0 2020年12月4日
1.7.0-测试版2021年1月3日
1.3.0 2020年11月30日
0.1.6 2020年11月28日

#556 in 图像

每月下载 27次

自定义许可证

55KB
927

IconWriter

Crate API Minimum rustc version

编码常见图标文件格式(如.ico.icnsfavicon)的简单解决方案。

该crate主要是其他库的包装器,将现有的API统一到一个单一的、统一的接口中。

概览

一个图标条目图像之间的映射组成。一个条目仅仅是图标键类型

IconWriter简单地自动化图像重新缩放、创建条目并将它们组合成一个图标的过程。

每个图标格式都与特定的键类型相关联,这决定了如何标记条目。每个只能与一个图像相关联。

例如,仅通过其相关联的图像的尺寸区分条目图标格式通过正整数标记,例如.ico.icns文件格式。

另一方面,通过路径区分其条目图标格式,例如png序列FreeDesktop图标主题,通过路径标记。

请注意,由于一个条目中包含的图像的尺寸由其相关联的条目指定,每个都必须可以转换为正整数。因此,所有键类型都必须实现AsRef<u32>

重采样

使用重采样滤波器缩放图片,这些滤波器由函数表示,该函数接受一个源图像和一个大小,并返回一个重新缩放的图像

这允许该crate的使用者提供他们自己的重采样滤波器。常见的重采样滤波器在resample模块中提供。

示例

IconWriter简单地自动化图片重新缩放和组合成图标的过程。

使用重采样滤波器缩放图片,这些滤波器由函数表示,该函数接受一个源图像和一个大小,并返回一个重新缩放的图像

重采样过滤器由函数表示,这些函数接受源图像和大小,并返回重缩放的原始RGBA缓冲区。这允许此包的用户提供他们自己的重采样过滤器。常用的重采样过滤器由resample模块提供。

示例

通用用法

可以使用Icon::add_entry自动重采样源图像并将它们转换为图标的条目

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)
}

写入磁盘

实现了Icon特质的实现者可以使用io::WriteIcon::write方法写入任何实现了的对象。

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)
}

或者,可以使用Icon::save方法将图标直接写入磁盘上的文件。

use iconwriter::favicon::Favicon;
use std::{io, fs::File};
 
fn example() -> io::Result<()> {
    let icon = Favicon::new();

    /* Process the icon */

    icon.save("./output/")
}

支持

图标格式

以下是IconWriter原生支持的输出格式。请注意,可以使用Icon特质创建自定义输出类型。

  • ico
  • icns
  • favicon

icns支持

IconWriter使用icns包来生成.icns文件。支持的图标类型如下由该包的创建者指定

OSType 描述 支持?
ICON 32×32 1位条目 不支持
ICN# 32×32 1位条目带1位掩码 不支持
icm# 16×12 1位条目带1位掩码 不支持
icm4 16×12 4位条目 不支持
icm8 16×12 8位条目 不支持
ics# 16×16 1位掩码 不支持
ics4 16×16 4位条目 不支持
ics8 16x16 8位条目 不支持
is32 16×16 24位条目
s8mk 16x16 8位掩码
icl4 32×32 4位条目 不支持
icl8 32×32 8位条目 不支持
il32 32x32 24位条目
l8mk 32×32 8位掩码
ich# 48×48 1位掩码 不支持
ich4 48×48 4位条目 不支持
ich8 48×48 8位条目 不支持
ih32 48×48 24位条目
h8mk 48×48 8位掩码
it32 128×128 24位条目
t8mk 128×128 8位掩码
icp4 16x16 32位 png/jp2条目 png仅支持
icp5 32x32 32位 png/jp2条目 png仅支持
icp6 64x64 32位 png/jp2条目 png仅支持
ic07 128x128 32位 png/jp2条目 png仅支持
ic08 256×256 32位 png/jp2条目 png仅支持
ic09 512×512 32位 png/jp2条目 png仅支持
ic10 512x512@2x "retina" 32位 png/jp2条目 png仅支持
ic11 16x16@2x "retina" 32位 png/jp2条目 png仅支持
ic12 32x32@2x "retina" 32位 png/jp2条目 png仅支持
ic13 128x128@2x "retina" 32位 png/jp2条目 png仅支持
ic14 256x256@2x "retina" 32位 png/jp2条目 png仅支持

图像格式

IconWriter 使用 image 进行矢量图形处理,并使用带有 raqote 后端的 resvgsvg 进行光栅化。注意,raqote 需要使用 cmake 构建。

格式 支持?
png 所有支持的颜色类型
jpeg 基线型和渐进型
gif
bmp
ico
tiff 基线型(不支持传真),lzw,PackBits
webp 有损(仅亮度通道)
pnm pbmpgmppm、标准 pma
svg 静态 SVG 全 1.1

依赖关系

~15–24MB
~363K SLoC