import os import sys import subprocess # Asegurar que Pillow este instalado try: from PIL import Image, ImageDraw, ImageFont except ImportError: print("Pillow no esta instalado. Instalando...") subprocess.check_call([sys.executable, "-m", "pip", "install", "Pillow"]) from PIL import Image, ImageDraw, ImageFont def generate_assets(): wix_dir = os.path.dirname(os.path.abspath(__file__)) agent_dir = os.path.dirname(wix_dir) # Rutas logo_path = os.path.join(agent_dir, "icon_custom.png") if not os.path.exists(logo_path): logo_path = os.path.join(agent_dir, "icon.png") dialog_bmp_path = os.path.join(wix_dir, "dialog.bmp") banner_bmp_path = os.path.join(wix_dir, "banner.bmp") # Paleta de colores OmniOil color_bg = (9, 11, 15) # #090b0f color_primary = (255, 122, 26) # #ff7a1a color_text = (244, 247, 251) # #f4f7fb color_muted = (154, 168, 186) # #9aa8ba # Cargar logo si existe logo = None if os.path.exists(logo_path): try: logo = Image.open(logo_path).convert("RGBA") print(f"Logo cargado desde {logo_path}") except Exception as e: print(f"No se pudo cargar el logo: {e}") # ---------------------------------------------------- # 1. Generar dialog.bmp (493x312) - Bienvenida/Finalizacion # ---------------------------------------------------- img_dialog = Image.new("RGB", (493, 312), color_bg) draw_dialog = ImageDraw.Draw(img_dialog) # Dibujar panel lateral con gradiente o color primario draw_dialog.rectangle([0, 0, 164, 312], fill=(15, 20, 28)) # Un azul ligeramente mas claro draw_dialog.rectangle([162, 0, 164, 312], fill=color_primary) # Linea naranja divisoria # Colocar logo en el panel lateral if logo: # Redimensionar logo para el panel lateral (120x120) logo_dialog = logo.resize((120, 120), Image.Resampling.LANCZOS) # Pegar con canal alfa img_dialog.paste(logo_dialog, (22, 96), logo_dialog) # Textos principales (Usamos fuentes estandar para evitar fallos si no existe Geist) try: font_title = ImageFont.truetype("arial.ttf", 20) font_subtitle = ImageFont.truetype("arial.ttf", 12) font_body = ImageFont.truetype("arial.ttf", 10) except IOError: font_title = ImageFont.load_default() font_subtitle = ImageFont.load_default() font_body = ImageFont.load_default() draw_dialog.text((185, 30), "OmniOil Analytics", fill=color_primary, font=font_title) draw_dialog.text((185, 55), "Edge Agent Setup Wizard", fill=color_text, font=font_title) body_text = ( "Este asistente instalara el componente de telemetria\n" "Edge Agent en su equipo local.\n\n" "El agente se ejecutara como un servicio de Windows en\n" "segundo plano para recolectar y reportar datos industriales\n" "bajo los lineamientos de la Resolucion ANH 0651/2025.\n\n" "Desarrollado por KYRBOT INNOVATIONS S.A.S.\n" "NIT 902002081-8" ) draw_dialog.text((185, 110), body_text, fill=color_muted, font=font_body) # Guardar como BMP de 24 bits img_dialog.save(dialog_bmp_path, "BMP") print(f"dialog.bmp generado exitosamente en {dialog_bmp_path}") # ---------------------------------------------------- # 2. Generar banner.bmp (493x58) - Banner superior interno # ---------------------------------------------------- img_banner = Image.new("RGB", (493, 58), color_bg) draw_banner = ImageDraw.Draw(img_banner) # Linea naranja inferior draw_banner.rectangle([0, 56, 493, 58], fill=color_primary) # Colocar logo pequeno a la derecha if logo: logo_banner = logo.resize((42, 42), Image.Resampling.LANCZOS) img_banner.paste(logo_banner, (435, 8), logo_banner) try: font_banner_title = ImageFont.truetype("arial.ttf", 12) font_banner_sub = ImageFont.truetype("arial.ttf", 9) except IOError: font_banner_title = ImageFont.load_default() font_banner_sub = ImageFont.load_default() draw_banner.text((15, 12), "OmniOil Edge Agent", fill=color_primary, font=font_banner_title) draw_banner.text((15, 28), "Configuracion de Telemetria Industrial", fill=color_text, font=font_banner_sub) # Guardar como BMP de 24 bits img_banner.save(banner_bmp_path, "BMP") print(f"banner.bmp generado exitosamente en {banner_bmp_path}") if __name__ == "__main__": generate_assets()