diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index 68802ec..2d37d81 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png index 1d8c17d..7ef65bc 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index b435e57..e7c821a 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png index 5c2b709..94a0257 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 955c20b..675f084 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png index a1645b0..071d0b9 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index c8ecf3e..01d1d39 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png index 886b77c..9c69744 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index fd2e8c0..d937c03 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png index 2e73d94..7fb8812 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/assets/icon/app_icon_1024.png b/assets/icon/app_icon_1024.png index 2a739df..516577a 100644 Binary files a/assets/icon/app_icon_1024.png and b/assets/icon/app_icon_1024.png differ diff --git a/assets/icon/app_icon_256.png b/assets/icon/app_icon_256.png index e620262..54a6f18 100644 Binary files a/assets/icon/app_icon_256.png and b/assets/icon/app_icon_256.png differ diff --git a/assets/tray_icon.ico b/assets/tray_icon.ico index d6168d9..e7e961e 100644 Binary files a/assets/tray_icon.ico and b/assets/tray_icon.ico differ diff --git a/tool/make_icon.py b/tool/make_icon.py index d54dca1..a28f971 100644 --- a/tool/make_icon.py +++ b/tool/make_icon.py @@ -11,7 +11,7 @@ """ from pathlib import Path -from PIL import Image, ImageDraw, ImageFilter +from PIL import Image, ImageDraw, ImageFilter, ImageFont ROOT = Path(__file__).resolve().parent.parent S = 1024 # 원본 크기 @@ -19,6 +19,9 @@ S = 1024 # 원본 크기 RED = (255, 45, 85) # 왼쪽 위 ORANGE = (255, 149, 0) # 오른쪽 아래 FILM = (25, 10, 30) # 필름 띠 +YELLOW = (255, 230, 0) # JJ 글자 (빨강 · 주황 바탕에서 눈에 띄게) +OUTLINE = (60, 0, 30) # JJ 테두리 +FONT = 'C:/Windows/Fonts/seguibl.ttf' # Segoe UI Black def lerp(a, b, t): @@ -71,6 +74,25 @@ def play(size, scale=1.0, cx=0.5, cy=0.5): return layer +def jj(size, cx, top, bottom): + """왼쪽에 J 를 위 · 아래로 하나씩 (노란 굵은 글자 + 진한 테두리 + 그림자)""" + layer = Image.new('RGBA', (size, size), (0, 0, 0, 0)) + h = (bottom - top) / 2 + font = ImageFont.truetype(FONT, int(h * 1.18)) + stroke = max(2, int(h * 0.09)) + shadow = Image.new('RGBA', (size, size), (0, 0, 0, 0)) + for i in range(2): + d = ImageDraw.Draw(layer) + l, t, r, b = d.textbbox((0, 0), 'J', font=font, stroke_width=stroke) + x = cx - (l + r) / 2 + y = top + h * i + (h - (b - t)) / 2 - t + ImageDraw.Draw(shadow).text((x + h * 0.04, y + h * 0.07), 'J', font=font, fill=(60, 0, 20, 150), + stroke_width=stroke, stroke_fill=(60, 0, 20, 150)) + d.text((x, y), 'J', font=font, fill=YELLOW + (255,), stroke_width=stroke, stroke_fill=OUTLINE + (255,)) + shadow = shadow.filter(ImageFilter.GaussianBlur(h * 0.05)) + return Image.alpha_composite(shadow, layer) + + def film_bands(size, top, band, holes=6): """위아래 필름 띠 (어두운 띠 + 흰 구멍)""" layer = Image.new('RGBA', (size, size), (0, 0, 0, 0)) @@ -91,17 +113,21 @@ def make_master(small=False): """앱 아이콘 (둥근 사각형). small=True: 16~32px 용 (필름 띠 없이 재생 버튼을 크게)""" icon = Image.new('RGBA', (S, S), (0, 0, 0, 0)) icon.paste(gradient(S), (0, 0), rounded_mask(S, int(S * 0.22))) - if not small: - bands = film_bands(S, top=int(S * 0.055), band=int(S * 0.13)) - icon = Image.alpha_composite(icon, Image.composite(bands, Image.new('RGBA', (S, S)), rounded_mask(S, int(S * 0.22)))) - return Image.alpha_composite(icon, play(S, scale=1.25 if small else 1.0)) + if small: + return Image.alpha_composite(icon, play(S, scale=1.25)) + bands = film_bands(S, top=int(S * 0.055), band=int(S * 0.13)) + icon = Image.alpha_composite(icon, Image.composite(bands, Image.new('RGBA', (S, S)), rounded_mask(S, int(S * 0.22)))) + # 왼쪽: J · J (위 · 아래), 재생 버튼은 오른쪽으로 + icon = Image.alpha_composite(icon, jj(S, cx=S * 0.19, top=S * 0.23, bottom=S * 0.77)) + return Image.alpha_composite(icon, play(S, scale=0.92, cx=0.6)) def make_adaptive(): """Android 8 이상 (adaptive icon): 108dp 바탕 (그라데이션 + 필름 띠) · 앞 (재생 버튼, 안전 영역 66dp 안)""" bg = gradient(S).convert('RGBA') bg = Image.alpha_composite(bg, film_bands(S, top=int(S * 0.17), band=int(S * 0.1), holes=7)) - fg = play(S, scale=0.62) + # 안전 영역 (가운데 66/108) 안에: 왼쪽 J · J, 오른쪽 재생 버튼 + fg = Image.alpha_composite(jj(S, cx=S * 0.335, top=S * 0.31, bottom=S * 0.69), play(S, scale=0.55, cx=0.57)) return bg, fg diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico index 155a8a0..2e95f21 100644 Binary files a/windows/runner/resources/app_icon.ico and b/windows/runner/resources/app_icon.ico differ