深入解析Woltapp/BlurHash图像模糊算法实现

深入解析Woltapp/BlurHash图像模糊算法实现

blurhash A very compact representation of a placeholder for an image. blurhash 项目地址: https://gitcode.com/gh_mirrors/bl/blurhash

概述

BlurHash是一种用于生成图像模糊占位符的算法,它通过提取图像的关键特征信息并编码成短字符串,可以在加载高清图像前快速展示模糊预览效果。本文将深入解析BlurHash的核心算法原理和实现细节。

算法核心思想

BlurHash算法的核心在于将图像转换到频域,保留低频分量,然后对这些分量进行高效编码。主要包含以下几个关键步骤:

  1. 离散余弦变换(DCT):将图像从空间域转换到频域
  2. 分量选择:保留最重要的低频分量
  3. 编码压缩:使用Base83编码将分量信息压缩成短字符串

BlurHash字符串结构解析

一个典型的BlurHash字符串如"LlMF%n00%#MwS|WCWEM{R*bbWBbH",其结构可分为四个部分:

  1. 分量数量(1位):表示X轴和Y轴上的DCT分量数量

    • 计算公式:(nx - 1) + (ny - 1) * 9
    • 例如:3表示nx=4, ny=1(水平4个分量,垂直1个分量)
  2. 最大AC分量值(1位):所有AC分量的缩放因子

    • 实际值计算:(max + 1) / 166
    • 用于归一化AC分量
  3. 平均颜色(4位):图像的sRGB平均色

    • 24位RGB值编码(R最高位)
    • 可直接使用,无需完整解码
  4. AC分量(每分量2位):DCT的交流分量

    • nx * ny - 1个分量
    • 每个分量编码RGB三个值(0-18)
    • 组合公式:R * 19² + G * 19 + B

分量编码细节

AC分量的编码较为复杂,需要注意以下几点:

  1. 每个颜色通道值范围0-18,对应实际值范围-1到1

    • 0-8:负值
    • 9:零
    • 10-18:正值
  2. 正值计算公式:((X - 9) / 9)²

  3. 负值计算公式:-((9 - X) / 9)²

  4. 最终值需要乘以最大AC分量值(第2部分)

Base83编码

BlurHash采用自定义的Base83编码方案,特点包括:

  1. 字符集:0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%*+,-.:;=?@[]^_{|}~
  2. 大端序编码:最高位在前
  3. 变长编码:每个值使用1-4位数字

DCT解码过程

解码时,需要通过逆DCT变换重建图像。对于归一化像素位置(x,y),每个颜色通道的计算公式为:

foreach j in 0 ... ny - 1
    foreach i in 0 ... nx - 1
        value = value + Cij * cos(x * i * pi) * cos(y * j * pi)

注意事项:

  1. C00分量(DC分量)需要从sRGB转换到线性RGB空间
  2. AC分量已经是线性值
  3. 最终结果需要从线性RGB转换回sRGB

实际应用建议

  1. 性能优化:对于简单预览,可直接使用平均颜色(第3部分)
  2. 分量选择:通常3-4个分量即可达到良好效果
  3. 错误处理:需验证字符串长度与分量数是否匹配

BlurHash算法通过精心设计的编码方案,在极小的数据量下保留了图像的主要视觉特征,是图像加载优化中的一项实用技术。理解其核心原理有助于开发者更好地应用和定制这一方案。

blurhash A very compact representation of a placeholder for an image. blurhash 项目地址: https://gitcode.com/gh_mirrors/bl/blurhash

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡易黎Nicole

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值