figma-export/glow_montage.py
Rama main · réplica de lectura del repositorio original.
import glob
import os
import colorsys
from PIL import Image, ImageDraw, ImageFont
SRC = r"C:\Users\Abolfazl\Desktop\Phonix\figma-export\assets\images"
def analyze(path):
try:
im = Image.open(path).convert("RGBA")
except Exception:
return None
w, h = im.size
if w < 500 or h < 500:
return None
small = im.resize((40, 40))
px = small.load()
transp = 0
sat = []
for y in range(40):
for x in range(40):
r, g, b, a = px[x, y]
if a < 30:
transp += 1
continue
mx, mn = max(r, g, b), min(r, g, b)
if mx > 70 and (mx - mn) > 14:
sat.append((mx - mn, r, g, b))
if not sat:
return None
sat.sort(reverse=True)
top = sat[:25]
pr = sum(p[1] for p in top) // len(top)
pg = sum(p[2] for p in top) // len(top)
pb = sum(p[3] for p in top) // len(top)
hue = colorsys.rgb_to_hsv(pr / 255, pg / 255, pb / 255)[0] * 360
# glow = soft (few strongly-saturated pixels), large
return {
"path": path, "size": (w, h), "peak": (pr, pg, pb),
"hex": f"#{pr:02X}{pg:02X}{pb:02X}", "hue": round(hue),
"transp": round(transp / 1600, 2), "satfrac": round(len(sat) / 1600, 2),
}
cands = []
for p in glob.glob(os.path.join(SRC, "*.png")):
r = analyze(p)
if not r:
continue
hue = r["hue"]
is_pink = hue <= 25 or hue >= 320
is_purple = 220 <= hue <= 290
if (is_pink or is_purple):
cands.append(r)
# prefer large, soft (low satfrac), single hue
cands.sort(key=lambda r: (-(r["size"][0] * r["size"][1])))
cands = cands[:18]
cols = 3
cell = 300
lh = 40
rows = (len(cands) + cols - 1) // cols
sheet = Image.new("RGB", (cols * cell, rows * (cell + lh)), (240, 240, 245))
draw = ImageDraw.Draw(sheet)
try:
font = ImageFont.truetype("arialbd.ttf", 16)
except Exception:
font = ImageFont.load_default()
for i, r in enumerate(cands):
c = i % cols
rr = i // cols
x = c * cell
y = rr * (cell + lh)
box = Image.new("RGB", (cell - 10, cell - 10), (255, 255, 255))
img = Image.open(r["path"]).convert("RGBA")
img.thumbnail((cell - 24, cell - 24))
box.paste(img, ((box.width - img.width) // 2, (box.height - img.height) // 2), img)
sheet.paste(box, (x + 5, y + 5))
draw.text((x + 6, y + cell - 6), f'#{i} {r["hex"]} hue{r["hue"]} {r["size"][0]}x{r["size"][1]}', fill=(0, 0, 0), font=font)
out = os.path.join(os.path.dirname(SRC), "..", "glow_candidates.png")
out = os.path.abspath(os.path.join(r"C:\Users\Abolfazl\Desktop\Phonix\figma-export", "glow_candidates.png"))
sheet.save(out)
print("saved", out, sheet.size, "candidates:", len(cands))
for i, r in enumerate(cands):
print(f'#{i}\t{r["hex"]}\thue={r["hue"]}\ttransp={r["transp"]}\tsat={r["satfrac"]}\t{r["size"][0]}x{r["size"][1]}\t{os.path.basename(r["path"])}')