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! ');
});
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.
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
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 ...
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
});