drawImage()不显示图片

1、问题源码

<p>要使用的图像:</p>
<img id="tulip" src="/i/eg_tulip.jpg" alt="The Tulip" />

<p>画布:</p>
<canvas id="myCanvas" width="500" height="300" style="border:1px solid #d3d3d3;background:#ffffff;">
Your browser does not support the HTML5 canvas tag.
</canvas>

<script>

var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
var img=document.getElementById("tulip");
ctx.drawImage(img,10,10);

</script>

2、解决办法

ctx.drawImage(img,10,10);

外面套一层:

img.onload=function(){
	ctx.drawImage(img,10,10);
}

3、原因分析

图片的加载是异步的,它会在自己后面的非异步代码执行完之后,再开始执行自己

异步猛一看有点并发的感觉,其实还是排队,且还是排的原来那条队,时间并没有被节省,只不过它会在轮到自己时,放弃自己的位置,主动站到非异步的代码队尾,非异步的都执行完再轮到自己时,才开始执行自己的,它后面其他的异步对象也是如此,不过后面异步的对象会等前面的异步执行了之后再执行,不过不会等待前面的异步执行完才执行。有点Gentleman的赶脚!

js中所有事件都是异步的,onload也是,onload的异步在图片异步之后,所以onload会在图片加载之后执行,同时onload除了异步之外,它还是个事件,也就是图片加载了之后才会触发,所以使用onload是百分百可以看到图片

同时如果不使用onload,使用

setTimeout(function(){
	ctx.drawImage(img,10,10);
},0);

也会看到图片被绘制出来,不过不是稳定的,偶尔看不到。原因就是

setTimeout

制造了一个异步,即使等待时间是0,这就意味着它成了一个图片加载异步之后的一个异步,图片加载先执行,它后执行,假如图片加载的快,它就绘制成功,慢了,它就失败。如果没有了

setTimeout

就百分百失败,因为绘制图片的代码所在的子队列在图片异步之前,图片会等到它执行完了,才刚刚开始自己的加载工作

PS

1、火狐似乎是个特例,它不用那些麻烦事,直接w3school拷贝下来的实例代码,刷新下就可以正常访问了,这是为啥?

2、w3school上拷贝的代码虽然本地不能绘制成功,可是在线,在它的实例执行页面看效果确实正常的,这怎么解释呢?

有路过的大神,还请赐教~

时间: 2024-08-27 01:55:57

drawImage()不显示图片的相关文章

Python游戏引擎开发(三):显示图片

在上一章中我们讲了如何创建窗口以及对界面进行重绘.可能有朋友不理解为什么要进行全窗口的重绘呢?我在这里可以大致讲一下原因: 由于我们的游戏是动态的,所以我们每次更改数据后(例如播放动画时切换图片),要让界面显示更改后的结果,一般的想法是:首先进行擦除原先要改的地方,然后再把变更的内容画出来.不过这个看似简单,如果遇到了重叠放置的对象就麻烦了,比如说A在B的下面,我们要更改A,那么把A擦掉后,B也会被擦掉,原因在于我们的画布是2D的,无法控制Z方向的擦除.这样一来,我们除了重画A还要再把B画上去.

Qt 显示图片 放大 缩小 移动(都是QT直接提供的功能)

本文章原创于www.yafeilinux.com 转载请注明出处. 现在我们来实现在窗口上显示图片,并学习怎样将图片进行平移,缩放,旋转和扭曲.这里我们是利用QPixmap类来实现图片显示的. 一.利用QPixmap显示图片. 1.将以前的工程文件夹进行复制备份,我们这里将工程文件夹改名为painter05.(以前已经说过,经常备份工程目录,是个很好的习惯) 2.在工程文件夹的debug文件夹中新建文件夹,我这里命名为images,用来存放要用的图片.我这里放了一张linux.jpg的图片.如下

jquery html5 file 上传图片显示图片

最近做了一个小例子,在上传用户图像时,如何在上传图片时显示图片.在网上找了很多资料也未能如愿,如是,就用jquery ,html5,实现了,由于开发是在linux 所以未能在ie下测试,在forefox,chrom下是可以的. 一.html下的代码是: <div class=' input_box' > <span class='spac' >头</span>相:<input class="input_style" id="'head

Android TextView里直接显示图片的三种方法

方法一:重写TextView的onDraw方法,也挺直观就是不太好控制显示完图片后再显示字体所占空间的位置关系.一般如果字体是在图片上重叠的推荐这样写.时间关系,这个不付源码了. 方法二:利用TextView支持部分Html的特性,直接用api赋图片.代码如下: //第一种方法在TextView中显示图片 String html = "<img src='" + R.drawable.circle + "'/>"; ImageGetter imgGett

可以显示图片的类似网易新闻的头部滚动条(转)

声明:原文来自  http://www.jianshu.com/p/ce4909bc4752 前言, 最近发现一类效果类似网易新闻头部滚动条的效果,不过是可以显示图片(上, 中, 左, 右)和文字, 最近在比较闲的时候顺带把这些效果也一并实现了, 那么这一类的各种效果大致上就实现了Demo地址,供有需要的朋友可以参考 增加效果 图片在左边 图片在右边.gif 图片在上面.gif 只显示图片.gif 原来的效果 --- 只显示文字 oc版滚动示例.gif 关于实现部分, 新增显示的图片的效果, 其

C++开发人脸性别识别教程(9)——搭建MFC框架之显示图片

在之前的博客中我们已经实现读取用户选定的文件夹,并将其路径保存在相应的变量中,在这篇博文中我们将介绍如何借助CvvImage类将图片显示在picture控件中,并自动读取文件夹下的其他图片. 一.添加“下一张”按钮 由于我们需要读取文件夹下的所有图像文件,而非某一张文件,因此有必要添加一个按钮来进行控制,具体功能就是:每单击一次这个按钮,程序就会自动读取下一张图片并显示在界面上.由于之前已经详细介绍了MFC中添加Button控件的方式,这里不再赘述.添加一个按钮,命名为“下一张”,将ID更改为I

代码: 两列图片瀑布流(一次后台取数据,图片懒加载。下拉后分批显示图片。图片高度未知,当图片onload后才显示容器)

代码: 两列图片瀑布流(一次后台取数据,无ajax,图片懒加载.下拉后分批显示图片.图片高度未知,当图片onload后才显示容器) [思路]: 图片瀑布流,网上代码有多种实现方式,也有各类插件.没找到合意的,所以根据网上找的一段代码,进行了较大改动. 需引用 zepto 或 jquery. 我这个是应用于手机上的,两列瀑布流,图片高度未知——等图片的onloaded事件触发后,才对容器进行计算和定位. 大容器是 $("#imgList"),容器格子是$(".pin"

Android中高效的显示图片之一 ——加载大图

在网上看了不少文章,发现还是官方文档介绍最详细,把重要的东西简单摘要出来.详细可看官方文档地址 ( http://www.bangchui.org/read.php?tid=9 ) . 在应用中显示图片,如果不多加小心,很容易就会使应用因为异常“java.lang.OutofMemoryError:bitmap size exceeds VM budget”而导致crash.在android中加载图片需要一定的技巧性,主要是因为: 1.通常设备资源有限,安卓设备给每个应用只分配16M的空间.当然

让dwz 在td里显示图片

让dwz 在td里显示图片 <[email protected]{foreach from = $list item = element}@> <tr target="gid" rel="<[email protected]{$element.id}@>" > <td><[email protected]{$element.id}@></td> <td><[email prot