#identicon #icons #polkadot #substrate #parity #svg #color-scheme

plot_icon

从polkadot.js对polkadot的identicon生成器的Rust端口

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

Download history 751/week @ 2024-04-08 806/week @ 2024-04-15 754/week @ 2024-04-22 743/week @ 2024-04-29 782/week @ 2024-05-06 670/week @ 2024-05-13 694/week @ 2024-05-20 678/week @ 2024-05-27 685/week @ 2024-06-03 667/week @ 2024-06-10 664/week @ 2024-06-17 646/week @ 2024-06-24 651/week @ 2024-07-01 659/week @ 2024-07-08 715/week @ 2024-07-15 1048/week @ 2024-07-22

3,165 monthly downloads
Used in substrate_parser

Apache-2.0

43KB
544 代码行

Crate plot_icon

概述

这是一个用于生成标准19圆圈图标(png和svg格式)的lib crate。
identicon

输出是 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_colorsgenerate_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