我无法弄清楚为什么这不起作用。我在画布上绘制图像,使用getImageData,操纵像素,然后存储该像素数组以供日后使用。当我准备好稍后绘制这些像素时,我在另一个尺寸相同的画布上使用createImageData,将生成的ImageData对象的data属性设置为我保存的像素数组,然后调用putImageData。结果:保存的数组数据未分配给ImageData对象。以下是测试页面的代码:
<!DOCTYPE html>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en-US' lang='en-US'>
<head>
<meta http-equiv='content-type' content='text/html;charset=UTF-8' />
<link rel="stylesheet" type="text/css" href="styles.css" media="screen" />
<script type='text/javascript' src='http://code.jquery.com/jquery-1.4.2.min.js'></script>
<title>Audio Browser</title>
</head>
<body>
<script type='text/javascript'>
$(document).ready(function()
{
var copy = document.createElement('canvas');
var viewer = $('#viewer')[0];
var output = $('#output')[0];
var ctx = viewer.getContext('2d');
var outputContext = output.getContext('2d');
var img = $('#input')[0];
var imageData;
var songs = [];
output.width = copy.width = img.width;
output.height = copy.height = img.height;
copy.getContext('2d').drawImage(img, 0, 0);
viewer.width = 1500;
viewer.height = 800;
originalData = copy.getContext('2d').getImageData(0, 0, copy.width, copy.height);
imageData = originalData.data;
for(var i = 3; i < imageData.length; i+=4)
{
var row = Math.floor(i / copy.width / 4);
imageData[i] *= 1-((copy.height - row)/copy.height*2);
}
songs.push({'fadeImg' : imageData});
draw();
function draw()
{
originalData = copy.getContext('2d').createImageData(copy.width, copy.height);
originalData.data = songs[0].fadeImg;
outputContext.putImageData(originalData, 0, 0);
}
});
</script>
<img id='input' src='albumArt/small.png' />
<canvas id='output'></canvas>
<br />
<canvas id='viewer'></canvas>
</body>
</html>
编辑:
我在新的IE9测试版中尝试这个时发现了一些有趣的东西。在IE中,我收到以下错误:SCRIPT65535: Invalid set operation on read-only property
originalData.data = songs[0].fadeImg;
我之前检查过firefox并且错误控制台中没有错误。也许firefox只是默默地失败了。如果是这种情况,我怎样才能将数据复制回来而不会造成非常浪费的循环?
答案 0 :(得分:0)
我最近也遇到了这个问题。
不幸的是,似乎直接分配数据是不可能的,因为它是Uint8ClampedArray。
根据Kronos.com:
它的行为与其他类型的数组视图完全相同,只是setter和构造函数在转换传入的数值时使用clamp [WEBIDL]而不是模运算。
所以循环是要走的路...... 这应该做:
for (var i in songs[0].fadeImg){
originalData.data[i] = songs[0].fadeImg[i];
}
这非常不方便,但这是我找到的唯一方法。