132 lines
3.9 KiB
Python
132 lines
3.9 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Fix App Icon - Add padding to prevent cropping on Android
|
|
"""
|
|
|
|
from PIL import Image, ImageDraw
|
|
import os
|
|
|
|
def create_icon_with_padding(input_path, output_path, padding_percent=15):
|
|
"""
|
|
Create icon with padding to fit Android adaptive icon safe zone
|
|
|
|
Android adaptive icons use a circular mask, so we need to ensure
|
|
the important content fits within a circle of ~80% of the icon size
|
|
"""
|
|
print(f"📷 Loading icon: {input_path}")
|
|
|
|
# Open original image
|
|
img = Image.open(input_path).convert('RGBA')
|
|
original_size = img.size[0]
|
|
|
|
print(f" Original size: {original_size}x{original_size}")
|
|
|
|
# Calculate new size with padding
|
|
padding = int(original_size * (padding_percent / 100))
|
|
new_size = original_size + (padding * 2)
|
|
|
|
print(f" Adding padding: {padding}px on each side")
|
|
print(f" New size: {new_size}x{new_size}")
|
|
|
|
# Create new image with transparent background
|
|
new_img = Image.new('RGBA', (new_size, new_size), (0, 0, 0, 0))
|
|
|
|
# Paste original image in center
|
|
new_img.paste(img, (padding, padding), img)
|
|
|
|
# Save result
|
|
new_img.save(output_path, 'PNG')
|
|
print(f"✅ Icon saved: {output_path}")
|
|
|
|
return output_path
|
|
|
|
def create_icon_with_background(input_path, output_path, bg_color='#1976D2', padding_percent=15):
|
|
"""
|
|
Create icon with colored background (better for adaptive icons)
|
|
"""
|
|
print(f"📷 Loading icon: {input_path}")
|
|
|
|
# Open original image
|
|
img = Image.open(input_path).convert('RGBA')
|
|
original_size = img.size[0]
|
|
|
|
print(f" Original size: {original_size}x{original_size}")
|
|
|
|
# Calculate new size with padding
|
|
padding = int(original_size * (padding_percent / 100))
|
|
new_size = original_size + (padding * 2)
|
|
|
|
print(f" Adding padding: {padding}px on each side")
|
|
print(f" New size: {new_size}x{new_size}")
|
|
print(f" Background color: {bg_color}")
|
|
|
|
# Create new image with colored background
|
|
new_img = Image.new('RGBA', (new_size, new_size), bg_color)
|
|
|
|
# Paste original image in center
|
|
new_img.paste(img, (padding, padding), img)
|
|
|
|
# Save result
|
|
new_img.save(output_path, 'PNG')
|
|
print(f"✅ Icon saved: {output_path}")
|
|
|
|
return output_path
|
|
|
|
if __name__ == '__main__':
|
|
import sys
|
|
|
|
print("🔧 Android Adaptive Icon Fixer")
|
|
print("=" * 50)
|
|
print()
|
|
|
|
# Paths
|
|
input_icon = 'assets/images/app_icon.png'
|
|
|
|
if not os.path.exists(input_icon):
|
|
print(f"❌ Error: Icon not found at {input_icon}")
|
|
sys.exit(1)
|
|
|
|
# Backup original
|
|
backup_path = 'assets/images/app_icon_backup.png'
|
|
if not os.path.exists(backup_path):
|
|
Image.open(input_icon).save(backup_path)
|
|
print(f"💾 Backup saved: {backup_path}")
|
|
print()
|
|
|
|
print("Choose icon style:")
|
|
print("1. Transparent background with padding (default)")
|
|
print("2. Blue background with padding (recommended for Android)")
|
|
print()
|
|
|
|
choice = input("Enter choice (1 or 2, default=2): ").strip() or "2"
|
|
|
|
print()
|
|
|
|
if choice == "1":
|
|
# Transparent with padding
|
|
create_icon_with_padding(
|
|
input_icon,
|
|
input_icon,
|
|
padding_percent=20
|
|
)
|
|
else:
|
|
# Blue background with padding
|
|
create_icon_with_background(
|
|
input_icon,
|
|
input_icon,
|
|
bg_color='#1976D2', # Material Blue
|
|
padding_percent=15
|
|
)
|
|
|
|
print()
|
|
print("=" * 50)
|
|
print("✅ Icon fixed successfully!")
|
|
print()
|
|
print("Next steps:")
|
|
print("1. Run: flutter pub run flutter_launcher_icons")
|
|
print("2. Build APK: flutter build apk --release")
|
|
print("3. Check the new icon on your device")
|
|
print()
|
|
print("If icon still looks wrong, try running this script again")
|
|
print("and choose the other option.")
|