- 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.
133 lines
3.7 KiB
TypeScript
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);
|