github.com/status-im/status-go@v1.1.0/protocol/identity/identicon/renderer.go (about) 1 package identicon 2 3 import ( 4 "bytes" 5 "encoding/base64" 6 "image" 7 "image/color" 8 "image/draw" 9 "image/png" 10 ) 11 12 const ( 13 Width = 50 14 Height = 50 15 ) 16 17 func renderBase64(id Identicon) (string, error) { 18 img, err := render(id) 19 if err != nil { 20 return "", err 21 } 22 encodedString := base64.StdEncoding.EncodeToString(img) 23 image := "data:image/png;base64," + encodedString 24 return image, nil 25 } 26 27 func setBackgroundTransparent(img *image.RGBA) { 28 draw.Draw(img, img.Bounds(), &image.Uniform{C: color.Transparent}, image.Point{}, draw.Src) 29 } 30 31 func drawRect(rgba *image.RGBA, i int, c color.Color) { 32 sizeSquare := 6 33 maxRow := 5 34 35 r := image.Rect( 36 10+(i%maxRow)*sizeSquare, 37 10+(i/maxRow)*sizeSquare, 38 10+(i%maxRow)*sizeSquare+sizeSquare, 39 10+(i/maxRow)*sizeSquare+sizeSquare, 40 ) 41 42 draw.Draw(rgba, r, &image.Uniform{C: c}, image.Point{}, draw.Src) 43 } 44 45 func render(id Identicon) ([]byte, error) { 46 img := image.NewRGBA(image.Rect(0, 0, Width, Height)) 47 var buff bytes.Buffer 48 49 setBackgroundTransparent(img) 50 51 for i, v := range id.bitmap { 52 if v == 1 { 53 drawRect(img, i, id.color) 54 } 55 } 56 57 if err := png.Encode(&buff, img); err != nil { 58 return nil, err 59 } 60 61 return buff.Bytes(), nil 62 } 63 64 // GenerateBase64 generates an identicon in base64 png format given a string 65 func GenerateBase64(id string) (string, error) { 66 i := generate(id) 67 return renderBase64(i) 68 } 69 70 func Generate(id string) ([]byte, error) { 71 i := generate(id) 72 return render(i) 73 }