代码如下:
<!doctype html>
<html>
<body id="body">
<img id="pic">
<script src="./b.js"></script>
</body>
</html>
其中, b.js 内代码如下:
var c,ctx,p1,p2,b;
c=document.createElement("canvas");
p1=document.createElement("img");
p2=document.getElementById("pic");
b=document.getElementById("body");
b.appendChild(p1);
p1.src="./a.jpg";
p1.onload=function() {
try{
c.width=p1.width;
c.height=p1.height;
ctx=c.getContext("2d");
b.appendChild(c);
ctx.drawImage(p1,0,0);
alert("Fine 2.");
while(p2==null)alert("Error.");
alert("Fine 3.");
p2.src=c.toDataURL("image/png");
alert("Fine.");
} catch (e) {
alert(""+e);
}
}
在此文件夹下,还有一个 jpg 文件。
代码报错,报错信息如下:
SecurityError: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.
我想利用浏览器将 jpg 转 png ,请问报错如何解决?
报错信息 "SecurityError: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported." 意味着你的脚本尝试将一个受限制的画布(tainted canvas)导出为数据URL,但这是被浏览器安全策略禁止的。
这种情况通常发生在以下情况下:
浏览器实施了同源策略(same-origin policy),这意味着当画布绘制了来自其他域的图像时,它被认为是受限制的(tainted),从而限制了对导出为数据URL的访问。
要解决这个问题,你可以尝试以下方法:
确保图像来源与你的脚本在同一个域名下。将图像上传到与你的网页相同的域名,然后从该域名加载图像。这样就避免了跨域限制,画布就不会被标记为受限制的了。
如果你正在本地开发并且使用了 file:// 协议,尝试将你的文件部署到一个本地服务器(例如使用 Node.js 或者 Python 的简单 HTTP 服务器),并通过服务器访问你的网页。这样使用 HTTP 协议加载图像,就不会受到同源策略的限制。
请注意,如果你在使用第三方图像并无法更改其来源或部署到服务器上,那么无法直接通过 JavaScript 在浏览器中进行转换。在这种情况下,你可能需要考虑使用服务器端的图像处理工具来完成转换操作。
希望这些解决方案能帮助你解决问题!如果还有其他疑问,请随时提问。
p2.crossOrigin = "Anonymous"; // 加这句试试