Redimensionar y recortar la imagen y mantener la relación de aspecto NodeJS y gm


He estado intentando crear algunas miniaturas usando el paquete gm de NodeJS, pero no tengo suerte. Necesito cambiar el tamaño de las imágenes más grandes que 600x600 (podría ser cualquier ancho/alto, a partir de la dada) pero cuando paso el tamaño a gm, crea una imagen que no tiene el mismo tamaño que solicité.

Por ejemplo, dado este código, asumo que ejecutando node app /path/to/image.png recibiré una imagen con un tamaño de 200x100, pero en su lugar obtuve, digamos, una imagen de 180x100 o 200x90...

gm(fileLocation)
    .thumb(200, 100, 'processed.' + process.argv[2].split('.').pop(), function() {
        console.log("Done!");
    });

También he probado con la opción redimensionar. Incluso hay una opción para forzar el tamaño, pero la relación de aspecto de la salida es horrible...

gm('/path/to/image.jpg')
    .resize(353, 257)
    .write(writeStream, function (err) {
         if (!err) console.log(' hooray! ');
    });
Author: user3277539, 2014-02-06

4 answers

Pruebe con imagemagick paquete para NodeJS: https://github.com/yourdeveloper/node-imagemagick

im.crop({
    srcPath: process.argv[2],
    dstPath: 'cropped.' + process.argv[2].split('.').pop(),
    width: 200,
    height: 200,
    quality: 1,
    gravity: 'Center'
}, function(err, stdout, stderr){
    if (err) throw err;
    console.log('resized ' + process.argv[2].split('/').pop() + ' to fit within 200x200px');
});

Actualización: Tenga en cuenta que el paquete node-imagemagick no se ha actualizado en mucho tiempo. Por favor considere La respuesta de Freyday ya que está más actualizada.

 7
Author: Patrick D'appollonio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-19 01:49:19

Para lograr una imagen redimensionada y recortada con un centro de gravedad con el módulo gm, puede usar algo similar a esto:

gm('/path/to/image.jpg')
  .resize('200', '200', '^')
  .gravity('Center')
  .crop('200', '200')
  .write(writeStream, function (err) {
    if (!err) console.log(' hooray! ');
  });

El argumento '^' en la función resize le dirá a GraphicsMagick que use la altura y el ancho como un mínimo en lugar del comportamiento predeterminado, máximo. La imagen redimensionada resultante tendrá la anchura o la altura como su dimensión designada, mientras que la dimensión no conforme es mayor que la especificada Tamaño.

Luego la función gravity le dice a GraphicsMagick cómo debe comportarse la siguiente función crop, que recortará la imagen al tamaño final.

Puede encontrar documentación detallada para las opciones GraphicsMagick utilizadas por el módulo gm aquí: http://www.graphicsmagick.org/GraphicsMagick.html

 105
Author: mikefrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-01 19:13:13

Otra solución sin bibliotecas externas (excepto por imagemagick) es crear su propia solución:

var exec = require('child_process').exec;

resize = function (image) {
  var cmd = 'convert ' + image.src + 
  ' -resize ' + image.width + 'x' + image.height + '^' + 
  ' -gravity center -crop ' + image.width + 'x' + image.height + '+0+0 ' +
  image.dst;

  exec(cmd, function(error, stdout, stderr) {
    if(error) {
      console.log(error);
    }
  });
}

Y luego llámalo:

resize({
    src: sourceFile,
    dst: destinyFile,
    width: 320,
    height: 240
});

Permitirá sus parámetros personalizados de calidad, recorte, marca de agua, etc...

 2
Author: Otto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-23 21:55:10

Dos cosas...

1) https://github.com/rsms/node-imagemagick - Este paquete ya no es compatible Recomendaría el paquete original que estaba utilizando.

2) La razón por la que no está redimensionando es que el .la función resize toma una cadena, no un entero. Debería serlo... ('353', '257')

gm('/path/to/image.jpg')
    .resize('353', '257')
    .write(writeStream, function (err) {
         if (!err) console.log(' hooray! ');
    });
 -2
Author: erichrusch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-29 21:37:49