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.
This commit is contained in:
132
scripts/generate-icons-from-jpg.ts
Normal file
132
scripts/generate-icons-from-jpg.ts
Normal file
@@ -0,0 +1,132 @@
|
||||
#!/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);
|
||||
Reference in New Issue
Block a user