feat: custom golden star launcher icon and updated app title
This commit is contained in:
@@ -0,0 +1,158 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Generate high-quality celestial gradient star launcher icons for Android.
|
||||
"""
|
||||
|
||||
from PIL import Image, ImageDraw, ImageFilter
|
||||
import math
|
||||
import os
|
||||
|
||||
def create_star_icon(size=512):
|
||||
# Create high-res canvas (1024 for supersampling)
|
||||
canvas_size = 1024
|
||||
img = Image.new('RGBA', (canvas_size, canvas_size), (0, 0, 0, 0))
|
||||
draw = ImageDraw.Draw(img)
|
||||
|
||||
center = canvas_size / 2.0
|
||||
radius = canvas_size * 0.46
|
||||
|
||||
# 1. Background squircle / rounded rect or circle with deep mystical dark gradient
|
||||
bg = Image.new('RGBA', (canvas_size, canvas_size), (0, 0, 0, 0))
|
||||
bg_draw = ImageDraw.Draw(bg)
|
||||
|
||||
# Draw rounded rectangle background (squircle)
|
||||
corner_radius = canvas_size * 0.22
|
||||
margin = canvas_size * 0.04
|
||||
bg_box = [margin, margin, canvas_size - margin, canvas_size - margin]
|
||||
|
||||
# Base cosmic background color #0E1020
|
||||
bg_draw.rounded_rectangle(bg_box, radius=corner_radius, fill=(14, 16, 32, 255))
|
||||
|
||||
# Add subtle radial inner glow in the background
|
||||
for r in range(int(canvas_size * 0.4), 0, -4):
|
||||
alpha = int(45 * (1.0 - r / (canvas_size * 0.4)))
|
||||
bg_draw.ellipse(
|
||||
[center - r, center - r, center + r, center + r],
|
||||
fill=(42, 45, 74, alpha)
|
||||
)
|
||||
|
||||
# Outer golden border on the squircle
|
||||
bg_draw.rounded_rectangle(
|
||||
bg_box,
|
||||
radius=corner_radius,
|
||||
outline=(255, 213, 79, 140),
|
||||
width=int(canvas_size * 0.018)
|
||||
)
|
||||
|
||||
img.paste(bg, (0, 0), bg)
|
||||
|
||||
# 2. Golden aura / glow behind the star
|
||||
glow = Image.new('RGBA', (canvas_size, canvas_size), (0, 0, 0, 0))
|
||||
glow_draw = ImageDraw.Draw(glow)
|
||||
glow_radius = canvas_size * 0.30
|
||||
for r in range(int(glow_radius), 0, -6):
|
||||
alpha = int(70 * (1.0 - r / glow_radius)**1.5)
|
||||
glow_draw.ellipse(
|
||||
[center - r, center - r, center + r, center + r],
|
||||
fill=(255, 213, 79, alpha)
|
||||
)
|
||||
glow = glow.filter(ImageFilter.GaussianBlur(15))
|
||||
img.paste(glow, (0, 0), glow)
|
||||
|
||||
# 3. Draw 5-pointed celestial star polygon with white-to-yellow gradient
|
||||
star_img = Image.new('RGBA', (canvas_size, canvas_size), (0, 0, 0, 0))
|
||||
star_draw = ImageDraw.Draw(star_img)
|
||||
|
||||
r_outer = canvas_size * 0.33
|
||||
r_inner = r_outer * 0.42
|
||||
points = []
|
||||
num_points = 5
|
||||
|
||||
# Rotate by -90 degrees so top point points straight up
|
||||
start_angle = -math.pi / 2.0
|
||||
|
||||
for i in range(num_points * 2):
|
||||
angle = start_angle + i * math.pi / num_points
|
||||
r = r_outer if i % 2 == 0 else r_inner
|
||||
x = center + r * math.cos(angle)
|
||||
y = center + r * math.sin(angle)
|
||||
points.append((x, y))
|
||||
|
||||
# Mask for star gradient
|
||||
star_mask = Image.new('L', (canvas_size, canvas_size), 0)
|
||||
mask_draw = ImageDraw.Draw(star_mask)
|
||||
mask_draw.polygon(points, fill=255)
|
||||
|
||||
# Create gradient fill image for star (pure white at top-left to bright golden yellow at bottom)
|
||||
gradient = Image.new('RGBA', (canvas_size, canvas_size), (0, 0, 0, 0))
|
||||
for y in range(canvas_size):
|
||||
ratio = y / float(canvas_size)
|
||||
# Interpolate from #FFFFFF (top) -> #FFF9C4 -> #FFD54F -> #FFB300 (bottom)
|
||||
if ratio < 0.3:
|
||||
# White to light lemon
|
||||
t = ratio / 0.3
|
||||
r = int(255)
|
||||
g = int(255 - (255 - 249) * t)
|
||||
b = int(255 - (255 - 196) * t)
|
||||
elif ratio < 0.7:
|
||||
# Light lemon to golden yellow
|
||||
t = (ratio - 0.3) / 0.4
|
||||
r = int(255)
|
||||
g = int(249 - (249 - 213) * t)
|
||||
b = int(196 - (196 - 79) * t)
|
||||
else:
|
||||
# Golden yellow to deep amber
|
||||
t = (ratio - 0.7) / 0.3
|
||||
r = int(255)
|
||||
g = int(213 - (213 - 179) * t)
|
||||
b = int(79 - (79 - 0) * t)
|
||||
|
||||
for x in range(canvas_size):
|
||||
gradient.putpixel((x, y), (r, g, b, 255))
|
||||
|
||||
# Apply star mask to gradient
|
||||
star_colored = Image.new('RGBA', (canvas_size, canvas_size), (0, 0, 0, 0))
|
||||
star_colored.paste(gradient, (0, 0), star_mask)
|
||||
|
||||
# Subtle inner facets (diamond lines from center to outer/inner points)
|
||||
facet_draw = ImageDraw.Draw(star_colored)
|
||||
for i in range(num_points * 2):
|
||||
pt = points[i]
|
||||
if i % 2 == 0:
|
||||
facet_draw.line([center, center, pt[0], pt[1]], fill=(255, 255, 255, 90), width=3)
|
||||
else:
|
||||
facet_draw.line([center, center, pt[0], pt[1]], fill=(200, 140, 0, 70), width=2)
|
||||
|
||||
# Star outline
|
||||
facet_draw.polygon(points, outline=(255, 255, 255, 180), width=4)
|
||||
|
||||
# Composite star over canvas
|
||||
img.paste(star_colored, (0, 0), star_colored)
|
||||
|
||||
# Resize with Lanczos downsampling to target size
|
||||
return img.resize((size, size), Image.Resampling.LANCZOS)
|
||||
|
||||
def main():
|
||||
densities = {
|
||||
'android/app/src/main/res/mipmap-mdpi': 48,
|
||||
'android/app/src/main/res/mipmap-hdpi': 72,
|
||||
'android/app/src/main/res/mipmap-xhdpi': 96,
|
||||
'android/app/src/main/res/mipmap-xxhdpi': 144,
|
||||
'android/app/src/main/res/mipmap-xxxhdpi': 192,
|
||||
}
|
||||
|
||||
# Generate master 512x512
|
||||
master = create_star_icon(512)
|
||||
master.save('scripts/app_icon_master.png')
|
||||
print("Created scripts/app_icon_master.png (512x512)")
|
||||
|
||||
for dir_path, sz in densities.items():
|
||||
os.makedirs(dir_path, exist_ok=True)
|
||||
icon = create_star_icon(sz)
|
||||
out_file = os.path.join(dir_path, 'ic_launcher.png')
|
||||
icon.save(out_file, 'PNG')
|
||||
print(f"Saved {out_file} ({sz}x{sz})")
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user