/
ebits.go
114 lines (91 loc) · 2.24 KB
/
ebits.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package main
import (
"crypto/sha512"
"image"
"image/draw"
_ "image/png"
"log"
"os"
"path/filepath"
"regexp"
"sort"
"strconv"
)
type Assets map[string]([]int)
const (
IMAGE_WIDTH = 400
)
var (
compose_order = [...]string{"background", "face", "eye", "mouth", "hair", "clothes"}
cache = make(map[string]image.Image)
male = make(Assets)
female = make(Assets)
)
func InitAssets() {
if len(male) > 0 && len(female) > 0 {
return
}
filepath.Walk("img", func(path string, info os.FileInfo, err error) error {
re := regexp.MustCompile("/(male|female)/(\\D+)(\\d+)\\.png")
found := re.FindStringSubmatch(path)
if len(found) > 0 {
gender := found[1]
datatype := found[2]
index, err := strconv.Atoi(found[3])
if err == nil {
if gender == "male" {
male[datatype] = append(male[datatype], index)
} else if gender == "female" {
female[datatype] = append(female[datatype], index)
}
}
}
return nil
})
for _, value := range male {
sort.Ints(value)
}
for _, value := range female {
sort.Ints(value)
}
}
func LoadImage(name string) image.Image {
cached := cache[name]
if cached != nil {
return cached
}
imgReader, err := os.Open(name)
if err != nil {
log.Fatal("Asset " + name + " is not existed")
}
defer imgReader.Close()
img, _, err := image.Decode(imgReader)
if err != nil {
log.Fatal("Asset " + name + " is corrupted?")
}
cache[name] = img
return img
}
func GenerateIdenticon8bits(gender string, data []byte) image.Image {
sum := sha512.Sum512(data)
var assets Assets
switch {
case gender == "male":
assets = male
case gender == "female":
assets = female
default:
log.Fatal("Unknow gender " + gender)
}
img := image.NewRGBA(image.Rect(0, 0, IMAGE_WIDTH, IMAGE_WIDTH))
for i, layer_name := range compose_order {
layer_sels := assets[layer_name]
data := sum[i]
num_sels := len(layer_sels)
layer_index := layer_sels[int(data)%num_sels]
log.Println("use img/" + gender + "/" + layer_name + strconv.Itoa(layer_index) + ".png")
layer_img := LoadImage("img/" + gender + "/" + layer_name + strconv.Itoa(layer_index) + ".png")
draw.Draw(img, image.Rect(0, 0, IMAGE_WIDTH, IMAGE_WIDTH), layer_img, image.Point{0, 0}, draw.Over)
}
return img
}