File size: 2,030 Bytes
346533a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import random
from pathlib import Path
from typing import List, Tuple

from PIL.Image import Image as IMG
from PIL.Image import Palette
from pil_utils import BuildImage

from meme_generator import add_meme
from meme_generator.utils import make_jpg_or_gif

img_dir = Path(__file__).parent / "images"


def get_dominant_colors(img: IMG) -> List[Tuple[int, int, int]]:
    img = img.convert("P", palette=Palette.ADAPTIVE, colors=20)
    palette = img.getpalette()
    assert palette
    color_indexs = sorted(img.getcolors(), reverse=True)
    colors = [tuple(palette[i * 3 : i * 3 + 3]) for _, i in color_indexs]
    colors = list(
        filter(lambda c: c[0] * 0.299 + c[1] * 0.578 + c[2] * 0.114 < 200, colors)
    )
    return colors


def dont_touch(images: List[BuildImage], texts, args):
    frame = BuildImage.open(img_dir / "0.png")
    mask = BuildImage.open(img_dir / "mask.png").convert("L")

    def paste_random_blocks(img: BuildImage, colors: List[Tuple[int, int, int]]):
        x1, y1, x2, y2 = 200, 300, 400, 650
        block_locs = []
        for _ in range(150):
            x = random.randint(x1, x2)
            y = random.randint(y1, y2)
            if mask.image.getpixel((x, y)) == 0:
                continue
            if any(abs(x - x_) < 13 and abs(y - y_) < 13 for x_, y_ in block_locs):
                continue
            block_locs.append((x, y))
            color = random.choice(colors)
            block = BuildImage.new("RGBA", (10, 10), color)
            block = block.rotate(45, expand=True)
            img.paste(block, (x, y), alpha=True)

    def make(img: BuildImage) -> BuildImage:
        img_frame = frame.copy()
        colors = get_dominant_colors(img.image)
        paste_random_blocks(img_frame, colors)
        img = img.convert("RGBA").resize((250, 250), keep_ratio=True, inside=True)
        return img_frame.paste(img, (25, 460), alpha=True)

    return make_jpg_or_gif(images[0], make)


add_meme("dont_touch", dont_touch, min_images=1, max_images=1, keywords=["别碰"])