diff options
author | Ben Burwell <ben@benburwell.com> | 2019-08-27 20:18:49 -0400 |
---|---|---|
committer | Ben Burwell <ben@benburwell.com> | 2019-08-27 20:18:49 -0400 |
commit | 0722951c41a28490442cac516f53896fbf98de56 (patch) | |
tree | 18c49fb235aeffbc7cfaacbdf50fb8e10c7ef0a7 |
initial commit
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | go.mod | 3 | ||||
-rw-r--r-- | main.go | 83 |
3 files changed, 88 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8b9c5c3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +hashimg +out.png @@ -0,0 +1,3 @@ +module github.com/benburwell/hashimg + +go 1.12 @@ -0,0 +1,83 @@ +package main + +import ( + "bytes" + "crypto/sha256" + "encoding/base64" + "flag" + "fmt" + "image" + "image/color" + "image/png" + "regexp" + "strings" +) + +var usernamePattern = regexp.MustCompile("[a-zA-Z][a-zA-Z0-9]+") + +func main() { + username := flag.String("username", "", "username to encode as image") + flag.Parse() + if strings.TrimSpace(*username) == "" { + fmt.Println("no username") + return + } + if !usernamePattern.MatchString(*username) { + fmt.Println("no match") + return + } + + seed := hash(*username) + err, img := generateImage(seed) + if err != nil { + fmt.Printf("%v\n", err) + return + } + err, str := encodeImage(img) + if err != nil { + fmt.Printf("%v\n", err) + return + } + fmt.Println(str) +} + +func hash(username string) [32]byte { + return sha256.Sum256([]byte(username)) +} + +func generateImage(hash [32]byte) (error, image.Image) { + img := image.NewNRGBA(image.Rect(0, 0, 5, 5)) + colorA := color.NRGBA{ + R: hash[0], + G: hash[1], + B: hash[2], + A: 255, + } + colorB := color.NRGBA{ + R: hash[3], + G: hash[4], + B: hash[5], + A: 255, + } + offset := 6 + for x := 0; x < 5; x++ { + for y := 0; y < 5; y++ { + on := hash[offset]&0xf0 > 0 + color := colorA + if on { + color = colorB + } + img.Set(x, y, color) + offset++ + } + } + return nil, img +} + +func encodeImage(img image.Image) (error, string) { + var b bytes.Buffer + if err := png.Encode(&b, img); err != nil { + return err, "" + } + return nil, base64.StdEncoding.EncodeToString(b.Bytes()) +} |