2014-02-06 4 views
27

Я пытался создать несколько миниатюр с помощью пакета gm от NodeJS, но мне не повезло. Мне нужно изменить размер изображений размером более 600x600 (может быть любая ширина/высота, начиная с заданного), но когда я передаю размер gm, он создает изображение, которое не имеет того же размера, который я запрашивал.Изменение размера и обрезка изображения и сохранение пропорций NodeJS & 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! '); 
    }); 

ответ

7

Попробуйте с 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'); 
}); 

Обновления: Обратите внимание, что пакет node-imagemagick не обновлен достаточно долго. Пожалуйста, рассмотрите Freyday's answer, так как это самый современный.

-2

Две вещи ...

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

'.resize' отлично работает с числами. –

99

Чтобы добиться изменения размера, обрезать изображение с центральной силы тяжести с 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 использовать ширину и высоту как минимальной вместо поведения по умолчанию, максимальный. Полученное измененное изображение будет иметь либо ширину , либо height - ваше обозначенное измерение, в то время как несоответствующий размер больше указанного размера.

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

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

+13

Это должен быть принятый ответ, действительно – marksyzm

1

Другое решение без внешних библиотек (кроме 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 
}); 

Это позволит использовать ваши пользовательские параметры качества, урожай , водяной знак и т. д.

Смежные вопросы