首先,我知道有实现这一点的标准方法(readAsDataURL 和 drawImage),但不幸的是,它们不适用于这个特定的用例。
我正在使用 filereader API 作为数组缓冲区读取图像,如下所示:
var reader = new fileReader();
reader.onload = function(e){
var byteArray = new Uint8ClampedArray(e.target.result);
//do stuff to this array
}
reader.readAsArrayBuffer(file);
然后我用这个返回的数据创建一个clampedarray。
我现在想要做的就是将这个像素数组直接绘制到画布上putImageData
目前我正在做以下事情:
var byteArray = new Uint8ClampedArray(e.target.result);
var imgdata = ctx.createImageData(img.width, img.height);
var canvdata = imgdata.data;
for (var i = 0; i < canvdata.length; i += 4) {
canvdata[i] = byteArray[i];
canvdata[i + 1] = byteArray[i + 1];
canvdata[i + 2] = byteArray[i + 2];
canvdata[i + 3] = byteArray[i + 3];
}
ctx.putImageData(imgdata, 0, 0);
使用这种方法,虽然数据被绘制到画布上,但它看起来像乱码的雪花或噪点,并不是图像的正确表示。
这使我相信我在循环中错误地构造了 imagedata 数据,或者我获取像素数组的初始方法可能不正确。
总而言之,我希望能够获取通过 html5 fileReader API 检索到的数组缓冲区(jpeg),然后创建一个与画布兼容的 imageData 数组,以便以后可以使用putImageData
提前致谢。