-
Notifications
You must be signed in to change notification settings - Fork 0
/
text-image.ts
72 lines (66 loc) · 1.94 KB
/
text-image.ts
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
import Jimp from 'jimp';
const DIR_NAME = 'output';
export class TextImage {
/**
* 画像生成
* @param width 幅(px)
* @param height 高さ(px)
* @param index 通番
*/
static create(width: number, height: number, index: number) {
// ディレクトリ生成
TextImage.createDirectory();
// 背景色
const backgroundColor = TextImage.backgroundColor(index);
// ラベル
const text = `${width}x${height} No.${index}`;
// ファイルパス
const path = this.filePath(width, height, index);
// 画像ファイル生成
new Jimp(width, height, backgroundColor, async (error, image: Jimp) => {
if (error) throw error;
// テキストを中央に描画
const font = await Jimp.loadFont(Jimp.FONT_SANS_32_BLACK);
image.print(font, 0, 0, {
text,
alignmentX: Jimp.HORIZONTAL_ALIGN_CENTER,
alignmentY: Jimp.VERTICAL_ALIGN_MIDDLE,
}, width, height)
// 画像をJPG形式で保存
image.write(path, error => {
if (error) throw error;
});
});
}
/**
* 背景色を生成する
* @param index 通番
* @return 背景色
*/
private static backgroundColor(index: number): string {
const boundedNumber = index & 0xFFFFFF;
let x = boundedNumber;
x ^= x << 13;
x ^= x >> 17;
x ^= x << 5;
const transformedNumber = x & 0xFFFFFF;
return '#' + transformedNumber.toString(16).padStart(6, '0');
}
/**
* ディレクトリを生成する
*/
private static createDirectory() {
const fs = require('fs');
fs.mkdirSync(DIR_NAME, { recursive: true });
}
/**
* ファイルパスを生成する
* @param width 幅(px)
* @param height 高さ(px)
* @param index 通番
* @returns ファイルパス
*/
private static filePath(width: number, height: number, index: number): string {
return `${DIR_NAME}/${width}x${height}_${index.toString().padStart(5, '0')}.jpg`;
}
}