Files
towercontrol/scripts/generate-icons-from-jpg.ts
Julien Froidefond deb3097047 feat(package): add sharp library for image processing and update dependencies
- Added sharp version 0.34.5 to package.json for enhanced image processing capabilities.
- Updated pnpm-lock.yaml to reflect the new sharp version and its dependencies.
- Included additional icons in layout metadata for improved application branding.
2025-11-17 11:36:59 +01:00

133 lines
3.7 KiB
TypeScript

#!/usr/bin/env tsx
/**
* Script pour générer les icônes PNG et ICO à partir de iconTC2.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', 'iconTC2.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 iconTC2.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);