如何通过管道传递多个JPEG图像进行转换?

How to pass multiple JPEG images to convert through pipe?

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 图像以进行转换吗?

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

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

JPEG 不是 ImageMagick 的 "streaming" 格式,这意味着您不能简单地将多个 JPEG 文件连接在一起并期望 ImageMagick 将它们分类.唯一的流格式是 MIFF,因此您必须将文件连接在一起作为 MIFF 流并从那里进入 ImageMagick

这可能会澄清...我将 page0.gif 转换为 MIFF 并将其发送到 stdout,然后将 page1.gif 转换为 MIFF 并附加到输出流。然后我开始一个新的 convert 并从合并的 MIFF 流中读入两个文件并从中制作 2 个 GIF 文件:

{ 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

或者您可以在一个流上发送一个 JPEG,在另一个流上发送另一个 JPEG,然后告诉 ImageMgick 先读一个再读另一个,即:

convert fd:0 fd:1 out.gif

此外,您希望 ImageMagick 对这两个文件做什么?你想让它们并排添加吗?还是将一个附加在另一个之上?还是写入两个单独的文件?你的意图还不太清楚。

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

{ convert page0.gif miff:- ; convert page1.gif miff:- ; } | convert miff:- -delay 100 out.gif