节点流 - 如何读取文件流的数据

时间:2014-10-24 02:37:20

标签: node.js stream

我正在尝试压缩图片,将其转换为dataURI,然后将其保存到文本文件中。

我正在使用GraphicsMagic来读取和压缩图像。

我想将图像中的数据“管道”化为流,并将此图像数据转换为dataURI,这样我就可以避免创建中间图像。

var file = '/path/to/file.png'

gm(file).compress('JPEG').quality(20).stream(function (err, stdout, stderr) {
   stdout.pipe(streamChunkReader);
});

现在,在streamChunkReader中,我会将图像数据转换为dataURI,例如:

content = dataURI.format('.png', dataChunk);
console.log(content); //"data:image/png;base64,eGtjZA=="

虽然,我不确定streamChunkReader能够获取图像数据的样子

在查看了在streamChunkReader上调用的方法之后,我想象它的类似:

var streamChunkReader = {

    write: function (imageData) {
        console.log(imageData); // the image data

        // so I could do
        console.log(dataURI.format('.png', imageData);) //"data:image/png;base64,eGtjZA=="
    }

}

但是当我记录imageData时,它是<Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 48 00 48 00 00 ff fe 00 0f 4...,我不确定那是什么。

1 个答案:

答案 0 :(得分:1)

这里有几个问题。要回答关于<Buffer ff d8 ff...是什么的问题,这是一个包含二进制数据的Buffer对象。将这些转储到控制台时,您会看到它的十六进制表示。

您没有告诉我们您使用dataURI的内容,但通过查看您的示例,至少.format函数似乎不支持流。如果要使用它,则需要获取包含整个文件的Buffer。您可以使用fs.readFile()

如果是我,我会使用Base64编码的TransformStream。我还没有使用过这个,但请查看:https://www.npmjs.org/package/base64-stream另外,请查看Sharp NPM package。它在后台使用libvips,并且比GraphicsMagick快得多。安装过程并不是最简单的(至少在CentOS上),但它非常值得。