为imageData分配一个缓冲区位置.数据,而不是用循环赋值
Assign a buffer location to imageData.data instead of assigning values with loop
我使用emscripten在c++中创建位图,并将其传递给我的javascript代码
const int COMP = 4;
long createBitmap(int DIM)
{
srand(NULL);
// create buffer
long buffer = EM_ASM_INT(
{
var buffer = Module._malloc($0 * 1);
return buffer;
}, DIM*DIM*COMP);
uint8_t* bitmap = (uint8_t*)buffer;
//just randomly fill the buffer
for (int i = 0; i < DIM*DIM*COMP; i++)
{
if (i%4==3)
bitmap[i] = 128;
else
bitmap[i] = rand()%256;
}
return buffer;
}
和在javascript我有以下代码:
var dim = 1080;
var buffer = Module.createBitmap(dim);
var c = document.getElementById("bitmap");
var ctx = c.getContext("2d");
var imgData = ctx.createImageData(dim,dim);
for (var i = 0; i < dim*dim*4; i++) {
imgData.data[i] = Module.HEAPU8[buffer+i];
}
ctx.putImageData(imgData, 0, 0)
这工作得很好,但我不喜欢循环将缓冲区的所有元素分配给imgData.data
数组。我知道我在c++中使用的uint8_t
数据类型对应于imgData.data
的Uint8ClampedArray
。对我来说,这似乎是一个很好的机会,只是分配缓冲区的开始到这个imgData.data
,我不需要复制任何东西-这是可能的吗?
我从emscripten google组得到了这个答案。
答案其实很简单。
var mappedBuffer= new Uint8ClampedArray(Module.HEAPU8.buffer, buffer, dim * dim * 4)
所以HEAPU8.buffer
访问底层缓冲区,我可以创建一个Uint8ClampedArray
类型的数组。
那么你可以直接写
imgData.data.set(mappedBuffer)
ctx.putImageData(imgData, 0, 0)
相关文章:
- Javascript变量赋值|
- 无法为打字稿字典赋值
- Javascript-根据赋值顺序,按键合并对象数组
- Javascript:应为赋值或函数调用,但实际看到的却是表达式
- 如何通过json对象数组为嵌套对象赋值
- 赋值后的回调函数
- ||(OR)运算符如何在赋值中工作
- 可以使用属性赋值实现多个函数
- 使用jQuery获取第N个元素的数据属性值
- 将ECMAScript 6析构函数赋值(ES2015)重构为旧版本的javascript
- 如何在javascript中为全局变量赋值
- Javascript:JSHint:应为赋值或函数调用,但实际看到的却是表达式
- 如何在不赋值数组变量的情况下读取数组数据
- 如何将javascript变量赋值给amcharts数据加载器
- 为imageData分配一个缓冲区位置.数据,而不是用循环赋值
- Do赋值操作总是从右向左复制数据
- 在AngularJS中,不能将JSON响应数据赋值给$scope变量
- 从txt文件中读取数据并赋值给不同的变量
- 内联 jquery 数据赋值
- 如何在使用之前将初始数据赋值给文字对象中的一些变量