Show HN: SplatHash – BlurHash 和 ThumbHash 的轻量级替代方案

发布: (2026年2月28日 GMT+8 19:24)
3 分钟阅读

Source: Hacker News

概览

SplatHash

将任意图像压缩至 16 字节——并重新构建它

算法 · 演示 · Bug 反馈 · 贡献指南

SplatHash 将任意图像编码为恰好 16 字节(一个 22‑字符的 base64url 字符串),并在 0.067 ms 内解码回 32×32 的模糊预览。Go、TypeScript 和 Python 的实现产生的哈希在位级上完全相同。

SplatHash、ThumbHash 与 BlurHash 重建的视觉对比

列:原图 · SplatHash 32×32 · ThumbHash · BlurHash。重新生成:mise run compare

安装

语言安装命令文档
Gogo get github.com/junevm/splathash/src/goREADME
TypeScript / JSnpm install splathash-tsREADME
Pythonpip install splathash-pyREADME

Go 是参考实现。所有其他实现均已在位级上与其对齐验证。

基准测试

在 Intel Core i5‑9300H 上的 Go 基准(go test -bench=. -benchmem)。

特性SplatHashThumbHashBlurHash
解码时间0.067 ms0.50 ms6.55 ms
编码时间3.53 ms0.86 ms445 ms
解码分配次数71,1685
字节数16 固定25–3720–25
字符串长度22 字符34–50 字符27–30 字符

解码在每个页面加载时对每位用户都会运行。编码只在上传时运行。请优化解码性能。

BenchmarkEncodeSplatHash-8      303      3530083 ns/op   100760 B/op   29 allocs/op
BenchmarkEncodeThumbHash-8     1431       863553 ns/op     1015 B/op    6 allocs/op
BenchmarkEncodeBlurHash-8         3    445696421 ns/op 33358234 B/op    8 allocs/op
BenchmarkDecodeSplatHash-8    17182        67622 ns/op    29584 B/op    7 allocs/op
BenchmarkDecodeThumbHash-8     6559       503366 ns/op    58408 B/op 1168 allocs/op
BenchmarkDecodeBlurHash-8       171      6553100 ns/op   547552 B/op    5 allocs/op

对比

特性SplatHashThumbHashBlurHash
固定输出大小是(16 字节)
可存储为 128‑位整数
感知颜色空间(Oklab)
空间局部化基是(高斯)
全局权重优化是(Ridge)
支持 Alpha 通道
跨语言位级一致性
可配置的质量‑大小权衡

工作原理

背景颜色 + 六个通过匹配追踪放置的高斯斑点,颜色通过 Ridge 回归优化,全部在 Oklab 空间中,打包为 128 位。完整规格请见:ALGORITHM.md

开发

mise install          # 安装固定版本的 Go 与 Node
mise run test         # 运行所有测试(Go + TypeScript + Python)
mise run bench        # Go 基准测试
mise run compare      # 重新生成 docs/comparison.png

许可证

请参阅 LICENSE

0 浏览
Back to Blog

相关文章

阅读更多 »

不糟糕的语义失效

缓存问题 如果你在 Web 应用上工作了一段时间,你就会了解缓存的情况。你加入缓存,一切都变快了,然后有人……

冲刺

!Sprint: Express 无需重复代码 https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9mcbu1c3wuvlq0tiuup0.png 介绍 Sprint:停止重复代码