使用带有NodeJs的imagemagick平铺图像

时间:2015-08-05 11:08:35

标签: node.js imagemagick imagemagick-convert node-imagemagick

使用此脚本,我可以将我的(4096x2048)图像平铺为32个图块(512x512)。 我想给一个" X,Y,Z"坐标每个导出的图像。

现在我想将Z保持为0。

示例:

  • output-1-0-0.jpg
  • 输出1-1-0.jpg

    var http = require("http");
    var im = require("imagemagick"); 
    
    var server = http.createServer(function(req, res) {
    
      im.convert(['img.jpg','-crop','512x512','output.jpg'], function(err) {
        if(err) { throw err; }
        res.end("Image crop complete");
      });
    
    }).listen(8080);
    

除此之外,对于这个对nodejs来说这个愚蠢的问题感到抱歉,而不是将图像名称提供给脚本,我可以调用GET请求来裁剪并将所有图像作为服务获取吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

我不认为imagemagick可以处理GET请求。但是你可以做的是将来自GET请求的图像保存到本地文件中,然后调用imagemagick将该图像裁剪成单独的图块。

node.js的一个非常好的http请求库是request

它有一个pipe()方法,用于管理对文件流的任何响应:

http.createServer(function (req, resp) {
  if (req.url === '/img.jpg') {
    if (req.method === 'GET' || req.method === 'HEAD') {
      var r= request.get('http://localhost:8008/img.jpg')
      .on('error', function(err) {
        console.log(err)
      }).pipe(fs.createWriteStream('doodle.png')) // pipe to file
    }
  }
})

通过将响应分配给变量,您可以检查管道操作是否已完成,如果是,您可以调用imagemagick方法进行裁剪操作。

Streams是事件发射器,因此您可以收听某些事件,例如end事件。

r.on('end', function() {
    im.convert(['img.jpg','-crop','512x512','output.jpg'], function(err) {
    if(err) { throw err; }
    res.end("Image crop complete");
  });
});

以下是完整的代码(但未经过测试)。这仅供参考。

http.createServer(function (req, resp) {
  if (req.url === '/img.jpg') {
    if (req.method === 'GET' || req.method === 'HEAD') {
      var r = request.get('http://localhost:8008/img.jpg')
      .on('error', function(err) {
        console.log(err)
      }).pipe(fs.createWriteStream('doodle.png')) // pipe to file

      r.on('end', function() {
        im.convert(['img.jpg','-crop','512x512','output.jpg'], function(err) {
            if(err) { throw err; }
            res.end("Image crop complete");
          });
        });
    }
  }
})