canvas动态绘制图片的方法

应用场景

在制作html5小游戏时需要使用canvas绘制图片,但是图片是异步加载的,需要发送请求获取数据,这就导致不能在设置src之后直接使用绘制方法,而是需要等待图片加载完成。

加载单张图片

  1. 使用onload事件
    当图片加载完成后会触发onload事件,在事件处理函数中进行绘制
var img= new Image();
img.onload=function(){
ctx.drawImage(img,100,100,200,300);
}
img.src="test.jpg";
  1. 使用异步函数

通过使用异步执行的函数可以在主线程中的程序执行完之后才执行子线程中的程序,相当于onload

var img= new Image();
img.src="test.jpg";
setInterval(function(){
ctx.drawImage(img,100,100,200,300);
},100);
  1. 使用promise

imgPro = new Promise((resolve,reject) => {
	var img= new Image();
	img.src="test.jpg";
	img.onload = function (){
		resolve(img)
	}
	img.onerror = function  (e){
		reject(e);
	}
})
imgPro.then(img => {
	ctx.drawImage(img,100,100,200,300);
});

加载多张图片

  1. 通过自定义变量判断

在图片绘制时通过一个自定义变量判断图片是否已经加载完毕,如果加载完毕,就进行绘制,这种方法也是使用onload,但可以用于多张图片的绘制判断

var  paint =0;
var img= new Image();
img.onload=function(){
paint+=50;
if(paint===100){
ctx.drawImage(img2,100,100,200,300);
ctx.drawImage(img,100,100,200,300);
}
}
img.src="test.jpg";
var img2= new Image();
img2.onload=function(){
paint+=50;
if(paint===100){
ctx.drawImage(img2,100,100,200,300);
ctx.drawImage(img,100,100,200,300);
}
}
img2.src="testing.jpg";

这种方法不管是哪一张图片后加载都可以将两张图片都会绘制到页面上,并且图片的顺序可以根据自己的需要进行排列。

也可以使用promise加载多张图片


promise.all([new Promise((resolve,reject) => {
	let img = new Image();
	img.src = "test.jpg";
	img.onload = function (){
		resolve(img);
	}
	img.onerror = function(e){
		reject(e);
	}
}),new Promise((resolve,reject) => {
	let img = new Image();
	img.src = "testing.jpg";
	img.onload = function (){
		resolve(img);
	}
	img.onerror = function(e){
		reject(e);
	}
})]).then(imgs => {
ctx.drawImage(imgs[0,100,100,200,300);
ctx.drawImage(imgs[1],100,100,200,300);
})
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端御书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值