#!/usr/bin/env python3 import os import sys import shutil import subprocess from pathlib import Path def check_dependencies(): """Verifica que ImageMagick esté instalado""" try: subprocess.run(['magick', '--version'], capture_output=True, check=True) except (subprocess.CalledProcessError, FileNotFoundError): print("Error: ImageMagick no está instalado o no se encuentra en el PATH") print("Instala ImageMagick desde: https://imagemagick.org/script/download.php") sys.exit(1) # Verificar iconutil solo en macOS if sys.platform == 'darwin': try: # iconutil no tiene --version, mejor usar which o probar con -h result = subprocess.run(['which', 'iconutil'], capture_output=True, check=True) if result.returncode == 0: print("✓ iconutil disponible - se crearán archivos .ico e .icns") except (subprocess.CalledProcessError, FileNotFoundError): print("Error: iconutil no está disponible (solo funciona en macOS)") print("Solo se creará el archivo .ico") else: print("ℹ️ Sistema no-macOS detectado - solo se creará archivo .ico") def create_icons(input_file): """Crea archivos .icns e .ico a partir de un PNG""" # Verificar que el archivo existe if not os.path.isfile(input_file): print(f"Error: El archivo {input_file} no existe.") return False # Obtener información del archivo file_path = Path(input_file) file_dir = file_path.parent file_name = file_path.stem # Nombre sin extensión file_extension = file_path.suffix if file_extension.lower() not in ['.png', '.jpg', '.jpeg', '.bmp', '.tiff']: print(f"Advertencia: {file_extension} puede no ser compatible. Se recomienda usar PNG.") # Crear archivo .ico usando el método simplificado ico_output = file_dir / f"{file_name}.ico" try: print(f"Creando {ico_output}...") subprocess.run([ 'magick', str(input_file), '-define', 'icon:auto-resize=256,128,64,48,32,16', str(ico_output) ], check=True) print(f"✓ Archivo .ico creado: {ico_output}") except subprocess.CalledProcessError as e: print(f"Error creando archivo .ico: {e}") return False # Crear archivo .icns (solo en macOS) if sys.platform == 'darwin': try: # Crear carpeta temporal para iconset temp_folder = file_dir / "icon.iconset" # Eliminar carpeta temporal si existe if temp_folder.exists(): shutil.rmtree(temp_folder) # Crear carpeta temporal temp_folder.mkdir(parents=True) # Definir los tamaños y nombres de archivo para .icns icon_sizes = [ (16, "icon_16x16.png"), (32, "icon_16x16@2x.png"), (32, "icon_32x32.png"), (64, "icon_32x32@2x.png"), (128, "icon_128x128.png"), (256, "icon_128x128@2x.png"), (256, "icon_256x256.png"), (512, "icon_256x256@2x.png"), (512, "icon_512x512.png"), (1024, "icon_512x512@2x.png") ] print("Generando imágenes para .icns...") # Crear cada tamaño de imagen for size, output_name in icon_sizes: output_path = temp_folder / output_name subprocess.run([ 'magick', str(input_file), '-resize', f'{size}x{size}', str(output_path) ], check=True) # Crear archivo .icns usando iconutil icns_output = file_dir / f"{file_name}.icns" print(f"Creando {icns_output}...") subprocess.run([ 'iconutil', '-c', 'icns', str(temp_folder), '-o', str(icns_output) ], check=True) # Limpiar carpeta temporal if temp_folder.exists(): shutil.rmtree(temp_folder) print(f"✓ Archivo .icns creado: {icns_output}") except subprocess.CalledProcessError as e: print(f"Error creando archivo .icns: {e}") # Limpiar carpeta temporal en caso de error if temp_folder.exists(): shutil.rmtree(temp_folder) return False else: print("ℹ️ Archivo .icns no creado (solo disponible en macOS)") return True def main(): """Función principal""" # Verificar argumentos if len(sys.argv) != 2: print(f"Uso: {sys.argv[0]} ARCHIVO") print("Ejemplo: python3 create_icons.py imagen.png") sys.exit(0) input_file = sys.argv[1] # Verificar dependencias check_dependencies() # Crear iconos if create_icons(input_file): print("\n✅ Proceso completado exitosamente") else: print("\n❌ El proceso falló") sys.exit(1) if __name__ == "__main__": main()