html5实例异步图片加载,javascript – 你如何处理html5的画布图像加载异步?
我一直在学习html5的画布.因为图像可能需要一段时间才能加载,所以适当的技术似乎是在尝试绘制图像之前使用onload来等待图像加载.所以:
var fig = document.getElementById('fig1');
var ctx = fig.getContext('2d');
var img = new Image();
img.onload = function() { ctx.drawImage(img, 300, 100); };
img.src = 'data:image/gif;base64,R0lGODlhCwALAIAAAAAA3pn/ZiH5BAEAAAEALAAAAAALAAsAAAIUhA+hkcuO4lmNVindo7qyrIXiGBYAOw==';
但是,在onload函数执行drawImage()之前,可能会执行此后的代码,可能会导致意外行为:
ctx.translate(0,400); ctx.scale(1,-1); /* switch to lower-left as origin */
/* if onl oad happens after here, it uses new coordinate system! */
ctx.beginPath();
ctx.moveTo(10, 20);
ctx.lineTo(290, 30);
ctx.stroke();
当然有一些明智的方法来解决这个问题(并且在onload函数中做所有事情似乎都不合理).
==========================编辑以下====================== ==
以下是对我的代码的更改,使用单一承诺尽可能简单地说明这个想法.
var img = new Image();
var promise = new Promise( // make a promise
function(resolve, reject) {
img.onload = function() {
ctx.drawImage(img, 300, 100);
resolve(); // keep the promise -- lets the "then" proceed
};
img.src = 'data:image/gif;base64,R0lGODlhCwALAIAAAAAA3pn/ZiH5BAEAAAEALAAAAAALAAsAAAIUhA+hkcuO4lmNVindo7qyrIXiGBYAOw==';
}
);
// .then() waits for the promise to be resolved (see also .catch for rejection)
promise.then( function() {
ctx.translate(0,400); ctx.scale(1,-1);
ctx.beginPath();
ctx.moveTo(10, 20);
ctx.lineTo(290, 30);
ctx.stroke();
});
解决方法:
在使用画布之前预加载图像.将所有图像URL放入一个数组中,循环遍历数组创建新图像,当它们全部加载时,调用一个将启动画布工作的函数.
以下片段使用本机JS Promises,但如果支持没有本机Promise的旧浏览器,您可以以类似的方式使用Q或jQuery库
var images = ['imageurl.jpg','imageurl2.jpg','imageurl3.jpg'];
var loadedImages = {};
var promiseArray = images.map(function(imgurl){
var prom = new Promise(function(resolve,reject){
var img = new Image();
img.onload = function(){
loadedImages[imgurl] = img;
resolve();
};
img.src = imgurl;
});
return prom;
});
Promise.all(promiseArray).then(imagesLoaded);
function imagesLoaded(){
//start canvas work.
//when needing to draw image, access the loaded image in loadedImages
ctx.drawImage(loadedImages['imageurl.jpg'], 300, 100);
}
标签:javascript,html5,canvas,html5-canvas
来源: https://codeday.me/bug/20190930/1837207.html
html5实例异步图片加载,javascript – 你如何处理html5的画布图像加载异步?相关推荐
- php+js实现异步图片上传,JavaScript实现异步图像上传功能
当向服务器上传图像时,根据服务器操作的复杂性和服务器性能,需要几秒钟到几分钟的时间来完成.本文的重点是在图像上传至服务器时使用JavaScript立即显示图像. 介绍 当使用JavaScript将图像 ...
- java模块化按需加载,JavaScript模块化之使用requireJS按需加载
模块加载器的概念可能稍微接触过前端开发的童鞋都不会陌生,通过模块加载器可以有效的解决这些问题: JS文件的依赖关系. 通过异步加载优化script标签引起的阻塞问题 可以简单的以文件为单位将功能模块化 ...
- html5语法参考图片,仿AS语法来写HTML5—第1章,显示一张图片
最近开始学习html5,因为一直都是研究as,所以还是觉得as顺眼一点,但是html5也不能不学,于是就想出了,可以把html5用as的语法来写出来,做游戏应该来的比较顺手一些,下面开始第一篇 第一篇 ...
- html5照片浏览,实践html5实例–简单图片浏览器
使用canvas来进行绘画,它像很多其他dom对象一样,有很多属性和方法,操作这些方法,实现绘画 获取canvas对象,调用document.getElementById()方法 调用canvas对象 ...
- HTML5点击图片查看大图,科技常识:HTML5 实现图片预览和查看原图
今天小编跟大家讲解下有关HTML5 实现图片预览和查看原图 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了有关HTML5 实现图片预览和查看原图 的相关资料,希望小伙伴们看了有所帮助. htm ...
- android开发图片格式,Android程序开发如何处理图像格式类及图像转换
在Android程序开发过程中,明确哪些图像格式类(ImageFormat.PixelFormat及BitmapConfig等)及图像(JPG.PNG及BMP等)的转换方式非常重要,在以后的程序开发过 ...
- VUE项目中图片加载过大处理方式-渐进式方式-懒加载方式--附源码
解决有两步: 1.采用渐进式加载:原图未加载完时显示比它内存小的模糊图: 2.采用懒加载:只加载可视区域的图片,即滚动到可视区域时再加载图片 vue-lazyload-img:VUE图片懒加载插件 v ...
- html5字体em,html5字体设置图片生成QQ签名字体样式
特效描述:html5字体设置 图片生成 QQ签名字体.html5 canvas字体设置生成图片字体样式,QQ签名字体样式,进击のXX生成器支持字数无限. 代码结构 1. HTML代码 内容: 文字背景 ...
- android调用h5预加载图片,使用HTML5的页面资源预加载(Link prefetch)功能加速你的页面加载速度...
不管是浏览器的开发者还是普通web应用的开发者,他们都在做一个共同的努力:让Web浏览有更快的速度感觉.有很多已知的技术都可以让你的网站速度变得更快:使用CSS sprites,使用图片优化工具,使用 ...
最新文章
- 通过document.domain实现跨域访问
- 0.数据结构学习笔记大纲
- asn1学习笔记 约束
- python代码实现鸡尾酒排序(双向冒泡排序)
- P2924 [USACO08DEC]大栅栏Largest Fence
- 历届试题 核桃的数量
- jq 地区(省市县区)联动菜单
- CCF202109-1 数组推导(100分)【序列处理】
- kylin版本_Kylin配置Spark并构建Cube
- mysql基础8-运算符、函数、索引
- 民宿营销方案,解决民宿运营三大痛点
- c语言temp=p1,求助单片机C语言大神!!!uchar temp; temp=0; P1=temp;temp++;这怎么理解?...
- 通过阅读饥荒代码理解树人机制
- JavaScript中0.1+0.2问题
- 基于JAVA第二课堂选课系统计算机毕业设计源码+系统+lw文档+部署
- 4K视频剪辑、特效合成、调色完美硬件配置方案2018
- Java-Web总结03
- dos攻击与ddos攻击的区别
- es 集群 number_of_shards、number_of_replicas
- 智能座舱开启「万物交互」新革命,隐形冠军们如何突围?
热门文章
- BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+分块)
- java epoll select_春招|Java开发实习面经(口头offer),感谢快手给我这个双非一次机会!...
- 性能测试方案_MeterSphere案例分享丨基于JMeter的性能测试方案演进之路
- jsp将数字转换为价格并求和_在JSP页面怎么实现求和操作和百分比操作
- tftp服务器_Transfer for Mac(TFTP服务器)
- python 统计组合用什么库_Python数据科学,用这些库就够了
- 【Android】SDDL刷机
- 2018-01-17 Antlr4实现简单语言之整数比较表达式
- eclipse 安装tomcat
- asp.net等项目编译失败的原因之不能写入