Mobile prettification
parent
bfa65a6de4
commit
4907cfc196
@ -0,0 +1,122 @@
|
|||||||
|
(ns com.darklimericks.util.identicon
|
||||||
|
(:require [digest]
|
||||||
|
[clojure.string :as str])
|
||||||
|
(:import java.io.File
|
||||||
|
java.awt.Color
|
||||||
|
java.awt.image.BufferedImage
|
||||||
|
javax.imageio.ImageIO))
|
||||||
|
|
||||||
|
(def tiles-per-side 6)
|
||||||
|
(def total-tiles
|
||||||
|
(* tiles-per-side tiles-per-side))
|
||||||
|
|
||||||
|
(defn- get-color
|
||||||
|
[pos]
|
||||||
|
(nth '(
|
||||||
|
(3 7 30) ;; Darkness
|
||||||
|
(55 6 23) ;; Deep Red
|
||||||
|
(106 4 15) ;; Rosewood
|
||||||
|
(157 2 8) ;; Dark Red
|
||||||
|
(208 0 0) ;; Red
|
||||||
|
(220 47 2) ;; Vermillion
|
||||||
|
(232 93 4) ;; Persimmon
|
||||||
|
(244 140 6) ;; Carrot
|
||||||
|
(3 7 30) ;; Darkness
|
||||||
|
(55 6 23) ;; Deep Red
|
||||||
|
(106 4 15) ;; Rosewood
|
||||||
|
(157 2 8) ;; Dark Red
|
||||||
|
(208 0 0) ;; Red
|
||||||
|
(220 47 2) ;; Vermillion
|
||||||
|
(232 93 4) ;; Persimmon
|
||||||
|
(244 140 6) ;; Carrot
|
||||||
|
) pos))
|
||||||
|
|
||||||
|
(defn- from-hex-to-dec
|
||||||
|
"Convert a hex char to an int."
|
||||||
|
[character]
|
||||||
|
(cond
|
||||||
|
(= "a" character) 10
|
||||||
|
(= "b" character) 11
|
||||||
|
(= "c" character) 12
|
||||||
|
(= "d" character) 13
|
||||||
|
(= "e" character) 14
|
||||||
|
(= "f" character) 15
|
||||||
|
:else (Integer/parseInt character)))
|
||||||
|
|
||||||
|
(defn- to-numbers
|
||||||
|
"Convert a string of hex chars to a seq of ints."
|
||||||
|
[num_string]
|
||||||
|
(map from-hex-to-dec (rest (clojure.string/split num_string #""))))
|
||||||
|
|
||||||
|
(defn- to-bools
|
||||||
|
"Formulaically convert a seq of ints to bools."
|
||||||
|
[num_string]
|
||||||
|
(take (/ total-tiles 2) (cycle
|
||||||
|
(map #(> % 7) (to-numbers num_string)))))
|
||||||
|
|
||||||
|
(defn- in-row
|
||||||
|
"Return the row for a particular position in the seq."
|
||||||
|
[pos]
|
||||||
|
(quot pos (/ tiles-per-side 2)))
|
||||||
|
|
||||||
|
(defn- in-col
|
||||||
|
"Return the column for a particular position in the seq."
|
||||||
|
[pos]
|
||||||
|
(rem pos (/ tiles-per-side 2)))
|
||||||
|
|
||||||
|
(defn- draw-tile
|
||||||
|
"Fill in a tile at a particular position starting from the left of the image."
|
||||||
|
[draw tile-size pos]
|
||||||
|
(.fillRect draw
|
||||||
|
(* (in-col pos) tile-size)
|
||||||
|
(* (in-row pos) tile-size)
|
||||||
|
tile-size tile-size))
|
||||||
|
|
||||||
|
(defn- draw-mirror-tile
|
||||||
|
"Fill in a tile at a particular position starting from the right of the image."
|
||||||
|
[draw tile-size pos]
|
||||||
|
(.fillRect draw
|
||||||
|
(* (- tiles-per-side (in-col pos) 1) tile-size)
|
||||||
|
(* (in-row pos) tile-size)
|
||||||
|
tile-size tile-size))
|
||||||
|
|
||||||
|
(defn- draw-it
|
||||||
|
"Draw tiles on the image based on a seq of booleans to determine whether the tile is filled in or not."
|
||||||
|
[draw tile-size pos bools]
|
||||||
|
(when (first bools)
|
||||||
|
;; left half
|
||||||
|
(draw-tile draw tile-size pos)
|
||||||
|
;; right half
|
||||||
|
(draw-mirror-tile draw tile-size pos))
|
||||||
|
|
||||||
|
(when (> (count bools) 1)
|
||||||
|
(draw-it draw tile-size (inc pos) (rest bools))))
|
||||||
|
|
||||||
|
(defn- file-name
|
||||||
|
"Generate a file name."
|
||||||
|
[name size]
|
||||||
|
(format "resources/public/images/%s-%s.png" name size))
|
||||||
|
|
||||||
|
(defn- fill-background
|
||||||
|
"Fill in the background with white."
|
||||||
|
[draw size]
|
||||||
|
(.setColor draw (Color/BLACK))
|
||||||
|
(.fillRect draw 0 0 size size))
|
||||||
|
|
||||||
|
(defn generate
|
||||||
|
"Make a new avatar."
|
||||||
|
[identifier size]
|
||||||
|
(let
|
||||||
|
[tile-size (quot size tiles-per-side)
|
||||||
|
md5 (digest/md5 identifier)
|
||||||
|
icon (BufferedImage. size size BufferedImage/TYPE_INT_RGB)
|
||||||
|
[r g b] (get-color (first (to-numbers md5)))
|
||||||
|
color (Color. r g b)
|
||||||
|
draw (.createGraphics icon)]
|
||||||
|
(fill-background draw size)
|
||||||
|
(.setColor draw color)
|
||||||
|
(draw-it draw tile-size 0 (to-bools md5))
|
||||||
|
(ImageIO/write icon "png" (File. (file-name identifier size)))))
|
||||||
|
|
||||||
|
(comment
|
||||||
|
(generate "foobar-bazz" 128))
|
Loading…
Reference in New Issue