[英]getImageData() on Canvas return only 0 in all fields
要将PNG转换为原始数据,我将其放在画布上,然后请求图像数据。 但是,当我请求数据时,它仅包含零。 但是,如果我使用.fillRect
绘制,它将返回绘制的矩形的颜色。 好像插入的图像在.getImageData
的眼中并不是真的存在。 我尝试在调用.getImageData
设置超时,但是它仍然无法返回正确的数据,因此我认为这不是竞争条件。
这是针对Chrome插件的,因此跨平台不是问题。 我还尝试过为Canvas启用/禁用硬件加速。
相关代码如下:
var item = JQuery("<div style=\"width: 100%; border: 1px solid #b3b2b2; background: #c9c8c8; cursor: pointer; text-align: center;\"><h3 style=\"color: #8b8b8b; font-size: 15px; font-weight: 400;\">Import</h3></div>");
var imagebuffercont = JQuery("<canvas width=512 height=512 style=\"position: fixed; top: 25px; left: 25px; z-index: 9999;\"></canvas>").appendTo("body")[0].getContext("2d");
var uploader = JQuery("<input type= \"file\" style=\"display:none\" />");
uploader.change(function(){
if (this.files && this.files[0]) {
var reader = new FileReader();
reader.onload = function (e) {
var tmpelem = $('<img />');
tmpelem.attr('src', e.target.result);
imagebuffercont.drawImage(tmpelem[0], 0, 0);
var imgbuffer = imagebuffercont.getImageData(0,0,512,512).data;
var pixels = [];
for (var j = 0; j<512; j++) {
var tmprow = [];
for (var i = 0; i<512*4; i += 4) {
tmprow.push({
red: imgbuffer[i],
green: imgbuffer[i+1],
blue: imgbuffer[i+2],
alpha: imgbuffer[i+3]
});
}
pixels.push(tmprow);
}
console.log(pixels);
}
reader.readAsDataURL(this.files[0]);
}
});
创建映像时,应使用onLoad事件继续处理它。 否则,当您将图像放在画布上时,图像将无法就绪。 您还应该在onLoad事件回调中包含drawImage
。 否则,将把空白图片放在画布上。
您应该将代码修改为如下所示:
var tmpelem = $('<img />');
tmpelem.on('load', function(){ /* Do all canvas stuff here*/ });
tmpelem.attr('src', e.target.result);
在画布上绘制图像后(不进入该区域)。 做就是了
var img = imagebuffercont.toDataURL("image/png");
变量img包含原始数据。
如有任何疑问,请发表评论。
我不小心误读了数据。
for (var i = 0; i<512*4; i += 4) {
应该是for (var i = j*512*4; i<(j+1)*512*4; i += 4) {
否则它会不断迭代前512个像素,而恰好是透明的...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.