#!/usr/bin/env tsx /** * Script pour générer les icônes PNG et ICO à partir de iconTC4S.png * Préserve la transparence du PNG source * * Usage: pnpm tsx scripts/generate-icons-from-jpg.ts * * Prérequis: npm install -D sharp */ import { existsSync } from 'fs'; import { join } from 'path'; const sizes = [16, 32, 180, 192, 512]; const publicDir = join(process.cwd(), 'public'); const sourceImage = join(process.cwd(), 'public', 'icons', 'iconTC4S.png'); async function generateIcons() { // Vérifier si sharp est disponible let sharp: any; try { sharp = require('sharp'); } catch (e) { console.log("⚠️ sharp n'est pas installé. Installation..."); console.log(' Exécutez: pnpm add -D sharp'); console.log(' Puis relancez ce script.'); return; } if (!existsSync(sourceImage)) { console.error(`❌ ${sourceImage} introuvable`); return; } console.log( '🎨 Génération des icônes à partir de iconTC4S.png (avec transparence)...\n' ); // Obtenir les métadonnées de l'image pour détecter la couleur dominante du fond const metadata = await sharp(sourceImage).metadata(); console.log(`📐 Dimensions source: ${metadata.width}x${metadata.height}\n`); // Générer les différentes tailles avec cover pour remplir sans bordures // La transparence est préservée automatiquement avec PNG for (const size of sizes) { try { const outputPath = join(publicDir, `icon-${size}x${size}.png`); await sharp(sourceImage) .resize(size, size, { fit: 'cover', position: 'center', }) .png({ compressionLevel: 9, adaptiveFiltering: true, palette: false, // Préserve la transparence et les couleurs }) .toFile(outputPath); console.log(`✅ Généré: icon-${size}x${size}.png`); } catch (error) { console.error( `❌ Erreur lors de la génération de icon-${size}x${size}.png:`, error ); } } // Générer apple-touch-icon try { const outputPath = join(publicDir, 'apple-touch-icon.png'); await sharp(sourceImage) .resize(180, 180, { fit: 'cover', position: 'center', }) .png({ compressionLevel: 9, adaptiveFiltering: true, palette: false, }) .toFile(outputPath); console.log(`✅ Généré: apple-touch-icon.png`); } catch (error) { console.error( `❌ Erreur lors de la génération de apple-touch-icon.png:`, error ); } // Générer favicon.ico (32x32) // Note: ICO peut supporter la transparence, mais on génère un PNG pour compatibilité try { const faviconPath = join(publicDir, 'favicon.ico'); await sharp(sourceImage) .resize(32, 32, { fit: 'cover', position: 'center', }) .png({ compressionLevel: 9, adaptiveFiltering: true, palette: false, }) .toFile(faviconPath); console.log(`✅ Généré: favicon.ico (32x32 avec transparence)`); } catch (error) { console.error(`❌ Erreur lors de la génération de favicon.ico:`, error); } // Générer icon.png (192x192 pour PWA) try { const iconPath = join(publicDir, 'icon.png'); await sharp(sourceImage) .resize(192, 192, { fit: 'cover', position: 'center', }) .png({ compressionLevel: 9, adaptiveFiltering: true, palette: false, }) .toFile(iconPath); console.log(`✅ Généré: icon.png (192x192)`); } catch (error) { console.error(`❌ Erreur lors de la génération de icon.png:`, error); } console.log('\n✨ Génération terminée!'); } generateIcons().catch(console.error);