81 lines
2.7 KiB
Python
81 lines
2.7 KiB
Python
#!/usr/bin/env python3
|
|
"""Genera le icone dell'app in stile Sailfish OS:
|
|
sfondo a gradiente azzurro->blu con angoli molto arrotondati,
|
|
due onde bianche (marea) con ombra morbida e una luna in alto.
|
|
Dimensioni: 86, 108, 128, 172 (struttura standard hicolor)."""
|
|
import math
|
|
import os
|
|
from PIL import Image, ImageDraw
|
|
|
|
# gradiente Sailfish: azzurro chiaro (alto) -> blu profondo (basso)
|
|
C_TOP = (94, 210, 240) # #5ED2F0
|
|
C_BOT = (14, 111, 168) # #0E6FA8
|
|
WAVE1 = (255, 255, 255) # onda principale, bianca piena
|
|
WAVE2 = (255, 255, 255) # onda secondaria, semitrasparente
|
|
MOON = (255, 255, 255)
|
|
|
|
|
|
def gradient(size, c1, c2):
|
|
img = Image.new("RGB", (size, size))
|
|
d = ImageDraw.Draw(img)
|
|
for y in range(size):
|
|
t = y / (size - 1)
|
|
d.line([(0, y), (size, y)],
|
|
fill=(int(c1[0] + (c2[0] - c1[0]) * t),
|
|
int(c1[1] + (c2[1] - c1[1]) * t),
|
|
int(c1[2] + (c2[2] - c1[2]) * t)))
|
|
return img
|
|
|
|
|
|
def wave_layer(size, y0, amp, phase, lw, alpha):
|
|
"""Layer RGBA con una sinusoide orizzontale (onda)."""
|
|
layer = Image.new("RGBA", (size, size), (0, 0, 0, 0))
|
|
d = ImageDraw.Draw(layer)
|
|
pts = []
|
|
for x in range(0, size + 2, 2):
|
|
y = y0 + amp * math.sin(2 * math.pi * x / size * 1.6 + phase)
|
|
pts.append((x, y))
|
|
d.line(pts, fill=WAVE1 + (alpha,), width=lw)
|
|
return layer
|
|
|
|
|
|
def draw_icon(size):
|
|
m = size * 0.05
|
|
r = size * 0.22
|
|
out = Image.new("RGBA", (size, size), (0, 0, 0, 0))
|
|
|
|
# sfondo: gradiente ritagliato nel rounded rect
|
|
grad = gradient(size, C_TOP, C_BOT).convert("RGBA")
|
|
mask = Image.new("L", (size, size), 0)
|
|
ImageDraw.Draw(mask).rounded_rectangle([m, m, size - m, size - m],
|
|
radius=r, fill=255)
|
|
out.paste(grad, (0, 0), mask)
|
|
|
|
# onde: due sinusoidi, la seconda sfasata e piu' bassa
|
|
lw1 = max(2, int(size * 0.045))
|
|
lw2 = max(2, int(size * 0.032))
|
|
out.alpha_composite(wave_layer(size, size * 0.58, size * 0.07, 0.0, lw1, 255))
|
|
out.alpha_composite(wave_layer(size, size * 0.74, size * 0.06, math.pi, lw2, 150))
|
|
|
|
# luna in alto a destra (cerchio pieno, con ombra leggera)
|
|
d = ImageDraw.Draw(out)
|
|
lx = size * 0.78
|
|
ly = size * 0.22
|
|
lr = size * 0.09
|
|
d.ellipse([lx - lr + size * 0.01, ly - lr + size * 0.01,
|
|
lx + lr + size * 0.01, ly + lr + size * 0.01],
|
|
fill=(0, 60, 100, 70))
|
|
d.ellipse([lx - lr, ly - lr, lx + lr, ly + lr], fill=MOON)
|
|
return out
|
|
|
|
|
|
def main():
|
|
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-tide.png")
|
|
print("icone scritte: 86, 108, 128, 172")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|