canvas 图片加载

pen.drawImage(ele, showX, showY, imgWidth, imgHeight);

ele    将 img 元素 加载到画布上

  • 步骤

1. 创建一个 <img> 对象

var imgNode = new Image();

imgNode.src = "./img/bird.png";

2. 等待图片加载完成,再进行下一步操作

imgNode.onload = function(){

3. 图片显示到画布上

pen.drawImage(imgNode, 0, 0, 100, 100);

};

跳帧闪烁问题

  • 闪烁的原因:

    • 清空了画布,然后加载图片,再等图片加载完,最后画下一帧。
    • 这个空白延迟,主要是因为等待图片加载完成时间太久
  • 解法1: 
    • 在加载图片之前,不清空上一帧图像
    • 加载完成后,再清空画布,最后画下一帧。
    • <!DOCTYPE html>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>帧闪烁解决</title> <style type="text/css">
      * {
      margin: 0;
      padding: 0;
      } body{
      text-align: center;
      } #myCanvas{
      border: 1px solid ;
      }
      </style>
      </head> <body>
      <canvas id="myCanvas" width="800" height="400"></canvas> <!-- javascript 代码 -->
      <script type="text/javascript">
      window.onload = function () {
      var myCanvas = document.getElementById('myCanvas'); var painting = myCanvas.getContext('2d'); var num = 0;
      var speed = 0;
      setInterval(function(){
      speed += 20;
      if(speed > myCanvas.width){
      speed = -150
      // speed = 0
      }; num++;
      if(num > 8){
      num = 1;
      }; painting.beginPath(); //1.img对象
      var imgNode = new Image(); //2.img对象 设置 src
      imgNode.src = 'img/q_r' + num + '.jpg'; //3.等图片加载完成后再去设置图片显示
      imgNode.onload = function () {
      //4.图片显示在画布上
      painting.clearRect(0, 0, myCanvas.width, myCanvas.height)
      painting.drawImage(imgNode, speed, 150, 150, 90);
      };
      }, 340);
      };
      </script>
      </body>
      </html>

