我正在学习如何使用HTML5 canvas元素。我成功地绘制了矩形,调用getImageData
,操纵像素,然后putImageData
看到矩形改变了颜色等。
现在我正在尝试将图像加载到画布中我遇到了麻烦。在画布的上下文中调用drawImage
之后,fillRect
仅绘制没有绘制图像的区域,就像在图像后面绘制矩形一样,即使它在{{1}之后调用}。此外,drawImage
停止工作,即使在包含矩形的可见区域,我的像素操作也不再发生。如果我用putImageData
注释掉该行,它会再次起作用。
我希望能够像处理矩形一样操纵图像中的像素。有什么理由不行吗?
绘制图像代码:
drawImage
绘制矩形代码:
var img = new Image();
img.onload = function () {
//comment out the following line, everything works, but no image on canvas
//if it's left in, the image sits over the rectangles, and the pixel
//manipulation does not occur
context.drawImage(img, 0, 0, width / 2, height / 2);
}
img.src = path;
Maniuplate像素代码:
for (var i = 0; i < amount; i++)
{
x = random(width - size);
y = random(height - size);
context.fillStyle = randomColor();
context.fillRect(x, y, size, size);
}
答案 0 :(得分:2)
您发布的代码没有什么特别错误。给我们整个代码或考虑以下内容:
randomColor()
使颜色过于透明而无法看到?很可能是我列表中的最后一项或倒数第二项让你感到悲伤。
尝试在您自己的服务器上托管图像并查看它是否消失,或者查看Firefox中的Web控制台以查看它是否在抱怨安全性错误。
或者只是在Chrome / IE9中打开网络控制台,看看绘制图像时是否真的遇到了绘图代码
答案 1 :(得分:0)
origin-clean = false
。当我在绘制图像后尝试在上下文中调用getImageData
时,这会导致安全异常(NS_ERROR_DOM_SECURITY_ERR 1000)。
解决方案1是在Web服务器上托管文件。
解决方案2有点像黑客,但它对我的目的来说很好:
try {
try {
var imgd = context.getImageData(0, 0, width, height);
} catch (e) {
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
var imgd = context.getImageData(0, 0, width, height);
}
} catch (e) {throw new Error("unable to access image data: " + e)}
如果抛出安全异常,浏览器将提示用户允许覆盖。