traduzioni 4 lingue e catalogo razze portati dai sorgenti Flutter; asset foto, icone dall'artwork originale, test node

This commit is contained in:
Carlo Baratto
2026-10-09 09:02:41 +02:00
parent 0ef017cbab
commit b1ee0c78b5
21 changed files with 982 additions and 41 deletions
+48 -33
View File
@@ -1,15 +1,18 @@
#!/usr/bin/env python3
"""Genera le icone dell'app in stile Sailfish OS:
sfondo a gradiente ambrato->arancio bruciato con angoli molto arrotondati,
un uovo bianco con ombra morbida e una pagliuzza di grano.
Dimensioni: 86, 108, 128, 172 (struttura standard hicolor)."""
import os
from PIL import Image, ImageDraw
"""Genera le icone dell'app in stile Sailfish OS a partire dall'artwork
originale dell'app (assets/icon_source.png: gallina su un uovo con una foglia).
C_TOP = (250, 214, 137) # #FAD689 ambrato chiaro
C_BOT = (196, 122, 41) # #C47A29 arancio bruciato
EGG = (255, 253, 246)
STRAW = (255, 236, 179)
Sfondo: rettangolo arrotondato con gradiente bianco -> verde tenue.
Soggetto: ritagliato dallo sfondo bianco PER CONNESSIONE AI BORDI (flood fill),
cosi' il bianco interno dell'uovo non viene forato.
Dimensioni: 86, 108, 128, 172 (struttura standard hicolor).
"""
import os
from PIL import Image, ImageDraw, ImageFilter
SRC = "assets/icon_source.png"
C_TOP = (255, 255, 255)
C_BOT = (233, 243, 226) # #E9F3E2 verde tenue
def gradient(size, c1, c2):
@@ -24,8 +27,34 @@ def gradient(size, c1, c2):
return img
def draw_icon(size):
m = size * 0.05
def subject_with_alpha():
"""Ritorna l'artwork RGBA con lo sfondo bianco reso trasparente."""
im = Image.open(SRC).convert("RGB")
w, h = im.size
# flood fill dai quattro angoli sullo sfondo bianco connesso ai bordi
marked = im.copy()
for xy in ((0, 0), (w - 1, 0), (0, h - 1), (w - 1, h - 1)):
ImageDraw.floodfill(marked, xy, (255, 0, 255), thresh=60)
alpha = Image.new("L", (w, h), 255)
px_m, px_a = marked.load(), alpha.load()
for y in range(h):
for x in range(w):
if px_m[x, y] == (255, 0, 255):
px_a[x, y] = 0
# bordo morbido: piccola sfocatura + soglia, per togliere i frastagli
# del JPEG lungo i contorni
alpha = alpha.filter(ImageFilter.GaussianBlur(0.8)).point(lambda v: 0 if v < 110 else 255)
out = im.convert("RGBA")
out.putalpha(alpha)
return out
def draw_icon(size, subject):
m = size * 0.045
r = size * 0.22
out = Image.new("RGBA", (size, size), (0, 0, 0, 0))
@@ -35,33 +64,19 @@ def draw_icon(size):
radius=r, fill=255)
out.paste(grad, (0, 0), mask)
d = ImageDraw.Draw(out, "RGBA")
# pagliuzza: due archi chiari in basso, suggeriscono il nido
lw = max(2, int(size * 0.03))
for k, off in ((0.0, 0.0), (0.06, 0.03)):
d.arc([size * (0.16 + k), size * (0.62 + off),
size * (0.84 - k), size * (1.02 + off)],
start=200, end=340, fill=STRAW + (110,), width=lw)
# uovo bianco, leggermente spostato in alto, con ombra morbida
ex0, ey0 = size * 0.30, size * 0.22
ex1, ey1 = size * 0.70, size * 0.70
d.ellipse([ex0 + size * 0.015, ey0 + size * 0.02,
ex1 + size * 0.015, ey1 + size * 0.02],
fill=(90, 50, 10, 70))
d.ellipse([ex0, ey0, ex1, ey1], fill=EGG + (255,))
# riflesso
d.ellipse([size * 0.35, size * 0.30, size * 0.45, size * 0.40],
fill=(255, 255, 255, 120))
# soggetto centrato, all'82% dell'area utile
box = size - 2 * m
art = subject.copy()
art.thumbnail((int(box * 0.82), int(box * 0.82)), Image.LANCZOS)
out.alpha_composite(art, (int((size - art.width) / 2), int((size - art.height) / 2)))
return out
def main():
subject = subject_with_alpha()
for s in (86, 108, 128, 172):
os.makedirs(f"icons/{s}x{s}", exist_ok=True)
draw_icon(s).save(f"icons/{s}x{s}/harbour-henflow.png")
draw_icon(s, subject).save(f"icons/{s}x{s}/harbour-henflow.png")
print("icone scritte: 86, 108, 128, 172")