figma-export/find_glows.py
Rama main · réplica de lectura del repositorio original.
import glob
import os
import colorsys
from PIL import Image
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 < 350 or h < 350:
return None
small = im.resize((48, 48))
px = small.load()
sat_pixels = [] # (sat, r,g,b)
light = 0
opaque = 0
total = 48 * 48
for y in range(48):
for x in range(48):
r, g, b, a = px[x, y]
if a > 40:
opaque += 1
if r > 200 and g > 200 and b > 200 and a > 40:
light += 1
mx, mn = max(r, g, b), min(r, g, b)
if a > 60 and mx > 80 and (mx - mn) > 18:
sat_pixels.append((mx - mn, r, g, b))
if not sat_pixels:
return None
sat_pixels.sort(reverse=True)
# peak = average of the top 30 most saturated pixels (the glow core)
top = sat_pixels[:30]
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
return {
"file": os.path.basename(path),
"size": (w, h),
"peak": (pr, pg, pb),
"hex": f"#{pr:02X}{pg:02X}{pb:02X}",
"hue": round(hue),
"light_frac": round(light / max(opaque, 1), 2),
"colored_frac": round(len(sat_pixels) / total, 2),
}
rows = []
for p in glob.glob(os.path.join(SRC, "*.png")):
r = analyze(p)
if r:
rows.append(r)
def cat(hue):
if hue <= 22 or hue >= 330:
return "PINK/RED"
if 225 <= hue <= 285:
return "PURPLE"
return ""
# glow-like = large, soft (high light_frac OR moderate colored), single soft hue
glows = [r for r in rows if cat(r["hue"]) and r["light_frac"] > 0.25 and r["colored_frac"] < 0.85]
glows.sort(key=lambda r: (-(r["size"][0] * r["size"][1])))
print("=== GLOW CANDIDATES (large, soft, pink or purple) ===")
for r in glows[:20]:
print(f'{cat(r["hue"]):9} {r["hex"]} hue={r["hue"]:>3} light={r["light_frac"]} colored={r["colored_frac"]} {r["size"][0]}x{r["size"][1]} {r["file"]}')