srs/tool/brand_art/make_cover.py
Aswin Biju 32bdca2ef9
All checks were successful
deploy / deploy (push) Successful in 4m50s
refactor: updated login screen and favicon
2026-11-05 15:33:48 +05:30

47 lines
1.9 KiB
Python

import random, math
from PIL import Image, ImageDraw, ImageFilter, ImageFont, ImageChops
import sys, os; sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from make_icons import gradient, NAVY, DEEP, GOLD, FONT
W,H=1600,1600 # square: crops cleanly into the tall left panel and the phone banner
random.seed(74)
base=gradient((W,H),NAVY,DEEP).convert("RGBA")
# Wall of ticket endings, tilted, in two quiet tones with a few gold ones.
WW=2800
wall=Image.new("RGBA",(WW,WW),(0,0,0,0)); d=ImageDraw.Draw(wall)
big=ImageFont.truetype(FONT,138)
cw,ch=440,230
cols,rows=WW//cw+1,WW//ch+1
gold_cells={(2,3),(5,5),(3,8),(6,2),(1,10),(4,6)}
for r in range(rows):
for c in range(cols):
txt="%04d"%random.randint(0,9999)
x=c*cw+(cw//2 if r%2 else 0)-80; y=r*ch-40
if (c,r) in gold_cells:
fill=GOLD+(215,)
else:
fill=(255,255,255,20 if (c+r)%3 else 32)
d.text((x,y),txt,font=big,fill=fill)
wall=wall.rotate(-12,resample=Image.BICUBIC)
left=(WW-W)//2; top=(WW-H)//2
wall=wall.crop((left,top,left+W,top+H))
# Calm the middle, where the coin and wordmark sit, and darken the edges.
mask=Image.new("L",(W,H),255); md=ImageDraw.Draw(mask)
md.ellipse([W*0.08,H*0.18,W*0.92,H*0.82],fill=14)
mask=mask.filter(ImageFilter.GaussianBlur(200))
wall.putalpha(ImageChops.multiply(wall.getchannel("A"),mask))
img=Image.alpha_composite(base,wall)
vig=Image.new("L",(W,H),0); vd=ImageDraw.Draw(vig)
vd.ellipse([-W*0.15,-H*0.15,W*1.15,H*1.15],fill=255)
vig=vig.filter(ImageFilter.GaussianBlur(220))
dark=Image.new("RGBA",(W,H),DEEP+(255,))
dark.putalpha(Image.eval(vig,lambda v:int((255-v)*0.75)))
img=Image.alpha_composite(img,dark).convert("RGB")
out="C:/Project-1/srs/assets/images/login_cover.jpg"
import os; os.makedirs(os.path.dirname(out),exist_ok=True)
img.save(out,quality=84,optimize=True,progressive=True)
print(out,img.size,os.path.getsize(out)//1024,"KB")