es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo redimensionar una imagen de manera proporcional usando un efecto de desenfoque, en lugar de utilizar barras negras, en Node.js?

Tengo una foto que es un rectángulo y quiero redimensionarla a un cuadrado mientras se preserva la relación de aspecto. Bibliotecas como Sharp te permiten hacerlo aplicando barras laterales a la imagen resultante.

await sharp(photoBuffer).resize({ width: 200, height: 200, fit: 'contain' })

Este es el resultado:

con barras laterales

En lugar de aplicar barras laterales, me gustaría que el espacio vacío restante se llenara con una segunda versión borrosa de la imagen, colocada detrás de la redimensionada, de esta manera:

ejemplo

¿Existe alguna biblioteca de Node.js que haga esto de manera sencilla o alguna manera personalizada de lograrlo?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr este efecto es utilizando una combinación de las bibliotecas Sharp y Jimp.

    Primero, podemos usar Sharp para redimensionar la foto y agregar barras de letras para crear una imagen cuadrada:

    const sharp = require('sharp');
    
    const imageBuffer = await sharp(photoBuffer)
      .resize({ width: 200, height: 200, fit: 'contain' })
      .background({ r: 255, g: 255, b: 255, alpha: 1 })
      .flatten()
      .toBuffer();
    

    A continuación, podemos usar Jimp para crear una versión borrosa de la imagen y componerla detrás de la imagen redimensionada:

    const Jimp = require('jimp');
    
    // abrir la foto original con Jimp
    const imagen = await Jimp.read(photoBuffer);
    
    // crear una versión borrosa de la foto original
    imagen.blur(5);
    
    // crear una nueva imagen Jimp con las mismas dimensiones que la imagen redimensionada
    const imagenCombinada = await Jimp.read(imageBuffer);
    const anchoCombinado = imagenCombinada.bitmap.width;
    const altoCombinado = imagenCombinada.bitmap.height;
    
    // componer la imagen borrosa detrás de la imagen redimensionada
    imagenCombinada.composite(
      imagen.resize(anchoCombinado, altoCombinado),
      0,
      0,
      { mode: Jimp.BLEND_SOURCE_OVER }
    );
    
    // obtener el búfer de la imagen compuesta
    const bufferCombinado = await imagenCombinada.getBufferAsync(Jimp.MIME_JPEG);
    

    Esto nos dará una imagen cuadrada con la foto original redimensionada y con barras de letras, así como una versión borrosa de la foto original ocupando el espacio restante detrás de ella.

Comments are closed.