web-dev-qa-db-fra.com

Redimensionner et rogner l'image et conserver le rapport de format NodeJS & gm

J'ai essayé de créer des vignettes à l'aide du package gm de NodeJS, mais je n'ai plus de chance. J'ai besoin de redimensionner des images plus grandes que 600x600 (peut être n'importe quelle largeur/hauteur, en partant de celle donnée), mais lorsque je passe la taille à gm, cela crée une image qui n'a pas la même taille que celle demandée. 

Par exemple, étant donné ce code, je suppose que si je lance node app /path/to/image.png, je recevrai une image de 200x100, mais au lieu de cela, j’ai eu une image de 180x100 ou 200x90 ...

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

J'ai aussi essayé avec l'option de redimensionnement. Il y a même une option pour forcer la taille, mais le rapport d'aspect de la sortie est horrible ...

gm('/path/to/image.jpg')
    .resize(353, 257)
    .write(writeStream, function (err) {
         if (!err) console.log(' hooray! ');
    });
28
user3277539

Essayez avec le paquet imagemagick pour 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');
});

Update: Veuillez noter que le paquet node-imagemagick n'a pas été mis à jour depuis assez longtemps. Veuillez considérer La réponse de Freyday étant donné qu'elle est la plus récente.

7

Pour obtenir une image recadrée redimensionnée avec une densité centrale avec le module gm, vous pouvez utiliser quelque chose de ce type:

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

L'argument '^' de la fonction resize indiquera à GraphicsMagick d'utiliser la hauteur et la largeur en tant que minimum au lieu du comportement par défaut, maximum. L'image redimensionnée résultante aura la largeur ou hauteur comme dimension désignée, tandis que la dimension non conforme est plus grande que la taille spécifiée.

Ensuite, la fonction gravity indique à GraphicsMagick le comportement de la fonction crop suivante, qui recadrera l'image à la taille finale.

Vous trouverez une documentation détaillée sur les options GraphicsMagick utilisées par le module gm ici: http://www.graphicsmagick.org/GraphicsMagick.html

108
mikefrey

Une autre solution sans bibliothèques externes (sauf imagemagick) est de créer votre propre solution:

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);
    }
  });
}

Et puis appelez ça:

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

Il permettra à vos paramètres personnalisés de qualité, recadrage, filigrane, etc ...

2
Otto

Essayez avec le paquet Jimp pour Node.js https://www.npmjs.com/package/jimp . Ce qui est mieux que GM je pense. Il ne nécessite aucune dépendance. J'ai déjà essayé d'utiliser GM, mais je n'ai pas pu installer de dépendances pour GM. J'ai utilisé jimp et tout a bien fonctionné. 

   Jimp.read('lenna.png', (err, lenna) => {
      if (err) throw err;
      lenna
        .resize(256, 256) // resize
        .write('lena-small-bw.jpg'); // save
    });
1
Andy Lai