postMessage ArrayBuffer来自JavaScript的本机客户端模块

时间:2014-02-05 06:44:43

标签: javascript google-nativeclient

我想将HTML画布的图像发送到Google Chrome上的NaCl模块。 在“dom方面”,我有以下代码:

var NaClModule = .... // NaCl module denoted by <embed> tag
var canvas = .... // canvas element
canvas.addEventListener('click', function() {
    var imageData = this.getContext('2d').getImageData(0, 0, this.width, this.height);
    NaClModule.postMessage(imageData.data);
});

imageData.data在JavaScript控制台上的类型为Uint8ClampedArray。 所以我认为NaCl模块看到传递数据为pp::VarArrayBuffer

然而,NaCl模块实际上将数据作为pp::VarDictionary传递 with key =原始数组的索引和值=原始数组的值 (由pp::Var::DebugString确认。)

这是预期的行为吗? 如果没有,我的代码是什么?

或者,还有其他方法可以将图像传递给NaCl模块吗?

1 个答案:

答案 0 :(得分:5)

在地球示例中将画布传递到NaCl模块以从jpeg加载纹理(请参阅SDK中的examples / demo / earth)。

以下是该示例的摘录:

var imageData = context.getImageData(0, 0, img.width, img.height);
// Send NaCl module the raw image data obtained from canvas.
common.naclModule.postMessage({'message' : 'texture',
                               'name' : name,
                               'width' : img.width,
                               'height' : img.height,
                               'data' : imageData.data.buffer});

所以看起来你只需要将代码更改为:

NaClModule.postMessage(imageData.data.buffer);

它应该有用。