Skip to content
A Blurhash implementation in pure Go (Decode/Encode)
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.

README.md

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 images as well as hiding sensitive media. Read more about it here.

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 entirely on the current reference implementations:

Blurhash is written by Dag Ågren.

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 GoDoc 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

License

GNU GPLv3+

You can’t perform that action at this time.