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

Nat*_*teW 3 imagemagick stream node.js graphicsmagick

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

我想合成多个图像流并将合成图像作为响应进行管道传输. 这是我的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();
})
Run Code Online (Sandbox Code Playgroud)

官方文件

"此时IM不允许您只读取这样的流中的一个图像,处理它,然后再读取另一个图像.所有IM命令将始终读取整个流,然后关闭它.这将被修复为部分IMv7脚本处理."

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

Mar*_*ell 6

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

{ convert -size 50x50 xc:red miff:- ; convert -size 50x50 xc:blue miff:- ; } | convert miff:- +append result.png
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

以下是如何在循环中使用它.注意不要在这个过程的中间把任何调试语句放在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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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