E41222753_NinikYuniarsih_Ju.../convert_logo.py

88 lines
2.6 KiB
Python

"""Convert logo_sekolah.png ke logo_sekolah.ico multi-size untuk PyInstaller."""
import os
import numpy as np
from PIL import Image, ImageEnhance, ImageFilter
def _trim_content(image, tolerance=18):
"""Crop area kosong/warna latar agar simbol utama lebih dominan saat jadi ikon kecil."""
rgba = image.convert("RGBA")
arr = np.array(rgba)
alpha = arr[:, :, 3]
rgb = arr[:, :, :3].astype(np.int16)
corners = np.array([
rgb[0, 0],
rgb[0, -1],
rgb[-1, 0],
rgb[-1, -1],
], dtype=np.int16)
bg = np.median(corners, axis=0)
dist = np.max(np.abs(rgb - bg), axis=2)
mask = (alpha > 10) & (dist > tolerance)
if not np.any(mask):
mask = alpha > 10
if not np.any(mask):
return rgba
ys, xs = np.where(mask)
left, right = int(xs.min()), int(xs.max()) + 1
top, bottom = int(ys.min()), int(ys.max()) + 1
return rgba.crop((left, top, right, bottom))
def _prepare_square_icon(image):
"""Trim margin lalu pasang ke canvas persegi tanpa mengubah warna/detail logo asli."""
image = _trim_content(image)
image = image.convert("RGBA")
# Penajaman ringan agar tetap asli namun lebih jelas di ukuran kecil.
alpha = image.split()[-1]
rgb = image.convert("RGB")
rgb = rgb.filter(ImageFilter.UnsharpMask(radius=1.2, percent=115, threshold=2))
rgb = ImageEnhance.Contrast(rgb).enhance(1.06)
image = rgb.convert("RGBA")
image.putalpha(alpha)
canvas_size = 1024
canvas = Image.new("RGBA", (canvas_size, canvas_size), (0, 0, 0, 0))
max_dim = int(canvas_size * 0.985)
image.thumbnail((max_dim, max_dim), Image.Resampling.LANCZOS)
x = (canvas_size - image.width) // 2
y = (canvas_size - image.height) // 2
canvas.paste(image, (x, y), image)
return canvas
def main():
img_dir = "img"
png_file = os.path.join(img_dir, "logo_sekolah.png")
ico_file = os.path.join(img_dir, "logo_sekolah.ico")
if not os.path.exists(png_file):
print(f"[INFO] File tidak ditemukan: {png_file}. Konversi dilewati.")
return 0
try:
img = Image.open(png_file)
square_img = _prepare_square_icon(img)
sizes = [
(16, 16), (20, 20), (24, 24), (32, 32), (40, 40),
(48, 48), (64, 64), (72, 72), (96, 96), (128, 128), (256, 256),
]
square_img.save(ico_file, format="ICO", sizes=sizes)
print(f"[OK] Berhasil convert: {png_file} -> {ico_file}")
return 0
except Exception as exc:
print(f"[ERROR] Gagal convert logo: {exc}")
return 1
if __name__ == "__main__":
raise SystemExit(main())