git.alexw.nyc home about git garden
    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
// Generate a simple avatar based on a hash of your name
//
// Derived from Ted Unangst's Honk
// https://humungus.tedunangst.com/r/honk/v/tip/f/avatar.go
//
// Copyright (c) 2019 Alex Wennerberg, Ted Unangst <tedu@tedunangst.com>
//
// Permission to use, copy, modify, and distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

package main

import (
	"bytes"
	"crypto/sha512"
	"fmt"
	"image"
	"image/png"
	"io/ioutil"
	"os"
)

// Modify the four colors used
var avatarcolors = [4][4]byte{
	{0, 0, 0, 255},
	{255, 255, 255, 255},
	{172, 172, 172, 255},
	{96, 96, 96, 255},
}

// x and y dimensions in pixels
const size = 400

func genAvatar(name string) []byte {
	h := sha512.New()
	h.Write([]byte(name))
	s := h.Sum(nil)
	// Mess with these numbers to change the size
	img := image.NewNRGBA(image.Rect(0, 0, size, size))
	for i := 0; i < size; i++ {
		for j := 0; j < size; j++ {
			p := i*img.Stride + j*4
			xx := i/(size/4)*16 + j/(size/4)
			x := s[xx]
			for n := 0; n < 4; n++ {
				img.Pix[p+n] = avatarcolors[x/64][n]
			}
		}
	}
	var buf bytes.Buffer
	png.Encode(&buf, img)
	return buf.Bytes()
}

func main() {
	if len(os.Args) > 2 {
		avatar := genAvatar(os.Args[1])
		ioutil.WriteFile(os.Args[2], avatar, 0644)
	} else {
		fmt.Println("Usage: [script] name output_file.png")
		os.Exit(1)
	}
}