# Troca a primeira linha do titulo ("JURRASIC") nas imagens de menu por "DINO" (Kenney Future, CC0). import sys from PIL import Image, ImageDraw, ImageFont, ImageFilter root = sys.argv[1] font_path = root + "/Kenney Future.ttf" Y0, Y1 = 70, 156 # faixa da primeira linha (o texto ocupa 78..147) for name in ("menu_a.png", "menu_b.png"): p = root + "/ui/" + name im = Image.open(p).convert("RGBA"); px = im.load(); w, h = im.size mask = [[px[x, y][0] < 150 for x in range(w)] for y in range(Y0, Y1)] # dilata a mascara em 2 px grown = [[False] * w for _ in mask] for j, row in enumerate(mask): for x, v in enumerate(row): if v: for dj in range(-2, 3): for dx in range(-2, 3): jj, xx = j + dj, x + dx if 0 <= jj < len(mask) and 0 <= xx < w: grown[jj][xx] = True H = len(grown) src = [[px[x, Y0 + j] for x in range(w)] for j in range(H)] def run(j, x, dj, dx): k = 0 while 0 <= j < H and 0 <= x < w and grown[j][x]: j += dj; x += dx; k += 1 return k, (src[j][x] if 0 <= j < H and 0 <= x < w else None) for j in range(H): for x in range(w): if not grown[j][x]: continue lh, lp = run(j, x, 0, -1); rh, rp = run(j, x, 0, 1) lv, up = run(j, x, -1, 0); rv, dp = run(j, x, 1, 0) hor = lp is not None and rp is not None ver = up is not None and dp is not None if hor and (not ver or lh + rh <= lv + rv): t = lh / (lh + rh); a, c = lp, rp else: t = lv / (lv + rv); a, c = up, dp px[x, Y0 + j] = tuple(int(a[i] * (1 - t) + c[i] * t) for i in range(4)) # texto novo: caixa de altura de capitais igual a do original (70 px), centralizado como a linha 2 (66..815) size = 100 while True: f = ImageFont.truetype(font_path, size) b = f.getbbox("DINO") if b[3] - b[1] <= 70: break size -= 1 b = f.getbbox("DINO") d = ImageDraw.Draw(im) cx = (66 + 815) / 2 d.text((cx - (b[0] + b[2]) / 2, 78 - b[1]), "DINO", font=f, fill=(0, 0, 0, 255)) im.save(p, optimize=False) print("ok")