Trabajo con imágenes en Node.js: biblioteca Sharp

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Biblioteca Sharp para trabajar con imágenes en Node.js



En el desarrollo web moderno, el procesamiento de imágenes en el lado del servidor es una tarea críticamente importante. Node.js, gracias a su arquitectura orientada a eventos, maneja esta tarea de manera excelente. Entre las múltiples bibliotecas para trabajar con imágenes, un lugar especial lo ocupa Sharp, un módulo de alto rendimiento de código abierto, escrito en C++ y que utiliza la biblioteca libvips.



¿Qué es Sharp?



Sharp es un módulo de Node.js para el procesamiento rápido de imágenes. Soporta los formatos JPEG, PNG, WebP, AVIF, TIFF y GIF. Las capacidades principales incluyen redimensionamiento, recorte, rotación, corrección de color, superposición de marcas de agua y conversión entre formatos. Gracias al uso de libvips, Sharp funciona de 4 a 5 veces más rápido que bibliotecas similares (por ejemplo, ImageMagick o GraphicsMagick).



Instalación



La instalación se realiza a través de npm. Asegúrese de que en el sistema estén instalados los compiladores de C++ (gcc o clang) y libvips (en algunos sistemas operativos se requiere instalación previa).



npm install sharp


Después de la instalación, puede importar el módulo a su proyecto:



const sharp = require('sharp');


Operaciones básicas con imágenes



1. Redimensionamiento (resize)



La tarea más común es reducir o aumentar el tamaño de una imagen. Sharp permite establecer el ancho, la altura o ambas dimensiones simultáneamente. Si solo se especifica un parámetro, el segundo se calculará proporcionalmente.



const sharp = require('sharp');

async function resizeImage() { try { await sharp('input.jpg') .resize(300, 200) // ancho 300px, alto 200px .toFile('output-resized.jpg'); console.log('Imagen redimensionada'); } catch (error) { console.error('Error:', error); }}

resizeImage();


Para mantener las proporciones, use fit:



const sharp = require('sharp');

async function resizeWithFit() { await sharp('input.jpg') .resize({ width: 300, height: 200, fit: 'inside' // 'cover', 'contain', 'fill', 'inside', 'outside' }) .toFile('output-fit.jpg');}

resizeWithFit();


2. Recorte (crop)



El recorte permite eliminar partes no deseadas de la imagen. Sharp admite el recorte por coordenadas específicas o por estrategia (por ejemplo, recorte central).



const sharp = require('sharp');

async function cropImage() { await sharp('input.jpg') .extract({ left: 100, top: 50, width: 400, height: 300 }) .toFile('output-cropped.jpg');}

cropImage();


También se puede usar resize con la opción crop:



const sharp = require('sharp');

async function cropWithResize() { await sharp('input.jpg') .resize(200, 200, { fit: 'cover', position: 'centre' }) .toFile('output-cover.jpg');}

cropWithResize();


3. Conversión de formatos



Sharp permite convertir fácilmente imágenes de un formato a otro. Simplemente indique la extensión en el archivo de salida o use el método .toFormat().



const sharp = require('sharp');

async function convertToWebP() { await sharp('input.png') .toFormat('webp') .toFile('output.webp');}

async function convertToJpeg() { await sharp('input.webp') .jpeg({ quality: 80 }) .toFile('output.jpg');}

convertToWebP();convertToJpeg();


4. Trabajo con metadatos



Puede extraer los metadatos de la imagen: dimensiones, espacio de color, DPI, datos EXIF, etc.



const sharp = require('sharp');

async function getMetadata() { const metadata = await sharp('input.jpg').metadata(); console.log('Metadatos:', metadata); // { format:

Recommendations