我想将 HTML Canvas 的图像发送到 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
其中 key = 原始数组的索引,value = 原始数组的值
(由 pp::Var::DebugString
确认)。
这是预期的行为吗? 如果不是,我的代码有什么问题?
或者,还有其他方法将图像传递给 NaCl 模块吗?
最佳答案
在 Earth 示例中将 Canvas 传递给 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);
它应该可以工作。
关于javascript - 从 JavaScript postMessage ArrayBuffer 到 native 客户端模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21570352/