将多个图像流传输到ImageMagick / GraphicsMagick子进程中

时间:2015-10-12 01:13:23

标签: node.js stream imagemagick graphicsmagick

我能够将一个图像流传输到ImageMagick子进程中。我的代码基于Pipe stream to graphicsmagick/imagemagick child process

我希望合成多个图像流并将合成图像作为响应进行管道。这是我的Node.js代码,它从我的AWS S3存储桶中检索图像,然后将其作为响应输出。答复:

app.get('/composite_images', function(req, res){    
    res.writeHead(200, {'Content-Type' : 'image/png'});

    s3.get("/" + "fronttop.png").on("response", function(s3Res) {
      // '-'' means standard in or stdin
      var args = ['-', '-page', '+0+0', '-mosaic', '-'];
      var convert = spawn("convert", args);

      // This worked!
      s3Res.pipe(convert.stdin);

      convert.stdout.pipe(res);
      convert.stderr.pipe(process.stderr);
    }).end();
})

官方documentation

  

“此时IM不允许您从这样的流中读取一个图像,处理它,然后读取另一个图像。所有IM命令将始终读取整个流,然后关闭它。这是正在作为IMv7脚本处理的一部分修复。“

是否可以使用GraphicsMagick / ImageMagick合成多个图像流?

1 个答案:

答案 0 :(得分:6)

不确定这是不是你的意思,但看一看。 ImageMagick确实有流格式,它被称为MIFF或Magick图像文件格式。它允许图像通过管道一个接一个地流式传输。我不会说node,但这是它在命令行中的看法:

{ convert -size 50x50 xc:red miff:- ; convert -size 50x50 xc:blue miff:- ; } | convert miff:- +append result.png

基本上,{}是包含2个ImageMagick convert进程的复合语句,第一个将红色方块图像以MIFF格式写入其标准输出,第二个写入蓝色方括号到其标准输出,也是MIFF格式。然后两个图像通过管道流式传输,并由第三个convert拾取,从标准输入读取红色和蓝色方块并将它们并排连接。

enter image description here

以下是如何在循环中使用它。注意不要在这个过程的中间把任何调试语句放在stdout上 - 这个曾经做过多年并且花了很多时间试图弄清楚为什么会破坏东西的人呢!

#!/bin/bash
for c in red green blue cyan magenta yellow; do 
  convert -size 50x50 xc:$c miff:-
done | convert miff:- +append result.png

enter image description here

也许你可以看到如何做你想要的......