4个版本 (2个破坏性版本)
0.3.0 | 2023年3月17日 |
---|---|
0.2.0 | 2022年3月14日 |
0.1.3 | 2022年1月20日 |
0.1.2 | 2022年1月20日 |
#5 in #identicon
3,165 monthly downloads
Used in substrate_parser
43KB
544 代码行
Crate plot_icon
概述
这是一个用于生成标准19圆圈图标(png和svg格式)的lib crate。
输出是 Vec<u8>
png
数据,或者包含 svg
数据的 svg::Document
,两者都很容易打印到文件中。
此crate的标识符颜色方案和元素排列遵循发布的用于polkadot identicon生成的javascript代码。此crate主要供 Signer 使用。
输入
为 &[u8]
输入切片生成identicon。在identicon生成过程中,此输入切片将被哈希,因此任何长度都是可接受的。
典型的输入切片是公钥。公钥通常以十六进制字符串(d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d
)或以base58网络特定字符串(5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY
)的形式出现,两者都可以轻松转换为 &[u8]
输入。
Crate还支持使用用户提供的RGBA格式的颜色生成类似identicon的图像。
PNG
签名者使用PNG格式的图像,因为SVG格式在设备端支持不足,并且可能是不确定的。因此,这个库主要依赖于PNG生成。功能"pix"
(默认启用)使生成PNG图像成为可能。
函数generate_png
为身份图标生成PNG数据,需要
&[u8]
切片- 目标图像大小(以像素为单位)(
u16
)
PNG图像是逐像素生成的,最终图像的质量由图像大小决定。每个落在身份图标圆形元素内(具有浮点圆形参数)的png
像素(具有整数坐标)都获得圆的颜色。在一定的图像大小(大约100像素)以下,圆形变得过于像素化。此外,具有偶数像素大小的图像会偏离中心一个像素。
签名者需要小的PNG身份图标。确切的参数尚未确定(目前,身份图标为30像素且与设备无关),然而,使用generate_png
的简单方法并不产生可接受的结果。
可能的解决方案是生成更大的身份图标,然后在签名者前端将其缩小,但已经注意到缩放结果(像素化、颜色分布)是设备相关的,尽管这是一个小问题,但在身份图标中应该绝对避免。
为了生成可重复的小身份图标,在库内执行缩放。生成较大的PNG图像,然后将其缩小到原始所需大小。此过程导致圆更加平滑,并且补偿了偏心。
函数generate_png_scaled_custom
使用自定义参数执行缩放,并需要
&[u8]
切片- 目标身份图标大小(以像素为单位)(
u8
- 毕竟是为小身份图标而设计的) - 缩放因子(
u8
),较大的PNG实际上有多大 - 用于图像缩放的过滤器(
FilterType
)
合理的缩放因子值在范围[4..=8]
内,低于它像素化仍然存在,高于它图像不再明显改进,甚至可能看起来模糊。
所有过滤器都能产生合理的结果,除了FilterType::Nearest
,它会产生明显扭曲的图像,因此不建议使用。
函数generate_png_scaled_default
使用默认缩放参数(缩放因子5
和过滤器FilterType::Lanczos3
)对默认签名者身份图标大小(30像素)的图像进行缩放,只需要
&[u8]
切片
如果身份图标的生成以某种方式失败,则函数输出默认大小的(30x30)透明png
图像,即它永远不会产生错误。
函数generate_png_with_colors
与generate_png
类似,但直接接受身份图标颜色,并且不会生成颜色集。这主要用于测试。函数generate_png_with_colors
需要
[[u8; 4]; 19]
RGBA格式的19个颜色集合- 目标图像大小(以像素为单位)(
u16
)
函数generate_png_scaled_custom_with_colors
类似于generate_png_scaled_custom
,但直接接受标识符颜色,并且不生成颜色集。这主要适用于测试。函数generate_png_scaled_custom_with_colors
需要
[[u8; 4]; 19]
RGBA格式的19个颜色集合- 目标标识符大小(以像素为单位,
u8
) - 缩放因子(
u8
) - 用于图像缩放的过滤器(
FilterType
)
SVG
特性"vec"
(默认启用)可以确保以svg
格式生成标识符图片。由于svg
是矢量格式,不需要图像大小参数。
函数generate_svg
只需要&[u8]
输入切片。
函数generate_svg_with_colors
使用预置颜色,主要适用于测试。它只需要颜色集([[u8; 4]; 19]
RGBA格式的19个颜色集合)。
测试和示例
在colors.rs
模块中的测试检查为Alice和Bob计算的颜色集是否与相应知名图标中的颜色相同。
lib.rs
中的文档测试生成各种测试图片,包括png(通过不同的函数和参数)和svg
。
注意
关于原始发布的代码如何设计的几个不确定性应该最终得到澄清。
例如,计算出的HSL颜色饱和度可能范围在30..109之间,并按百分比处理。Crate palette
(目前在此处使用)将饱和度值超过100的处理为超过100的百分比,并给出一些结果(与100%饱和度的结果略有不同),但有必要检查js和这里的计算是否匹配。
请参见代码注释中的详细信息。
依赖关系
~4MB
~87K SLoC