Home

Awesome

go-quantize

go-quantize is a highly-optimized and memory-efficient palette generator. It currently implements the Median Cut algorithm, including weighted color priority.

Performance

go-quantize makes exactly two slice allocations per palette generated, the larger of which is efficiently pooled. It also uses performant direct pixel accesses for certain image types, reducing memory footprint and increasing throughput.

Benchmarks

go-quantize performs significantly faster than existing quantization libraries:

# bench/bench_test.go
BenchmarkQuantize-8          	      50	  20070550 ns/op	  122690 B/op	     258 allocs/op
BenchmarkSoniakeysMedian-8   	       3	 465833354 ns/op	 3479624 B/op	     782 allocs/op
BenchmarkSoniakeysMean-8     	       3	 342759921 ns/op	 2755712 B/op	     262 allocs/op
BenchmarkEsimov-8            	       2	 645129392 ns/op	35849608 B/op	 8872273 allocs/op

Example Usage

file, err := os.Open("test_image.jpg")
if err != nil {
    fmt.Println("Couldn't open test file")
    return
}
i, _, err := image.Decode(file)
if err != nil {
    fmt.Println("Couldn't decode test file")
    return
}
q := MedianCutQuantizer{}
p := q.Quantize(make([]color.Color, 0, 256), i)
fmt.Println(p)