飞鸟 案例(双缓冲,解决跳帧闪烁问题

  • <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8" />
    <title>canvas 双缓冲案例</title> <style type="text/css">
    body {
    width: 100%;
    color: #000;
    background: #96b377;
    font: 14px Helvetica, Arial, sans-serif;
    } .wrap {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    }
    </style>
    </head> <body> <div id="box" class="wrap">
    </div> <!-- javascript 代码 -->
    <script type="text/javascript">
    // 创建 画布的width 画布的height 背景颜色 父元素
    function createCanvasTo(canvasWidth, canvasHeight, bgColor, parentObj){
    var myCanvas = document.createElement("canvas");
    myCanvas.width = canvasWidth;
    myCanvas.height = canvasHeight;
    myCanvas.innerText = " 您的浏览器不支持 canvas,建议更新或者更换浏览器。";
    if(bgColor){
    myCanvas.style.backgroundColor = bgColor;
    };
    if(parentObj){
    parentObj.appendChild(myCanvas);
    }; return myCanvas;
    }; var box = document.getElementById("box"); var topCanvas = createCanvasTo(600, 83, "#fff", box);
    movingPic(topCanvas, "./img/q_r", "jpg", -150, 0, 150, 83); var bottomCanvas = createCanvasTo(600, 300, "#fff", box);
    movingPic(bottomCanvas, "./img/walking", "png", -130, 27, 130, 246); // 画布对象 图片路径 图片类型 起始x 起始y 图片width 图片height
    function movingPic(theCanvas, imgPath, imgType, posX, posY, imgWidth, imgHeight){
    var cacheCanvas = document.createElement("canvas");
    cacheCanvas.width = theCanvas.width;
    cacheCanvas.height = theCanvas.height;
    var cachePen = cacheCanvas.getContext("2d"); var num = 1;
    var pos = 0;
    window.setInterval(function(){
    pen = theCanvas.getContext("2d"); // 坑1: 一定要放在循环里面
    pen.clearRect(0, 0, theCanvas.width, theCanvas.height); // 图形位移变换
    num++;
    if(num > 8){
    num = 1;
    }; pos += 15;
    if(posX+pos > theCanvas.width){
    pos = -130;
    }; // 双缓冲绘制 先画到临时 canvas
    cachePen.save();
    cachePen.beginPath();
    var imgObj = new Image();
    imgObj.src = imgPath+num+"."+imgType;
    imgObj.onload = function(){
    cachePen.drawImage(imgObj, posX+pos, posY, imgWidth,imgHeight);
    };
    cachePen.restore(); // 再转到正式 canvas
    pen.save();
    pen.drawImage(cacheCanvas, 0, 0, cacheCanvas.width, cacheCanvas.height);
    pen.restore(); // 坑2: 一定要在 取走缓冲内容后 再清除缓冲
    cachePen.clearRect(0, 0, cacheCanvas.width, cacheCanvas.height);
    }, 100);
    };
    </script>
    </body>
    </html>

HTML5_canvas_图片加载_双缓冲_跳帧闪烁问题的更多相关文章

  1. android图片的异步加载和双缓存学习笔记——DisplayImageOptions (转)

    转的地址:http://hunankeda110.iteye.com/blog/1897961 1 //设置图片在下载期间显示的图片 2 showStubImage(R.drawable.ic_lau ...

  2. 关于图片加载非常爽的一个三方控件 fresco,一个三fresco

    Hi  EveryBody 今天来玩一个非常爽的控件 fresco 到底有多爽呢 接着看就知道了 首先 来看看fresco 是个神马东西 https://github.com/facebook/fre ...

  3. iOS开发——图形编程Swift篇&CAShapeLayer实现圆形图片加载动画

    CAShapeLayer实现圆形图片加载动画 几个星期之前,Michael Villar在Motion试验中创建一个非常有趣的加载动画. 下面的GIF图片展示这个加载动画,它将一个圆形进度指示器和圆形 ...

  4. Android 平滑图片加载和缓存库 Glide 使用详解

    在图片加载库烂大街的今天,选择一个适合自己使用的图片加载库已经成为了每一个Android开发者的必经之路.现在市面上知名的图片加载库有UIL,Picasso,Volley ImageLoader,Fr ...

  5. 使用CAShapeLayer来实现圆形图片加载动画[译]

    原文链接 : How To Implement A Circular Image Loader Animation with CAShapeLayer 原文作者 : Rounak Jain 译文出自 ...

  6. Swift - 表格图片加载优化(拖动表格时不加载,停止时只加载当前页图片)

    列表的单元格中包含有图片在开发中很常见.通常我们可以直接在tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIn ...

  7. Python 植物大战僵尸代码实现: 图片加载和显示切换

    游戏介绍以前很火的植物大战僵尸游戏, 本想在网上找个python版本游戏学习下,无奈没有发现比较完整的,那就自己来写一个把.图片资源是从github上下载的,因为图片资源有限,只能实现几种植物和僵尸. ...

  8. Android中常见的图片加载框架

    图片加载涉及到图片的缓存.图片的处理.图片的显示等.而随着市面上手机设备的硬件水平飞速发展,对图片的显示要求越来越高,稍微处理不好就会造成内存溢出等问题.很多软件厂家的通用做法就是借用第三方的框架进行 ...

  9. imagepool前端图片加载管理器(JavaScript图片连接池)

    前言 imagepool是一款管理图片加载的JS工具,通过imagepool可以控制图片并发加载个数. 对于图片加载,最原始的方式就是直接写个img标签,比如:<img src="图片 ...

随机推荐

  1. css中的数学表达式calc()

    前言 数学表达式calc()是CSS中的函数,主要用于数学运算.使用calc()为页面元素布局提供了便利和新的思路. 概念 数学表达式calc()是calculate计算的缩写,它允许使用+.-.*. ...

  2. [再寄小读者之数学篇](2015-06-24 Series)

    (AMM. Problems and Solutions. 2015. 03) Let $\sed{a_n}$ be a monotone decreasing sequence of real nu ...

  3. [物理学与PDEs]第1章第3节 真空中的 Maxwell 方程组, Lorentz 力 3.1 真空中的 Maxwell 方程组

    1.稍微修正以前局部使用的方程组可以得到真空中的 Maxwell 方程组: $$\beex \bea \Div {\bf E}&=\cfrac{\rho}{\ve_0},\\ \rot{\bf ...

  4. SrpingBoot部署到云服务器

    预先准备事项 1.本地主机:安装maven 2.云端主机:安装和配置jdk 一.maven打包 方式一:maven手动版 切换至项目下,cmd:mvn package 查看target目录: 方式二: ...

  5. java.util.zip.ZipException: invalid entry size

    启动maven项目时报java.util.zip.ZipException: invalid entry size (expected 7612 but got 5955 bytes) 可能是mave ...

  6. 分布式系列七: zookeeper简单用法

    zookeeper是分布式开源框架, 是Google Chubby的一个实现, 主要作为分布式系统的协调服务. Dobbo等框架使用了其功能. zookeeper特性 顺序一致性: 事务请求最终会严格 ...

  7. bat执行python脚本,执行多条命令

    1.新建一个txt文档,输入以下命令 @echo offcmd /k python F:\Pycharm_Projection\Test\test2.py 2.将txt文档保存为.bat格式,然后双击 ...

  8. DeepLearning.ai学习笔记(五)序列模型 -- week2 自然语言处理与词嵌入

    一.词汇表征 首先回顾一下之前介绍的单词表示方法,即one hot表示法. 如下图示,"Man"这个单词可以用 \(O_{5391}\) 表示,其中O表示One_hot.其他单词同 ...

  9. phpstudy 2016 切换Nginx+php7.0版本所需运行库 vc14 + 安装redis拓展

    去微软官方下载vc14的运行库 链接:https://www.microsoft.com/en-us/download/details.aspx?id=48145 32位运行库 安装成功 切换版本成功 ...

  10. Python 概念小屋

     Python 中的 if __name__ == '__main__' 该如何理解 python多进程的理解 multiprocessing Process join run