node.js - convert - imagemagick node
Redimensionar y recortar la imagen y mantener la relaciĆ³n de aspecto NodeJS & gm (4)
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 con un tamaño mayor a 600x600 (podría ser cualquier ancho / alto, comenzando con el dado) pero cuando paso el tamaño a gm, se crea una imagen que no tiene el mismo tamaño que solicité.
Por ejemplo, dado este código, asumo que ejecutando la node app /path/to/image.png
recibiré una imagen con un tamaño de 200x100, pero en cambio 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 intentado con la opción de cambio de tamaño. 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! '');
});
Dos cosas...
1) https://github.com/rsms/node-imagemagick : este paquete ya no es compatible. Recomendaría el paquete original que estaba usando.
2) La razón por la que no está cambiando el tamaño es que la función .resize toma en una cadena, no en un entero. Debería ser ... (''353'', ''257'')
gm(''/path/to/image.jpg'')
.resize(''353'', ''257'')
.write(writeStream, function (err) {
if (!err) console.log('' hooray! '');
});
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 ...
Para lograr una imagen recortada y redimensionada con una gravedad central 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 de cambio de resize
le indicará a GraphicsMagick que use la altura y el ancho como 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 más grande que el tamaño especificado.
Luego, gravity
función de gravity
le dice a GraphicsMagick cómo debe comportarse la siguiente función de crop
, que recortará la imagen al tamaño final.
Puede encontrar documentación detallada de las opciones de GraphicsMagick utilizadas por el módulo gm
aquí: http://www.graphicsmagick.org/GraphicsMagick.html
Pruebe con el paquete imagemagick
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 https://github.com/yourdeveloper/node-imagemagick no se ha actualizado en mucho tiempo. Por favor considere la respuesta de Freyday ya que está más actualizada.