Изменение размера и обрезка изображения и сохранение соотношения сторон NodeJS & gm

Я пытался создать несколько эскизов с помощью gm пакет от NodeJS, но мне не повезло. Мне нужно изменить размер изображений больше 600x600 (может быть любой ширины/высоты, начиная с заданного), но когда я передаю размер gm, он создает изображение, которое не имеет того же размера, который я просил.

например, учитывая этот код, я предполагаю, что работает node app /path/to/image.png я получу изображение размером 200x100, но вместо этого я получил, скажем, изображение 180x100 или 200x90...

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

Я также пробовал с опцией изменения размера. Есть даже возможность заставить размер, но соотношение сторон выхода идет ужасно...

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

4 ответов


попробовать imagemagick пакет для 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');
});

обновление: обратите внимание:узел-imagemagick пакет не обновлялся довольно долгое время. Пожалуйста, подумайте Freyday это так как это самый современный.


для достижения измененного размера, обрезанное изображение с центром тяжести С gm модуль, вы можете использовать что-то вроде этого:

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

на на resize функция скажет GraphicsMagick использовать высоту и ширину как минимум вместо поведения по умолчанию,максимум. Результирующее измененное изображение будет иметь ширину или высота ваш обозначенный размер, пока не-соответствуя размер больше указанного размера.

затем gravity функция сообщает GraphicsMagick, как следующее crop функция должна вести себя, которая будет обрезать изображение до конечного размера.

вы можете найти подробную документацию для параметров GraphicsMagick, используемых gm модуль здесь:http://www.graphicsmagick.org/GraphicsMagick.html


другое решение без внешних библиотек (кроме imagemagick) - это создать собственное решение:

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

а затем назовите его:

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

Это позволит настраиваемых параметров качества, обрезать, водяной знак, etc...


две вещи...

1) https://github.com/rsms/node-imagemagick - этот пакет больше не поддерживается я бы рекомендовал оригинальный пакет, который вы использовали.

2) почему это не изменение, это то, что .функция resize принимает строку, а не целое число. Так и должно быть... ('353', '257')

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