изменение размера изображения в node.js

#image-processing #canvas #node.js

#обработка изображений #холст #node.js

Вопрос:

Я пытаюсь изменить размер изображения в node.js с помощью этой программы.

https://github.com/LearnBoost/node-canvas/blob/master/examples/resize.js

 var Canvas = require('canvas')
  , Image = Canvas.Image
  , fs = require('fs');

var img = new Image
  , start = new Date;
img.src = __dirname   'flowers.jpg';

console.log('Resized and saved in %dms');
img.onload = function(){
  console.log('Resized and saved in buffer');
  try{
  var width = img.width / 2
    , height = img.height / 2
    , canvas = new Canvas(width, height)
    , ctx = canvas.getContext('2d');
  ctx.drawImage(img, 0, 0, width, height);
  canvas.toBuffer(function(err, buf){
    console.log('Resized and saved in buffer');
    fs.writeFile(__dirname   '/resize.jpg', buf, function(){
      console.log('Resized and saved in %dms', new Date - start);
    });
  });
  }catch(e){
    console.log(sys.inspect(e));
  }
};

img.onerror = function(err){
  throw err;
};
  

программа не запускается в функции onload почему?
Редактировать :
выдает эту ошибку при попытке img.src после подключения событий onload и onerror?

 `Resized and saved in NaNms

/home/reach121/rahul/knox/index.js:33
 throw err;
 ^
Error: error while reading from input stream
   at Object.<anonymous> (/home/reach121/rahul/knox/index.js:35:9)
   at Module._compile (module.js:404:26)
   at Object..js (module.js:410:10)
   at Module.load (module.js:336:31)
   at Function._load (module.js:297:12)
   at Array.0 (module.js:423:10)
   at EventEmitter._tickCallback (node.js:170:26)
  

Использование магии изображения выдает мне эту ошибку :

 reach121@youngib:~/rahul/knox$ sudo node index.js

node.js:178
        throw e; // process.nextTick error, or 'error' event on first tick
        ^
Error: Command failed: execvp(): No such file or directory

    at ChildProcess.<anonymous> (/usr/local/lib/node/.npm/imagemagick/0.1.2/package/imagemagick.js:64:15)
    at ChildProcess.emit (events.js:67:17)
    at Socket.<anonymous> (child_process.js:172:12)
    at Socket.emit (events.js:64:17)
    at Array.<anonymous> (net.js:826:12)
    at EventEmitter._tickCallback (node.js:170:26)
  

Код :

 var im = require('imagemagick');

im.resize({
  srcPath: __dirname   '/flowers.jpg',
  dstPath: __dirname   '/flowers-small.jpg',
  width:   '50%'
}, function(err, stdout, stderr){
  if (err) throw err
  console.log('resized')
});
  

Ответ №1:

Вы уже пробовали настраивать img.src после прикрепления событий onload и onerror ? Просто заметил это как разницу между исходным примером и вашим.

Другой вопрос: вызвано ли onerror событие? Если это так, то созданное исключение может быть полезным.

Обновить

Если вы просто хотите изменить размер изображений и вам не нужно использовать какие-либо операции, специфичные для canvas, просто используйте ImageMagick и node-imagemagick. Я только что провел небольшой тест, и он сработал «из коробки»:

 var im = require('imagemagick');

im.resize({
  srcPath: __dirname   '/koala.jpg',
  dstPath: __dirname   '/koala-small.jpg',
  width:   '50%'
}, function(err, stdout, stderr){
  if (err) throw err
  console.log('resized')
});
  

Комментарии:

1. `Измененный размер и сохраненный в NaNms /home/reach121/rahul/knox/index.js:33 выдает ошибку; ^ Ошибка: ошибка при чтении из входного потока в Object.<анонимный> (/home/reach121/rahul/knox/index.js:35:9) в Module._compile (module.js: 404:26) в Object..js (module.js:410:10) в модуле. загрузка (module.js:336:31) в функцию. _load (module.js:297:12) в Array.0 (module.js:423:10) в EventEmitter._tickCallback (node.js:170:26)

2. @Rahul тебе нужно установить imagemagick. node-imagemagick просто выполняет установленный двоичный файл github.com/rsms/node-imagemagick/blob/master/imagemagick.js

3. пожалуйста, ознакомьтесь с документацией по модулю, прежде чем публиковать дальнейшие ошибки.

4. Я уже установил imagemagick.. Пожалуйста, проверьте ошибку

5. где вы установили imagemagick? внутри вашего окружения PATH или где-то еще (например, в вашем домашнем каталоге)?

Ответ №2:

Для работы модуля node_imagemagick необходимо установить интерфейсы командной строки imagemagick,

На Mac это может быть так же просто, как:

 brew install imagemagick
  

Но это действительно зависит от вашей конкретной системы.

Ответ №3:

__dirname не имеет завершающей косой черты.

Измените его на это:

 img.src = __dirname   '/flowers.jpg';
  

И прикрепите обработчики событий перед установкой img.src, как сказал @schaermu.

Ответ №4:

К вашему сведению, ваша консоль.оператор log использует %d, но после строки, заключенной в кавычки, нет переменной. (Я не уверен, что это устраняет другие ваши ошибки.)