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")