如何通过管道传递多个JPEG图像?

时间:2015-09-24 13:39:51

标签: node.js imagemagick imagemagick-convert

var spawn = require('child_process').spawn
var fs = require('fs')
var Readable = require('stream').Readable

var stream = new Readable()
var img1 = fs.readFileSync('img1.jpg')
var img2 = fs.readFileSync('img2.jpg')
stream.push(img1)
stream.push(img2)
stream.push(null)
var convert = spawn('convert', ['jpg:fd:0', 'out.gif'])
stream.pipe(convert.stdio[0])

引发

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: write EPIPE
    at errnoException (net.js:905:11)
    at Object.afterWrite (net.js:721:19)

但是当我将一个图像推送到管道时,它可以工作。因此,转换似乎不是因为我正在通过流传递多个图像,它只是在收到第一个图像后关闭管道...是否可以传递许多JPEG图像以通过管道进行转换?

2 个答案:

答案 0 :(得分:1)

JPEG不是ImageMagick的“流式”格式,这意味着您不能简单地将多个JPEG文件连接在一起,并期望ImageMagick对它们进行排序。唯一的流格式是MIFF,因此您必须将这些文件作为MIFF流连接在一起,并从那里连接到ImageMagick

这可能会澄清......我将page0.gif转换为MIFF并将其发送至stdout,然后将page1.gif转换为MIFF并将其附加到convert输出流。然后我开始一个新的MIFF并从合并的{ convert page0.gif miff:- ; convert page1.gif miff:- ; } | convert miff:- out-%d.gif -rw-r--r-- 1 mark staff 10383 24 Sep 16:29 out-1.gif -rw-r--r-- 1 mark staff 11778 24 Sep 16:29 out-0.gif 流中读取两个文件并从中生成2个GIF文件:

ImageMgick

或者您可以在一个流上发送一个JPEG而在另一个流上发送另一个JPEG,并告诉convert fd:0 fd:1 out.gif 从一个流中读取另一个流,即:

ImageMagick

另外,您期望{ convert page0.gif miff:- ; convert page1.gif miff:- ; } | convert miff:- -delay 100 out.gif 对这两个文件做什么?你想要它们并排添加吗?或者一个在另一个之上?或写入两个单独的文件?你的意图不太清楚。

如果你想用它们制作动画GIF,你应该做node.js相当于:

{{1}}

答案 1 :(得分:0)

默认情况下,当源流发送结束时,在目标上调用end(),以便该目标不再可写。传递{end:false}作为保持目标流开放的选项。

image1Stream.pipe(writer, { end: false });
image2Stream.pipe(writer);