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图像以通过管道进行转换?
答案 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);