2012-11-11 94 views
2

我有一个Web服务,它需要一个代表图像的基本64位编码字符串,使用imagemagick库创建该图像的缩略图,然后将它们存储在mongodb中。将二进制字符串转换为Node.js中的缓冲区

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 
}); 

你会发现,我创建使用“二进制”编码一个缓冲区对象,其中docs说不要做:

我用下面的代码(约)这样做'binary' - 通过使用 仅将每个字符的前8位编码为原始二进制数据的方式。此编码方法不推荐使用 ,应避免使用Buffer对象,其中 可能。此编码将在未来版本的Node中删除。

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

其次,问题的根源似乎是imagemagick resize方法返回一个包含二进制数据的字符串。做typedef(标准输出)返回“字符串”并打印出来的屏幕上肯定会显示一堆非字符数据。

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

回答

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是做

+0

在我的情况下,将它们作为base64字符串来讲故事仍然不起作用,因为imagemagick库不会以这种方式返回它们。它似乎是一个实际上包含非字符字节的字符串。我想,我不太确定。我想我会遏制那个图书馆的所有者,并问他们发生了什么事情。 – d512

+0

嗯......但是,你甚至尝试过我建议的方法吗?我想image magick应该将它作为二进制数据返回,对吗?在这种情况下,将此二进制数据转换为base64表示形式并从** base64中检索convert **时仍然有效。 – renatoargh

+1

我现在编码,为您发布一个工作示例! :) – renatoargh

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缓冲区。

相关问题