Spaces:
Sleeping
Sleeping
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=["别碰"]) | |