Javascript 我在HTML画布中显示URL中的图像时遇到问题
据我所知,我的代码与W3上的代码完全相同,只是我制作了一个新图像,而不是使用html中已有的图像,但我无法让它显示任何内容Javascript 我在HTML画布中显示URL中的图像时遇到问题,javascript,html,canvas,Javascript,Html,Canvas,据我所知,我的代码与W3上的代码完全相同,只是我制作了一个新图像,而不是使用html中已有的图像,但我无法让它显示任何内容 <body> <center><canvas id="myCanvas" width="1000" height="750"></canvas></center> <script> function newImage(src, width, height) { var i
<body>
<center><canvas id="myCanvas" width="1000" height="750"></canvas></center>
<script>
function newImage(src, width, height) {
var img = document.createElement("img");
img.src = src;
img.width = width;
img.height = height;
return img;
}
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
var i = newImage("http://i.imgur.com/ELsS4mN.jpg", 1000, 750);
ctx.drawImage(i,0,0);
</script>
函数newImage(src、宽度、高度){
var img=document.createElement(“img”);
img.src=src;
img.width=宽度;
img.height=高度;
返回img;
}
var c=document.getElementById(“myCanvas”);
var ctx=c.getContext(“2d”);
变量i=newImage(“http://i.imgur.com/ELsS4mN.jpg", 1000, 750);
ctx.drawImage(i,0,0);
出现此问题是因为您在图像对象完全下载之前返回了它。因为画布无法将图像数据渲染为背景图像 只有在图像数据完全可用时,才应使用
onload
回调函数和drawImage
。这应该起作用:
function newImage(src, width, height, callback) {
var img = new Image();
img.width = width;
img.height = height;
img.onload = function () {
callback(img);
};
img.src = src;
}
var c = document.getElementById("myCanvas"),
ctx = c.getContext("2d");
newImage("http://i.imgur.com/ELsS4mN.jpg", 1000, 750, function(image) {
ctx.drawImage(image, 0, 0);
});
请注意,不是从newImage
函数返回图像,而是在其中传递回调函数,并在下载完成后调用它
函数newImage(src、宽度、高度、回调){
var img=新图像();
img.width=宽度;
img.height=高度;
img.onload=函数(){
回拨(img);
};
img.src=src;
}
var c=document.getElementById(“myCanvas”),
ctx=c.getContext(“2d”);
新图像(“http://i.imgur.com/ELsS4mN.jpg“,1000,750,功能(图像){
ctx.drawImage(图像,0,0);
});代码>
看起来很奇怪,谢谢你知道我用chrome从本地html文件运行它时为什么会显示空白页吗?因为你的浏览器正在阻止它。。可能在请求上有“允许同源安全性”标记。使用Web Inspector(通常为F12),转到控制台日志并调用newImage方法(使用控制台中的中间窗口)以验证原因。。您可以通过关闭浏览器并使用特定参数(命令)打开应用程序来关闭这些浏览器安全措施。。。确保所有浏览器实例(包括任务管理器中的隐藏窗口)都已关闭。不,这不是安全性。这是个时间问题,因为在画布上渲染图像时还不可用。好吧,这完全有道理,您的代码解决了这个问题。我想知道是不是因为这是一张相当大的照片。谢谢你的帮助,是因为图像相当大。如果它解决了你的问题,考虑接受答案来结束这个问题。