summaryrefslogtreecommitdiff
path: root/src/misc
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2019-04-15 20:37:21 +0900
committersyuilo <syuilotan@yahoo.co.jp>2019-04-15 20:37:21 +0900
commit18bc4a49e8f9e660672452e0833937d41873531e (patch)
tree49a0cb30280b0c1dbcbfb1d4968d37da84b1423e /src/misc
parentFix error (diff)
downloadsharkey-18bc4a49e8f9e660672452e0833937d41873531e.tar.gz
sharkey-18bc4a49e8f9e660672452e0833937d41873531e.tar.bz2
sharkey-18bc4a49e8f9e660672452e0833937d41873531e.zip
ランダムにアバターを生成するように
Diffstat (limited to 'src/misc')
-rw-r--r--src/misc/gen-avatar.ts89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/misc/gen-avatar.ts b/src/misc/gen-avatar.ts
new file mode 100644
index 0000000000..7d22ee98e2
--- /dev/null
+++ b/src/misc/gen-avatar.ts
@@ -0,0 +1,89 @@
+/**
+ * Random avatar generator
+ */
+
+import { createCanvas } from 'canvas';
+import * as gen from 'random-seed';
+
+const size = 512; // px
+const n = 5; // resolution
+const margin = (size / n) / 1.5;
+const colors = [
+ '#e57373',
+ '#F06292',
+ '#BA68C8',
+ '#9575CD',
+ '#7986CB',
+ '#64B5F6',
+ '#4FC3F7',
+ '#4DD0E1',
+ '#4DB6AC',
+ '#81C784',
+ '#8BC34A',
+ '#AFB42B',
+ '#F57F17',
+ '#FF5722',
+ '#795548',
+ '#455A64',
+];
+const bg = '#e9e9e9';
+
+const actualSize = size - (margin * 2);
+const cellSize = actualSize / n;
+const sideN = Math.floor(n / 2);
+
+/**
+ * Generate buffer of random avatar by seed
+ */
+export function genAvatar(seed: string) {
+ const rand = gen.create(seed);
+ const canvas = createCanvas(size, size);
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = bg;
+ ctx.beginPath();
+ ctx.fillRect(0, 0, size, size);
+
+ ctx.fillStyle = colors[rand(colors.length)];
+
+ // side bitmap (filled by false)
+ const side: boolean[][] = new Array(sideN);
+ for (let i = 0; i < side.length; i++) {
+ side[i] = new Array(n).fill(false);
+ }
+
+ // 1*n (filled by false)
+ const center: boolean[] = new Array(n).fill(false);
+
+ // tslint:disable-next-line:prefer-for-of
+ for (let x = 0; x < side.length; x++) {
+ for (let y = 0; y < side[x].length; y++) {
+ side[x][y] = rand(3) === 0;
+ }
+ }
+
+ for (let i = 0; i < center.length; i++) {
+ center[i] = rand(3) === 0;
+ }
+
+ // Draw
+ for (let x = 0; x < n; x++) {
+ for (let y = 0; y < n; y++) {
+ const isXCenter = x === ((n - 1) / 2);
+ if (isXCenter && !center[y]) continue;
+
+ const isLeftSide = x < ((n - 1) / 2);
+ if (isLeftSide && !side[x][y]) continue;
+
+ const isRightSide = x > ((n - 1) / 2);
+ if (isRightSide && !side[sideN - (x - sideN)][y]) continue;
+
+ const actualX = margin + (cellSize * x);
+ const actualY = margin + (cellSize * y);
+ ctx.beginPath();
+ ctx.fillRect(actualX, actualY, cellSize, cellSize);
+ }
+ }
+
+ return canvas.toBuffer();
+}