MCPcopy Index your code
hub / github.com/buckket/go-blurhash

github.com/buckket/go-blurhash @v1.1.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v1.1.0 ↗ · + Follow
47 symbols 100 edges 8 files 10 documented · 21% 1 cross-repo links
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

go-blurhash Build Status Go Report Card codecov GoDoc

go-blurhash is a pure Go implementation of the BlurHash algorithm, which is used by Mastodon an other Fediverse software to implement a swift way of preloading placeholder images as well as hiding sensitive media. Read more about it here.

tl;dr: BlurHash is a compact representation of a placeholder for an image.

This library allows generating the BlurHash of a given image, as well as reconstructing a blurred version with specified dimensions from a given BlurHash.

This library is based on the following reference implementations: - Encoder: https://github.com/woltapp/blurhash/blob/master/C (C) - Deocder: https://github.com/woltapp/blurhash/blob/master/TypeScript (TypeScript)

BlurHash is written by Dag Ågren / Wolt.

Before After
Image alt text "LFE.@D9F01_2%L%MIVD*9Goe-;WB"
Hash "LFE.@D9F01_2%L%MIVD*9Goe-;WB" alt text

Installation

From source

go get -u github.com/buckket/go-blurhash

Usage

go-blurhash exports three functions:

func blurhash.Encode(xComponents, yComponents int, rgba image.Image) (string, error)
func blurhash.Decode(hash string, width, height, punch int) (image.Image, error)
func blurhash.Components(hash string) (xComponents, yComponents int, err error)

Here’s a simple demonstration. Check pkg.go.dev for the full documentation.

package main

import (
    "fmt"
    "github.com/buckket/go-blurhash"
    "image/png"
    "os"
)

func main() {
    // Generate the BlurHash for a given image
    imageFile, _ := os.Open("test.png")
    loadedImage, err := png.Decode(imageFile)
    str, _ := blurhash.Encode(4, 3, loadedImage)
    if err != nil {
        // Handle errors
    }
    fmt.Printf("Hash: %s\n", str)

    // Generate an image for a given BlurHash
    // Width will be 300px and Height will be 500px
    // Punch specifies the contrasts and defaults to 1
    img, err := blurhash.Decode(str, 300, 500, 1)
    if err != nil {
        // Handle errors
    }
    f, _ := os.Create("test_blur.png")
    _ = png.Encode(f, img)

    // Get the x and y components used for encoding a given BlurHash
    x, y, err := blurhash.Components("LFE.@D9F01_2%L%MIVD*9Goe-;WB")
    if err != nil {
        // Handle errors
    }
    fmt.Printf("xComponents: %d, yComponents: %d", x, y)
}

Limitations

  • Presumably a bit slower than the C implementation (TODO: Benchmarks)

Notes

  • As mentioned here, it’s best to generate very small images (~32x32px) via BlurHash and scale them up to the desired dimensions afterwards for optimal performance.
  • Since #2 we diverted from the reference implementation by memorizing sRGBtoLinear values, thus increasing encoding speed at the cost of higher memory usage.
  • Starting with v1.1.0 the signature of blurhash.Encode() has changed slightly (see #3).

License

GNU GPLv3+

Core symbols most depended-on inside this repo

linearTosRGB
called by 7
utils.go
Encode
called by 7
base83/base83.go
Decode
called by 7
base83/base83.go
sRGBToLinear
called by 5
utils.go
signPow
called by 3
utils.go
Error
called by 3
encode.go
Error
called by 2
base83/base83.go
initLinearTable
called by 1
encode.go

Shape

Function 37
Method 5
TypeAlias 4
Struct 1

Languages

Go100%

Modules by API surface

encode.go10 symbols
decode_test.go8 symbols
encode_test.go7 symbols
decode.go6 symbols
base83/base83.go6 symbols
base83/base83_test.go4 symbols
utils_test.go3 symbols
utils.go3 symbols

Used by 1 indexed graphs manifest dependencies, hub-wide

For agents

$ claude mcp add go-blurhash \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page