将多个图像流导入ImageMagick/GraphicsMagick子进程

3
我可以将一张图片流传递到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();
})

官方文档称:

"目前 IM 不允许您仅从此类流中读取一个图像,对其进行处理,然后读取另一张单独的图像。所有 IM 命令都将始终读取整个流,然后关闭它。这将作为 IMv7 脚本处理的一部分来修复。"

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

1个回答

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

下面是如何在循环中使用它。注意不要在此过程中将任何调试语句放在标准输出中 - 曾经有人这样做,并花费了很长时间才弄清楚为什么会出错!

#!/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

也许现在你可以看到如何做你想要的事了...

嘿,马克!非常感谢,我很高兴这是可能的!我将在本周内尝试并告诉你结果。 还有一个问题,你的代码是伪代码还是实际语言? - NateW
1
它只是在bash shell中在终端中键入的 - convert是ImageMagick套件中的一个程序,就像lssleep一样 - 一个命令行程序。 - Mark Setchell
真的不知道bash中也可以使用for循环。谢谢! - NateW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接