(转载) Chrome中canvas上drawImage无法画出image的解决办法
在自己写demo的过程中 碰到了这样一个问题 发现drawImage方法没有达到预期的效果 图片没办法显示 而fillRect等画图形的方法却工作良好
大概的代码如下:
 $(function() {
     var $my_canvas=$("#my_canvas");
     var my_canvas=$my_canvas[0];
     var context=my_canvas.getContext("2d");
     // var footprint_img=document.getElementById("footprint");
     var footprint_img=new Image();
     footprint_img.src="footprint.jpg";
     context.drawImage(footprint_img,10,10,20,20);
 });  
在和伙伴交流的情况下 发现在google help下也有人碰到了类似问题
http://www.google.com/support/forum/p/Chrome/thread?tid=29d98538241bc15f&hl=en
描述了该问题 发现同样的代码在FireFox下工作良好 但是Chrome却无法绘制 并且刷新也无用 不过 如果在地址栏敲一下回车 却可以看到绘制的图片 (震惊)
之后请教了几位大神 被告知是由于image加载是异步的 而我在image没有加载完毕时就调用了drawImage造成的(好吧 我刚接触前端 这些东西都不注意 大家别拍脸)
于是上网查了关于image预加载的一些方法 最后找到了一篇排版不错 说明也很好的文章(有的文章一看就转来的 也不写转帖 也不重新排版 代码就那么混乱着 完全不想看啊)
http://apps.hi.baidu.com/share/detail/24712354
别看是百度空间就不看。。觉得说得挺清楚的 特别对于我这样的新手
具体的原理 在上文中已经说了 概括下就是在确保图片加载的情况下再去做相关动作(这是废话,文中更循序渐进)
改进后的代码如下:
 $(function() {
     var $my_canvas=$("#my_canvas");
     var my_canvas=$my_canvas[0];
     var context=my_canvas.getContext("2d");
     // var footprint_img=document.getElementById("footprint");
     // var footprint_img=new Image();
     // footprint_img.src="footprint.jpg";
     preImage("footprint.jpg",function(){
         context.drawImage(this,10,10,20,20);
     });
 });  
 function preImage(url,callback){
      var img = new Image(); //创建一个Image对象,实现图片的预下载
      img.src = url;  
     if (img.complete) { // 如果图片已经存在于浏览器缓存,直接调用回调函数
          callback.call(img);
         return; // 直接返回,不用再处理onload事件
      }  
      img.onload = function () { //图片下载完毕时异步调用callback函数。
          callback.call(img);//将回调函数的this替换为Image对象
      };
 }  
转载:http://johncookie.iteye.com/blog/1289982
加载图片相关的文章:http://www.jb51.net/article/32761.htm
(转载) Chrome中canvas上drawImage无法画出image的解决办法的更多相关文章
- 转载 tomcat6下项目移植到tomcat7下出问题的解决办法
		
转载,原文地址 http://hw1287789687.iteye.com/blog/1817865 org.apache.catalina.core.ContainerBase addChildI ...
 - es6 Object.assign     ECMAScript 6 笔记(六)   ECMAScript 6 笔记(一)    react入门——慕课网笔记    jquery中动态新增的元素节点无法触发事件解决办法   响应式图像   弹窗细节   微信浏览器——返回操作  Float 的那些事    Flex布局   HTML5 data-* 自定义属性   参数传递的四种形式
		
es6 Object.assign 目录 一.基本用法 二.用途 1. 为对象添加属性 2. 为对象添加方法 3. 克隆对象 4. 合并多个对象 5. 为属性指定默认值 三.浏览器支持 ES6 O ...
 - Eclipse中js文件修改后浏览器不能及时更新的解决办法
		
项目中js文件修改后浏览器不能及时更新的解决办法 转载:http://www.codeweblog.com/%E9%A1%B9%E7%9B%AE%E4%B8%ADjs%E6%96%87%E4%BB%B ...
 - uploadify上传控件中文的乱码解决办法
		
