【实例】使用canvas缓缓加载一个图片到web页面中

由于要做web前端设计,用到这个效果,弄了一个晚上,总算是弄出来了

效果

从上到下缓缓载入一个图片

思路

  1. 获取一个空白canvas,使用drawImage方法画出整个图像
  2. 获取这个图像中的每一行的数据
  3. 清除这个canvas,之后在缓缓把刚刚获取到的数据写回去
  4. (如果可以直接获取image对象的数据直接写到canvas就好了)

实现

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<link rel="stylesheet" type="text/css" href="css/basic.css"/>
	</head>
	<body>
		<img src="img/people.png" style="display: none;" id="test"/>
		<div id="mainPanel">
			<canvas id="marker_box" width="1200px" height="700px"></canvas>
		</div>
	</body>
<script type="text/javascript">
		//用于计算当前写入行
var count = 0;
//用于存储所有数据的全局变量,我本想传这个参过去,但是不懂怎么回事,总是不成功,干脆弄成全局变量好了
var frameAll = null;	

window.onload = function () {
	var marker_box = document.getElementById("marker_box");
	var context = marker_box.getContext("2d");
	//创建一个image对象
	var myImage = new Image();
	myImage.src = "img/people.png";
	//把那个image对象画在context上,我在这里就不写那些参数是什么了,百度一下就有
	context.drawImage(myImage, 0, 0);
	getImageData();
	//清除context上的数据
	context.clearRect(0, 0, marker_box.width, marker_box.height);
	showImage()
};
function getImageData () {
	var marker_box = document.getElementById("marker_box");
	var context = marker_box.getContext("2d");
	frameAll = new Array();
	
	//这个for是逐行的获取图像数据,之后依次放入frameAll中
	for(var i = 0; i < marker_box.height; i++) {
		var myFrame = context.getImageData(0, i, marker_box.width, 1);
		frameAll.push(myFrame);
	}
}

function showImage() {
	var marker_box = document.getElementById("marker_box");
	var context = marker_box.getContext("2d");
	//写入当前行的图像数据
	context.putImageData(frameAll[count], 0, count, 0, 0, marker_box.width, 1);
	//准备写下一行了
	count++;
	if(count >= marker_box.height) {
		//当写入完成的时候结束showImage方法
		return;
	} else {
		//还需要继续写入图像数据,使用setTimeout实现以最快速度显示数据
		//在这里可以使用worker对线程性能进行优化,不过本文不是写这个的,况且我现在好饿了,就不弄了
		setTimeout("showImage()", 0);
	}
}

</script>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值