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