2

我有一个 Web 服务,它接受一个表示图像的 base 64 编码字符串,使用 imagemagick 库创建该图像的缩略图,然后将它们都存储在 mongodb 中。我正在使用以下代码(大约)执行此操作:

var buf = new Buffer(req.body.data, "base64"); //original image

im.resize({ srcData: buf, width: 256 }, function(err, stdout, stderr) {
    this.thumbnail = new Buffer(stdout, "binary");
    //store buf and stdout in mongo
});

您会注意到我正在使用“二进制”编码创建一个 Buffer 对象,文档说不要这样做:

'binary' - 一种仅使用每个字符的前 8 位将原始二进制数据编码为字符串的方法。这种编码方法已被弃用,应尽可能避免使用 Buffer 对象。此编码将在 Node.js 的未来版本中删除。

首先,我不确定他们在说什么。我正在尝试创建一个 Buffer 对象,他们似乎暗示我应该已经有了一个。

其次,问题的根源似乎是 imagemagick resize 方法返回了一个包含二进制数据的字符串。执行 typedef(stdout) return "string" 并将其打印到屏幕上肯定会显示一堆非字符数据。

那么我在这里做什么呢?我无法改变 imagemagick 的工作方式。还有另一种方法可以做我想做的事情吗?

4

2 回答 2

2

这就是我如何成功地做同样的事情,将图像存储在 mongodb 中。

//original ---> base64
var thumbnail = new Buffer(req.body.data).toString('base64');
//you can store this string value in a mongoose model property, and save to mongodb

//base64 ---> image
var buffer = new Buffer(thumbnail, "base64");

我不确定将图像存储为 base64 是否是最好的方法

于 2012-11-12T13:44:58.533 回答
0

请尝试此操作,因为您的 base64 可能未预先处理:

var imgRawData =
    req.body.images[0].replace(/^data:image\/png;base64,|^data:image\/jpeg;base64,|^data:image\/jpg;base64,|^data:image\/bmp;base64,/, "");

var yourBuffer = new Buffer(imgRawData, "base64");

然后,将 yourBuffer 保存到 MongoDB 缓冲区中。

于 2013-08-24T00:20:29.320 回答