HTML5 canvas getImageData()执行失败
HTML5 canvas getImageData() failed to execute
当我使用getImageData()函数来获取chrome图像的数据时,它说Uncaught IndexSizeError:未能在'CanvasRenderingContext2D'上执行'getImageData':源宽度为0。下面是我的代码:
<!DOCTYPE html>
<html>
<head>
<title>canvastest</title>
</head>
<body>
<img src="flower.jpg" hidden />
<canvas id="drawing" width="600" height="532">a drawing of something</canvas>
<script type="text/javascript" >
var drawing = document.getElementById("drawing");
if (drawing.getContext){
var context = drawing.getContext("2d"),
image = document.images[0],
imageData,data,
i,len,average,
red,blue,green,alpha;
image.onload = function(){
context.drawImage(image,0,0);
};
imageData = context.getImageData(0,0,image.width,image.height);
data = imageData.data;
for (i=0,len=data.length;i<len;i+=4){
red = data[i];
green = data[i+1];
blue = data[i+2];
alpha = data[i+3];
average = Math.floor((red + green + blue) / 3);
data[i] = average;
data[i+1] = average;
data[i+2] = average;
}
imageData.data = data;
context.putImageData(imageData,0,0);
}
</script>
</body>
</html>
怎么会这样呢?如何解决这个问题?
您正在附加一个onload
回调来实际绘制图像到画布。但是,只有当图像加载到DOM中并且必须从服务器获取图像时,才会触发此函数。在您尝试从画布中提取图像数据之前,是什么让您认为会发生这些事情呢?
这是混合同步和异步代码时的问题,有许多技术可以解决这个问题。但我敢打赌,如果您在调试器中设置一个断点,在绘制图像的行和试图读取图像的行,后者将在前者之前触发。
您要么需要将处理放在onload
处理程序中(由于耦合不推荐),要么使用类似承诺的东西来确保读取数据的代码在写入数据的代码之后运行。
如果不小心将0
传递给width
或height
参数,也会出现该错误消息:
context.getImageData(0, 0, 0, 0); //Throws an IndexSizeError
无论这是由于打字错误还是一个坏变量,将0传递给第三或第四个参数总是会导致错误消息"源宽度是0."或"源高度为0。"
因此,与其这样做,你应该直接引用画布的宽度/高度:
context.getImageData(0, 0, context.canvas.clientWidth, context.canvas.clientHeight);
或者添加一个条件来检查以确保两个值都不是false:
if (my_width && my_height)
{
context.getImageData(0, 0, my_width, my_height);
}
else
{
alert('Invalid canvas width or height value!');
}
相关文章:
- JS:执行'失败;getComputedStyle'在'窗口':参数的类型不是'
- indexedDB创建数据库并添加内容执行失败'交易'在'IDBDatabase'
- AJAX 请求不会在 400 个错误查询上执行失败
- 在 gruntjs 构建失败的情况下强制执行某些任务
- 执行Haxe代码时Ant构建失败
- 用C#在Win 8.1 Chakra中执行JS的一个失败的最小例子
- 画布到图像执行失败'toDataURL'在'HTMLCanvasElement':受污染
- MongoDB:javascript执行失败:can't将DBQuery对象保存在src/mongo/shell
- HTML5 canvas getImageData()执行失败
- 未捕获类型错误:执行失败'readAsBinaryString'on 'FileReader
- PHP包含文件执行失败
- 未捕获的类型错误:执行失败'on 'FileReader':参数1不是'Blob'
- AWS Lambda和DynamoDB流.如果执行失败怎么办?下次尝试处理相同的记录吗?
- update'执行失败on 'ApplicationCache':没有应用程序缓存要更新
- $(window).load(function())在完全加载文档后执行失败
- Two.JS: '执行失败'removecchild '& # 39;节点# 39;当试图删除从
- Javascript执行失败
- 未捕获的类型错误:执行失败'importStylesheet'on 'XSLTProcessor
- 执行失败'send'on ' rtcdatachchannel 'readyState不
- Ajax请求执行失败,显示错误消息