import math import numpy as np from PIL import Image, ImageDraw, ImageFilter, ImageEnhance HI_SIZE = 4096 OUT_SIZE = 1024 CENTER = HI_SIZE / 2.0 # ============================================================================== # 1. МНОГОСЛОЙНЫЙ ГЛУБОКИЙ КОСМОС: ГАЛАКТИКА, ПЛАЗМА И ТУМАННОСТИ # ============================================================================== bg = Image.new('RGBA', (HI_SIZE, HI_SIZE), (2, 2, 8, 255)) # А. Спиральные рукава галактики с богатыми переливами цвета (маджента, фиолетовый, индиго, бирюза) galaxy = Image.new('RGBA', (HI_SIZE, HI_SIZE), (0, 0, 0, 0)) gdraw = ImageDraw.Draw(galaxy) # 3 рукава галактики for arm in range(3): arm_angle = arm * (2.0 * math.pi / 3.0) - 0.4 for step in range(100): t = step / 99.0 ang = arm_angle + t * math.pi * 1.6 dist = 100 + (t**1.1) * (HI_SIZE * 0.48) cx = CENTER + dist * math.cos(ang) cy = CENTER + dist * math.sin(ang) r_cloud = 260 + t * 450 # Переливы туманности if t < 0.3: col = (75, 15, 95, int(55 * (1 - t*0.5))) # Маджента-аметист elif t < 0.65: col = (25, 45, 125, int(60 * (1 - t*0.5))) # Глубокий ультрамарин else: col = (10, 85, 130, int(45 * (1 - t*0.5))) # Эфирная бирюза gdraw.ellipse([cx - r_cloud, cy - r_cloud*0.7, cx + r_cloud, cy + r_cloud*0.7], fill=col) galaxy = galaxy.filter(ImageFilter.GaussianBlur(320)) bg = Image.alpha_composite(bg, galaxy) # Б. Золотисто-янтарный аккреционный диск черной дыры (Gargantua) accretion = Image.new('RGBA', (HI_SIZE, HI_SIZE), (0, 0, 0, 0)) adraw = ImageDraw.Draw(accretion) disc_angle = math.radians(-30) for i in range(25): t = i / 24.0 w = 1900 - t * 750 h = 680 - t * 290 alpha = int(65 * (1.0 - t**1.3)) # Теплые тона плазмы adraw.ellipse([CENTER - w, CENTER - h, CENTER + w, CENTER + h], fill=(245, 135 + int(t*40), 25 + int(t*50), alpha)) adraw.ellipse([CENTER - 1150, CENTER - 1150, CENTER + 1150, CENTER + 1150], fill=(255, 160, 40, 45)) adraw.ellipse([CENTER - 800, CENTER - 800, CENTER + 800, CENTER + 800], fill=(255, 205, 75, 55)) accretion = accretion.filter(ImageFilter.GaussianBlur(220)) bg = Image.alpha_composite(bg, accretion) # В. Эффект объемных световых лучей Бога (God Rays / Light Shafts из центра) god_rays = Image.new('RGBA', (HI_SIZE, HI_SIZE), (0, 0, 0, 0)) gr_draw = ImageDraw.Draw(god_rays) np.random.seed(333) for _ in range(36): r_ang = np.random.uniform(0, 2 * math.pi) r_len = np.random.uniform(HI_SIZE * 0.35, HI_SIZE * 0.55) r_w = np.random.uniform(30, 90) p_end = (CENTER + r_len * math.cos(r_ang), CENTER + r_len * math.sin(r_ang)) alpha = np.random.randint(15, 40) col = (255, 210, 110, alpha) if np.random.rand() > 0.4 else (130, 220, 255, alpha) gr_draw.line([(CENTER, CENTER), p_end], fill=col, width=int(r_w)) god_rays = god_rays.filter(ImageFilter.GaussianBlur(120)) bg = Image.alpha_composite(bg, god_rays) # ============================================================================== # 2. ВОЛШЕБНЫЕ СПЕЦЭФФЕКТЫ: БЛЕСТКИ, ИСКРЫ, МЕРЦАЮЩИЕ ФОТОНЫ (MAGIC GLITTER) # ============================================================================== glitter_layer = Image.new('RGBA', (HI_SIZE, HI_SIZE), (0, 0, 0, 0)) gldraw = ImageDraw.Draw(glitter_layer) # 1. 600 мелких мерцающих звезд-пылинок разного цвета for _ in range(650): sx = np.random.uniform(30, HI_SIZE - 30) sy = np.random.uniform(30, HI_SIZE - 30) sr = np.random.uniform(2, 8) alpha = np.random.randint(70, 230) tints = [(255, 255, 255), (255, 230, 170), (180, 230, 255), (255, 190, 230), (255, 215, 120)] tint = tints[np.random.randint(len(tints))] gldraw.ellipse([sx - sr, sy - sr, sx + sr, sy + sr], fill=(*tint, alpha)) # 2. 50 ярких бриллиантовых звезд с 4-лучевой дифракционной оптикой (чистая магия!) for _ in range(55): bx = np.random.uniform(80, HI_SIZE - 80) by = np.random.uniform(80, HI_SIZE - 80) # Держимся немного в стороне от самого центра, чтобы не засорять знак if math.hypot(bx - CENTER, by - CENTER) < HI_SIZE * 0.12: continue b_len = np.random.uniform(25, 75) b_glow = np.random.uniform(8, 20) # Мягкий ореол gldraw.ellipse([bx - b_glow, by - b_glow, bx + b_glow, by + b_glow], fill=(255, 240, 200, 120)) # 4 лучика блестки gldraw.line([(bx - b_len, by), (bx + b_len, by)], fill=(255, 255, 255, 220), width=3) gldraw.line([(bx, by - b_len), (bx, by + b_len)], fill=(255, 255, 255, 220), width=3) gldraw.ellipse([bx - 4, by - 4, bx + 4, by + 4], fill=(255, 255, 255, 255)) glitter_layer = glitter_layer.filter(ImageFilter.GaussianBlur(3)) bg = Image.alpha_composite(bg, glitter_layer) # ============================================================================== # 3. ТОЧНО ВЫВЕРЕННАЯ 13-ЛУЧЕВАЯ ЗВЕЗДА ИЗ ВАРИАНТА А С ОБЪЕМНЫМ СВЕЧЕНИЕМ # ============================================================================== rays_layer = Image.new('RGBA', (HI_SIZE, HI_SIZE), (0, 0, 0, 0)) rdraw = ImageDraw.Draw(rays_layer) N_POINTS = 13 R_OUTER = HI_SIZE * 0.435 R_MID = HI_SIZE * 0.280 R_INNER = HI_SIZE * 0.160 angles = [(-math.pi / 2.0) + (2.0 * math.pi * i / N_POINTS) for i in range(N_POINTS)] for i in range(N_POINTS): a_tip = angles[i] tip = (CENTER + R_OUTER * math.cos(a_tip), CENTER + R_OUTER * math.sin(a_tip)) a_left = a_tip - (math.pi / N_POINTS) * 0.85 a_right = a_tip + (math.pi / N_POINTS) * 0.85 p_left_base = (CENTER + R_INNER * math.cos(a_left), CENTER + R_INNER * math.sin(a_left)) p_right_base = (CENTER + R_INNER * math.cos(a_right), CENTER + R_INNER * math.sin(a_right)) p_left_mid = (CENTER + R_MID * math.cos(a_tip - 0.12), CENTER + R_MID * math.sin(a_tip - 0.12)) p_right_mid = (CENTER + R_MID * math.cos(a_tip + 0.12), CENTER + R_MID * math.sin(a_tip + 0.12)) pts_left = [] pts_right = [] for step in range(30): t = step / 29.0 lx = (1-t)**2 * p_left_base[0] + 2*(1-t)*t * p_left_mid[0] + t**2 * tip[0] ly = (1-t)**2 * p_left_base[1] + 2*(1-t)*t * p_left_mid[1] + t**2 * tip[1] pts_left.append((lx, ly)) rx = (1-t)**2 * p_right_base[0] + 2*(1-t)*t * p_right_mid[0] + t**2 * tip[0] ry = (1-t)**2 * p_right_base[1] + 2*(1-t)*t * p_right_mid[1] + t**2 * tip[1] pts_right.append((rx, ry)) polygon = pts_left + pts_right[::-1] rdraw.polygon(polygon, fill=(255, 195, 45, 32)) threads_glow = Image.new('RGBA', (HI_SIZE, HI_SIZE), (0, 0, 0, 0)) tdraw_g = ImageDraw.Draw(threads_glow) threads_core = Image.new('RGBA', (HI_SIZE, HI_SIZE), (0, 0, 0, 0)) tdraw_c = ImageDraw.Draw(threads_core) # Основные 13 лучей к вершинам for i in range(N_POINTS): p_tip = (CENTER + R_OUTER * math.cos(angles[i]), CENTER + R_OUTER * math.sin(angles[i])) p_in = (CENTER + R_INNER * 0.9 * math.cos(angles[i]), CENTER + R_INNER * 0.9 * math.sin(angles[i])) tdraw_g.line([p_in, p_tip], fill=(255, 185, 30, 170), width=34) tdraw_c.line([p_in, p_tip], fill=(255, 220, 80, 230), width=14) tdraw_c.line([p_in, p_tip], fill=(255, 255, 230, 255), width=6) # Сакральные пересечения 13-лучевой звезды (step=4) for i in range(N_POINTS): p1 = (CENTER + R_OUTER * math.cos(angles[i]), CENTER + R_OUTER * math.sin(angles[i])) p2 = (CENTER + R_OUTER * math.cos(angles[(i + 4) % N_POINTS]), CENTER + R_OUTER * math.sin(angles[(i + 4) % N_POINTS])) tdraw_g.line([p1, p2], fill=(255, 170, 40, 95), width=20) tdraw_c.line([p1, p2], fill=(255, 235, 140, 180), width=6) tdraw_c.line([p1, p2], fill=(255, 255, 255, 240), width=2) rdraw.ellipse([CENTER - R_MID, CENTER - R_MID, CENTER + R_MID, CENTER + R_MID], outline=(255, 190, 50, 150), width=8) rdraw.ellipse([CENTER - R_INNER, CENTER - R_INNER, CENTER + R_INNER, CENTER + R_INNER], outline=(100, 220, 255, 190), width=10) # ============================================================================== # 4. ИСПРАВЛЕННЫЙ ТРИСКЕЛИОН ХРОМ-999: СТРЕМИТЕЛЬНЫЕ СЕРПОВИДНЫЕ ДЕВЯТКИ БЕЗ ПЕТЕЛЬ! # ============================================================================== trisk_glow = Image.new('RGBA', (HI_SIZE, HI_SIZE), (0, 0, 0, 0)) tgdraw = ImageDraw.Draw(trisk_glow) trisk_body = Image.new('RGBA', (HI_SIZE, HI_SIZE), (0, 0, 0, 0)) tbdraw = ImageDraw.Draw(trisk_body) silk_line = Image.new('RGBA', (HI_SIZE, HI_SIZE), (0, 0, 0, 0)) sldraw = ImageDraw.Draw(silk_line) R_RING = HI_SIZE * 0.082 # Единое центральное кольцо tgdraw.ellipse([CENTER - R_RING, CENTER - R_RING, CENTER + R_RING, CENTER + R_RING], outline=(255, 180, 30, 230), width=50) tbdraw.ellipse([CENTER - R_RING, CENTER - R_RING, CENTER + R_RING, CENTER + R_RING], outline=(255, 235, 110, 255), width=24) sldraw.ellipse([CENTER - R_RING, CENTER - R_RING, CENTER + R_RING, CENTER + R_RING], outline=(255, 255, 255, 255), width=8) for k in range(3): rot = -math.pi / 2.0 + k * (2.0 * math.pi / 3.0) spine_pts = [] widths = [] num_steps = 75 for step in range(num_steps): t = step / float(num_steps - 1) ang = rot + t * 1.68 rad = R_RING + (t**1.12) * (HI_SIZE * 0.150) px = CENTER + rad * math.cos(ang) py = CENTER + rad * math.sin(ang) spine_pts.append((px, py)) w = 38.0 * (1.0 - t**0.88 * 0.90) widths.append(max(3.0, w)) left_edge = [] right_edge = [] for i in range(len(spine_pts)): p = spine_pts[i] w = widths[i] / 2.0 if i == 0: dx = spine_pts[1][0] - p[0] dy = spine_pts[1][1] - p[1] elif i == len(spine_pts) - 1: dx = p[0] - spine_pts[i-1][0] dy = p[1] - spine_pts[i-1][1] else: dx = spine_pts[i+1][0] - spine_pts[i-1][0] dy = spine_pts[i+1][1] - spine_pts[i-1][1] length = math.hypot(dx, dy) + 1e-6 nx = -dy / length ny = dx / length left_edge.append((p[0] + nx * w, p[1] + ny * w)) right_edge.append((p[0] - nx * w, p[1] - ny * w)) ribbon_poly = left_edge + right_edge[::-1] tgdraw.polygon(ribbon_poly, fill=(255, 175, 30, 210)) tbdraw.polygon(ribbon_poly, fill=(255, 240, 120, 250)) for p in range(len(spine_pts) - 1): sldraw.line([spine_pts[p], spine_pts[p+1]], fill=(255, 255, 255, 255), width=6) # ============================================================================== # 5. ФОТОННОЕ КИНО-ЯДРО И ОПТИЧЕСКАЯ АНАМОРФОТНАЯ ВСПЫШКА # ============================================================================== core = Image.new('RGBA', (HI_SIZE, HI_SIZE), (0, 0, 0, 0)) cdraw = ImageDraw.Draw(core) # Оптическая сфера for r_c in range(130, 0, -4): alpha = int(255 * (1.0 - (r_c / 130.0)**1.3)) cdraw.ellipse([CENTER - r_c, CENTER - r_c, CENTER + r_c, CENTER + r_c], fill=(255, 253, 240, alpha)) # Кинематографический луч Интерстеллара (горизонтальный Flare) for dx in range(-700, 700, 2): fade = 1.0 - (abs(dx) / 700.0)**2 alpha = int(195 * fade) h_w = int(14 * (1.0 - abs(dx) / 700.0) + 2) cdraw.ellipse([CENTER + dx - 2, CENTER - h_w, CENTER + dx + 2, CENTER + h_w], fill=(185, 242, 255, alpha)) # Нежная наклонная вспышка под 45 градусов for d in range(-350, 350, 2): fade = 1.0 - (abs(d) / 350.0)**2 alpha = int(90 * fade) cdraw.ellipse([CENTER + d - 1, CENTER + d - 1, CENTER + d + 1, CENTER + d + 1], fill=(255, 220, 160, alpha)) # ============================================================================== # 6. СБОРКА И МНОГОУРОВНЕВЫЙ BLOOM # ============================================================================== comp = Image.alpha_composite(bg, rays_layer) comp = Image.alpha_composite(comp, threads_glow.filter(ImageFilter.GaussianBlur(45))) comp = Image.alpha_composite(comp, trisk_glow.filter(ImageFilter.GaussianBlur(32))) comp = Image.alpha_composite(comp, threads_core) comp = Image.alpha_composite(comp, trisk_body) comp = Image.alpha_composite(comp, silk_line) comp = Image.alpha_composite(comp, core) # Финальный мягкий кинематографический Bloom bloom = comp.filter(ImageFilter.GaussianBlur(28)) comp = Image.blend(comp, bloom, 0.22) # Даунсеймплинг Lanczos с 4096 до 1024 (идеальный 16x антиалиасинг) final_1024 = comp.resize((OUT_SIZE, OUT_SIZE), Image.Resampling.LANCZOS) out_file = '/home/alexives/.gemini/antigravity-ide/brain/4ff924d9-3d7f-4202-9066-3ac5c3088b8e/star_13_magic_fx_interstellar.png' final_1024.save(out_file, 'PNG') print("Successfully generated ULTIMATE SPECIAL EFFECTS ICON at:", out_file)