47 lines
1.9 KiB
Python
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")
|