Trabajo con imágenes en Node.js: resize y crop con Sharp
\n\nEn el desarrollo web moderno, el procesamiento de imágenes en el lado del servidor es una tarea frecuente. Node.js ofrece varias librerías potentes para trabajar con gráficos. En este artículo, analizaremos en detalle la librería Sharp, una herramienta rápida y eficiente para cambiar el tamaño (resize) y recortar (crop) imágenes.
\n\n¿Por qué Sharp?
\n\nSharp utiliza las librerías nativas libvips, lo que lo convierte en una de las soluciones más eficientes para Node.js. Principales ventajas:
\n- \n
- Alta velocidad de procesamiento (mucho más rápido que alternativas en JavaScript puro) \n
- Bajo consumo de memoria \n
- Soporte para todos los formatos populares: JPEG, PNG, WebP, AVIF, TIFF
- API simple y clara
- Posibilidad de trabajar con flujos (streams)
Instalación
\n\nLa instalación de Sharp en un proyecto Node.js se realiza con un solo comando:
\n\nnpm install sharp\n\nDespués de la instalación, la librería está lista para usar. Asegúrese de que el sistema tenga las dependencias necesarias para compilar el módulo nativo (generalmente ocurre automáticamente).
\n\nCambio básico de tamaño (resize)
\n\nEl método resize() permite cambiar las dimensiones de una imagen. Veamos los casos de uso principales.
Ejemplo 1: Cambio de tamaño simple
\n\nconst sharp = require('sharp');\nconst path = require('path');\n\nasync function resizeImage() {\n try {\n await sharp('input.jpg')\n .resize(300, 200) // ancho 300px, alto 200px\n .toFile('output.jpg');\n console.log('Imagen redimensionada exitosamente');\n } catch (error) {\n console.error('Error:', error);\n }\n}\n\nresizeImage();\n\nEn este ejemplo, la imagen se comprimirá a las dimensiones exactas de 300x200 píxeles, lo que puede distorsionar las proporciones.
\n\nEjemplo 2: Mantener las proporciones
\n\nasync function resizeWithProportions() {\n await sharp('input.jpg')\n .resize({\n width: 400, // solo el ancho\n height: undefined, // la altura se calculará automáticamente\n fit: 'inside' // mantener las proporciones\n })\n .toFile('output_inside.jpg');\n \n console.log('Proporciones mantenidas');\n}\n\nEl parámetro fit acepta varios valores:
- \n
cover— recorta la imagen para llenar completamente las dimensiones dadas (por defecto) \n contain— ajusta la imagen dentro de las dimensiones dadas, manteniendo las proporciones \n fill— estira la imagen a las dimensiones dadas \n inside— reduce la imagen para que quepa dentro de las dimensiones dadas \n outside— amplía la imagen para que exceda las dimensiones dadas \n
Recorte de imágenes (crop)
\n\nSharp ofrece dos formas principales de recortar: mediante el método extract() y a través de los parámetros de resize().
Método extract()
\n\nPermite extraer un área rectangular de la imagen según las coordenadas dadas:
\n\nasync function cropImage() {\n await sharp('input.jpg')\n .extract({\n left: 100, // margen izquierdo\n top: 50, // margen superior\n width: 300, // ancho del área\n height: 200 // alto del área\n })\n .toFile('cropped.jpg');\n \n console.log('Recorte realizado');\n}\n\nRecorte automático al redimensionar
\n\nA menudo es necesario cambiar el tamaño y recortar la imagen simultáneamente. Esto se hace con el parámetro gravity o position:
async function cropAndResize() {\n await sharp('input.jpg')\n .resize(200, 200, {\n fit: 'cover', // recortar hasta exactamente