Travail avec les images en TypeScript : redimensionnement et recadrage
\nDans le développement web moderne, le traitement d'images est l'une des tâches les plus demandées. TypeScript, grâce à son typage strict et son intégration avec Node.js, permet de créer des outils fiables et performants pour le redimensionnement (resize) et le recadrage (crop) d'images. Dans cet article, nous examinerons deux bibliothèques populaires : Sharp (traitement côté serveur) et Jimp (JavaScript pur), ainsi qu'une approche native utilisant l'API Canvas pour le navigateur.
\n\n1. Installation et configuration d'un projet TypeScript
\nPour commencer, créez un projet et installez les dépendances nécessaires :
\nnpm init -y\nnpm install typescript @types/node sharp jimp\nnpx tsc --init\nDans le fichier tsconfig.json, assurez-vous que "module": "commonjs" et "target": "ES2020".
2. Bibliothèque Sharp — traitement serveur rapide
\nSharp utilise le module natif libvips et offre des performances élevées. Il convient aux applications serveur (NestJS, Express).
\n\n2.1. Redimensionnement (resize) avec Sharp
\nLa méthode resize() prend la largeur et la hauteur. Vous pouvez spécifier un seul paramètre — le second sera calculé proportionnellement.
import sharp from 'sharp';\n\nasync function resizeImage(inputPath: string, outputPath: string, width: number, height?: number): Promise<void> {\n try {\n await sharp(inputPath)\n .resize(width, height, {\n fit: 'cover', // 'cover', 'contain', 'fill', 'inside', 'outside'\n position: 'center' // position pour le recadrage en mode cover\n })\n .toFile(outputPath);\n console.log(`Image redimensionnée : ${outputPath}`);\n } catch (error) {\n console.error('Erreur de redimensionnement :', error);\n }\n}\n\n// Exemple d'utilisation\nresizeImage('input.jpg', 'output_800x600.jpg', 800, 600);\n\n2.2. Recadrage (crop) avec Sharp
\nLa méthode extract() permet de découper une zone rectangulaire. Paramètres : left, top, width, height.
async function cropImage(\n inputPath: string,\n outputPath: string,\n left: number,\n top: number,\n cropWidth: number,\n cropHeight: number\n): Promise<void> {\n try {\n await sharp(inputPath)\n .extract({ left, top, width: cropWidth, height: cropHeight })\n .toFile(outputPath);\n console.log(`Recadrage effectué : ${outputPath}`);\n } catch (error) {\n console.error('Erreur de recadrage :', error);\n }\n}\n\n// Exemple : découper le centre 400x400 d'une image 800x600\ncropImage('input.jpg', 'cropped_center.jpg', 200, 100, 400, 400);\n\n2.3. Combinaison de redimensionnement et recadrage
\nSharp permet de chaîner les opérations. Par exemple, d'abord réduire, puis recadrer :
\nasync function resizeAndCrop(inputPath: string, outputPath: string): Promise<void> {\n await sharp(inputPath)\n .resize(500, 500, { fit: 'inside' }) // réduire à 500x500 sans recadrage\n .extract({ left: 50, top: 50, width: 400, height: 400 }) // recadrer le centre\n .toFile(outputPath);\n}\n\nresizeAndCrop('input.jpg', 'processed.jpg');\n\n3. Bibliothèque Jimp — JavaScript pur sans dépendances natives
\nJimp fonctionne en JavaScript pur, ne nécessite pas l'installation de bibliothèques système supplémentaires. Idéal pour les environnements isolés (par exemple, AWS Lambda).
\n\n3.1. Installation de Jimp
\nnpm install jimp\nnpm install @types/jimp // pour TypeScript\n\n3.2. redimensionnement avec Jimp
\nimport Jimp from 'jimp';\n\nasync function resizeWithJimp(inputPath: string, outputPath: string, width: number, height: number): Promise<void> {\n try {\n const image = await Jimp.read(inputPath);\n image.resize(width, height, Jimp.RESIZE_BILINEAR); // algorithmes : BILINEAR, BICUBIC, NEAREST_NEIGHBOR\n awa Aussi dans la bibliothèque
PDF Rust : guide complet avec exemples et tutoriel
Symfony/Security pour PHP : guide complet avec exemples