package main import ( "bytes" "fmt" "io/ioutil" "github.com/muesli/kmeans" colorful "github.com/lucasb-eyer/go-colorful" ) var ( header = ` ` cell = `
` footer = `
` ) func main() { // Create data points in the CIE L*a*b color space // l for lightness channel // a, b for color channels var d kmeans.Points for l := 30; l < 255; l += 16 { for a := 0; a < 255; a += 16 { for b := 0; b < 255; b += 16 { d = append(d, kmeans.Point{ float64(l) / 255.0, float64(a) / 255.0, float64(b) / 255.0, }) } } } // Write HTML header buffer := bytes.NewBuffer([]byte{}) buffer.Write([]byte(header)) // Enable graph generation (.png files) for each iteration km, _ := kmeans.NewWithOptions(0.01, kmeans.SimplePlotter{}) // Partition the color space into 16 clusters (palette colors) clusters, _ := km.Partition(d, 16) for i, c := range clusters { fmt.Printf("Cluster: %d %+v\n", i, c.Center) col := colorful.Lab(c.Center[0]*1.0, -0.9+(c.Center[1]*1.8), -0.9+(c.Center[2]*1.8)) fmt.Println("Color as Hex:", col.Hex()) buffer.Write([]byte(fmt.Sprintf(cell, col.Hex()))) } // Write HTML footer and generate palette.html buffer.Write([]byte(footer)) ioutil.WriteFile("palette.html", buffer.Bytes(), 0644) }