uploadify上传控件中文的乱码解决办法 网站用的gb2312的编码,用uploadify上传控件上传中文时在IE能部分成功,FF,Chrome则完全失败,查找了一天原因,结果发现是页面编码问题, ...
 - Visual studio 2017中 Javascript对于Xrm对象模型没有智能提示的解决办法
		
Visual studio 2017中 Javascript对于Xrm对象模型没有智能提示的解决办法 先上个图.语法提示支持到 Microsoft Dynamics xRM API 8.2 也就是cr ...
 - Android中View类OnClickListener和DialogInterface类OnClickListener冲突解决办法
		
Android中View类OnClickListener和DialogInterface类OnClickListener冲突解决办法 如下面所示,同时导入这两个,会提示其中一个与另一个产生冲突. 1i ...
 - .NET在IE9中页面间URL传递中文变成乱码的解决办法
		
在.Net的项目中,鼠标点击查询按钮,转到查询页面,但URL中包含中文时,传到服务器端后,中文变成了乱码(只有IE9出现该问题). 尝试使用Server.UrlEncode()进行编码, ...
 - 【转】Ubuntu 上编译Android出现cannot find -lstdc++解决办法
		
[转]Ubuntu 上编译Android出现cannot find -lstdc++解决办法 在Ubuntu 12.04 x86_64机器上编译Android出现下面错误,是因为找不到32bit的li ...
 - electron-vue中使用iview 报错this. is readonly的解决办法
		
title: electron-vue中使用iview 报错this. is readonly的解决办法 toc: false date: 2019-02-12 19:33:28 categories ...
 
随机推荐
- Core ML 入门
			
1.下载Xcode 9 2.下载模型,https://developer.apple.com/machine-learning/ 3.开动.. 4.待续 模拟器66的
 - QML中的state 状态
			
QML中的状态其实很好理解,任何事物在某一事件都是有一个状态的. 比如你看到的一个窗口,这个时候里面的文字和图片正处于某个状态中.比如一个超链接,你点击了,发现颜色变了,你按了Ctrl+A,整个窗体好 ...
 - Ubuntu16.04双网卡配置,内网外网同时访问
			
Ubuntu16.04双网卡配置,内网外网同时访问 配置:vim/etc/network/interface auto lo iface lo inet loopback auto eno1 ifac ...
 - 20145322何志威 《Java程序设计》第8周学习总结
			
教材学习内容总结 第十四章 NIO使用频道(channel)来衔接数据节点,对数据区的标记提供了clear(),rewind(),flip(),compact()等高级操作. 想要取得channel的 ...
 - MySQL 常用运算符
			
1.算数运算符 加 mysql> select 1+2; 减 mysql> select 2-1; 乘 mysql> select 2*3; 除 mysql> select 5 ...
 - c# 调用webapi 传参 特殊字符的问题
			
最近在做对接数据接口,遇到一些问题,在C#后台写请求webapi的接口,但是传递过程中参数如果有特殊字符,传入过去之后又问题. 需要转换一下,通过System.Web.HttpUtility.UrlE ...
 - webservice的cxf的客户端
			
1.新建一个java项目 2.用cmd命令生成客户端的使用说明文档 wsdl2java -p xiaostudy -d . http://127.0.0.1:9998/number?wsdl 3.导入 ...
 - Ubuntu16.04 + Digits + caffee
			
reference: csdn 必要依赖包安装 sudo apt-get install build-essential sudo apt-get install --no-install-recom ...
 - 使用 docker 搭建开发环境
			
作为一个 freelancer,经常能够接到很多的开发工作,这些金主,有喜欢 PHP 的,有习惯撒手不管的:有偏好 sqlite 的,也有喜欢 PG 的,我甚至见过 mysql.PG 一起使用的项目: ...
 - spring boot2.1读取 apollo 配置中心3
			
上篇记录了springboot读取apollo的配置信息,以及如何获取服务端的推送更新配置. 接下来记录一下,如何获取公共namespace的配置. 上文中使用如下代码共聚公共命名空间的配置: @Ap ...