我正在尝试压缩图片,将其转换为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...
,我不确定那是什么。
答案 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上),但它非常值得。