File size: 1,447 Bytes
f44aac9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
#!/usr/bin/env python3
from __future__ import annotations

import random
import struct
import zlib
from pathlib import Path


def main() -> None:
    out = Path("static/assets/parchment.png")
    out.parent.mkdir(parents=True, exist_ok=True)
    write_png(out, 1280, 760)
    print(f"wrote {out}")


def write_png(path: Path, width: int, height: int) -> None:
    random.seed(47)
    rows = []
    for y in range(height):
        row = bytearray([0])
        for x in range(width):
            dx = abs(x / width - 0.5)
            dy = abs(y / height - 0.5)
            vignette = int((dx + dy) * 58)
            grain = random.randint(-12, 12)
            wave = int(8 * random.random() + 6 * ((x * y) % 17 == 0))
            r = clamp(217 - vignette + grain + wave)
            g = clamp(190 - vignette + grain)
            b = clamp(137 - vignette + grain // 2)
            row.extend([r, g, b, 255])
        rows.append(bytes(row))
    raw = b"".join(rows)
    png = b"\x89PNG\r\n\x1a\n"
    png += chunk(b"IHDR", struct.pack(">IIBBBBB", width, height, 8, 6, 0, 0, 0))
    png += chunk(b"IDAT", zlib.compress(raw, 9))
    png += chunk(b"IEND", b"")
    path.write_bytes(png)


def chunk(kind: bytes, data: bytes) -> bytes:
    return struct.pack(">I", len(data)) + kind + data + struct.pack(">I", zlib.crc32(kind + data) & 0xFFFFFFFF)


def clamp(value: int) -> int:
    return max(0, min(255, value))


if __name__ == "__main__":
    main()