我指的是Link并在我当地尝试相同的内容。
然而,如果我更改任何宽度*高度的图像源,但是如果我准备Uint8Array然后渲染它,则无法加载(显示黑色图像),代码可以正常工作。
这是我的代码:
function renderImage (u8a) {
if(dataTypedArray != null) {
gl.clear(gl.COLOR_BUFFER_BIT || gl.DEPTH_BUFFER_BIT);
u8a = dataTypedArray;
image.width = tempImg.width;
image.height = tempImg.height;
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, image.width, image.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, u8a);
//Draw the rectangle.
gl.drawArrays(gl.TRIANGLES, 0, 6);
renderTexture();
}
}
其中dataTypedArray是我自己创建的Uint8Array。
主要是当我将图像数据添加到画布时,它工作正常,但是当我将画布添加到纹理时,它会失败。
var renderData = function (imageAttr) {
var data = imageAttr.data;
var LINES_PER_CHUNK = imageAttr.lines;
var alpha = 4;
if(imageAttr.newBag) {
newBuffer = new ArrayBuffer(imageAttr.width * imageAttr.height * alpha);
dataTypedArray = new Uint8Array(newBuffer);
} else {
for (var z = imageAttr.index; z > 0; z--) {
for (i = 0 ; i < LINES_PER_CHUNK; i++) {
for (j = 0 ; j < imageAttr.height; j++) {
dataTypedArray[i * alpha + imageAttr.width*alpha * j + 3 + LINES_PER_CHUNK * alpha * z] = dataTypedArray[i * alpha + imageAttr.width*alpha * j + 3 + LINES_PER_CHUNK * alpha * (z-1)];
}
}
}
}
for (i = 0, k = imageAttr.height*LINES_PER_CHUNK; i < LINES_PER_CHUNK; i++) {
for (j = 0 ; j < imageAttr.height; j++) {
dataTypedArray[i * alpha + imageAttr.width*4 * j + 3] = data[k - imageAttr.height + j];
}
k = k - imageAttr.height;
}
imageAttrTemp = imageAttr;
var can1 = document.getElementById('canvas1');
can1.width = imageAttr.width; can1.height = imageAttr.height;
var ctx = can1.getContext('2d');
var imageData = ctx.getImageData(0, 0, imageAttr.width, imageAttr.height);
for (i = 3 ; i < dataTypedArray.byteLength; i=i+4) {
imageData.data[i] = dataTypedArray[i];
}
ctx.putImageData(imageData, 0,0);
image.width=can1.width;
image.height = can1.height;
setupGLSL();
renderImageLineByLine(can1);
};
var proto = 'ws://';
if(location.protocol === 'https:'){
proto = 'wss://';
}
var ws = new WebSocket(proto + location.host + '/dashboard');
ws.binaryType = 'arraybuffer';
ws.onmessage = function(event) {
try {
var imageAttr = JSON.parse(event.data);
renderData(imageAttr);
} catch(E) {
console.log(E);
}
};
ws.onopen = function(event) {
console.log('Con opened');
};
ws.onerror = function(event){
console.log('Con error');
};