我一直在学习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的画布图像加载异步?相关推荐

  1. php+js实现异步图片上传,JavaScript实现异步图像上传功能

    当向服务器上传图像时,根据服务器操作的复杂性和服务器性能,需要几秒钟到几分钟的时间来完成.本文的重点是在图像上传至服务器时使用JavaScript立即显示图像. 介绍 当使用JavaScript将图像 ...

  2. java模块化按需加载,JavaScript模块化之使用requireJS按需加载

    模块加载器的概念可能稍微接触过前端开发的童鞋都不会陌生,通过模块加载器可以有效的解决这些问题: JS文件的依赖关系. 通过异步加载优化script标签引起的阻塞问题 可以简单的以文件为单位将功能模块化 ...

  3. html5语法参考图片,仿AS语法来写HTML5—第1章,显示一张图片

    最近开始学习html5,因为一直都是研究as,所以还是觉得as顺眼一点,但是html5也不能不学,于是就想出了,可以把html5用as的语法来写出来,做游戏应该来的比较顺手一些,下面开始第一篇 第一篇 ...

  4. html5照片浏览,实践html5实例–简单图片浏览器

    使用canvas来进行绘画,它像很多其他dom对象一样,有很多属性和方法,操作这些方法,实现绘画 获取canvas对象,调用document.getElementById()方法 调用canvas对象 ...

  5. HTML5点击图片查看大图,科技常识:HTML5 实现图片预览和查看原图

    今天小编跟大家讲解下有关HTML5 实现图片预览和查看原图 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了有关HTML5 实现图片预览和查看原图 的相关资料,希望小伙伴们看了有所帮助. htm ...

  6. android开发图片格式,Android程序开发如何处理图像格式类及图像转换

    在Android程序开发过程中,明确哪些图像格式类(ImageFormat.PixelFormat及BitmapConfig等)及图像(JPG.PNG及BMP等)的转换方式非常重要,在以后的程序开发过 ...

  7. VUE项目中图片加载过大处理方式-渐进式方式-懒加载方式--附源码

    解决有两步: 1.采用渐进式加载:原图未加载完时显示比它内存小的模糊图: 2.采用懒加载:只加载可视区域的图片,即滚动到可视区域时再加载图片 vue-lazyload-img:VUE图片懒加载插件 v ...

  8. html5字体em,html5字体设置图片生成QQ签名字体样式

    特效描述:html5字体设置 图片生成 QQ签名字体.html5 canvas字体设置生成图片字体样式,QQ签名字体样式,进击のXX生成器支持字数无限. 代码结构 1. HTML代码 内容: 文字背景 ...

  9. android调用h5预加载图片,使用HTML5的页面资源预加载(Link prefetch)功能加速你的页面加载速度...

    不管是浏览器的开发者还是普通web应用的开发者,他们都在做一个共同的努力:让Web浏览有更快的速度感觉.有很多已知的技术都可以让你的网站速度变得更快:使用CSS sprites,使用图片优化工具,使用 ...

最新文章

  1. 通过document.domain实现跨域访问
  2. 0.数据结构学习笔记大纲
  3. asn1学习笔记 约束
  4. python代码实现鸡尾酒排序(双向冒泡排序)
  5. P2924 [USACO08DEC]大栅栏Largest Fence
  6. 历届试题 核桃的数量
  7. jq 地区(省市县区)联动菜单
  8. CCF202109-1 数组推导(100分)【序列处理】
  9. kylin版本_Kylin配置Spark并构建Cube
  10. mysql基础8-运算符、函数、索引
  11. 民宿营销方案,解决民宿运营三大痛点
  12. c语言temp=p1,求助单片机C语言大神!!!uchar temp; temp=0; P1=temp;temp++;这怎么理解?...
  13. 通过阅读饥荒代码理解树人机制
  14. JavaScript中0.1+0.2问题
  15. 基于JAVA第二课堂选课系统计算机毕业设计源码+系统+lw文档+部署
  16. 4K视频剪辑、特效合成、调色完美硬件配置方案2018
  17. Java-Web总结03
  18. dos攻击与ddos攻击的区别
  19. es 集群 number_of_shards、number_of_replicas
  20. 智能座舱开启「万物交互」新革命,隐形冠军们如何突围?

热门文章

  1. BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+分块)
  2. java epoll select_春招|Java开发实习面经(口头offer),感谢快手给我这个双非一次机会!...
  3. 性能测试方案_MeterSphere案例分享丨基于JMeter的性能测试方案演进之路
  4. jsp将数字转换为价格并求和_在JSP页面怎么实现求和操作和百分比操作
  5. tftp服务器_Transfer for Mac(TFTP服务器)
  6. python 统计组合用什么库_Python数据科学,用这些库就够了
  7. 【Android】SDDL刷机
  8. 2018-01-17 Antlr4实现简单语言之整数比较表达式
  9. eclipse 安装tomcat
  10. asp.net等项目编译失败的原因之不能写入