画布图像动画(交叉渐变) [英] Canvas Image Animation (Crossfade)

查看:77
本文介绍了画布图像动画(交叉渐变)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用HTML5画布,我试图加载图像并创建淡入淡出"效果,使第一幅图像淡入视图,然后在短暂的延迟后,第二幅图像淡入第一幅图像的上方,等等.

Using HTML5 canvas I'm trying to load images and create a 'crossfade' effect where the first image fades into view then, after a short delay, the second image fades in over top of first image, etc.

借助该论坛上类似问题的答案,我得到了2个单独的代码位,其中一个加载了图像数组,第二个为淡入"效果设置了动画效果.我的问题是我不知道如何结合这2个脚本来加载图像数组,而且加载时阵列中的每个图像也会淡入.

With the help of answers to similar questions on this forum I've got 2 separate bits of code working ... one which loads an array of images and a second which animates a 'fade in' effect. My problem is that I don't know how to combine these 2 scripts to load an array of images AND ALSO have each image in array fade in as it loads.

这是我正在使用的2个单独的脚本:

Here are the 2 separate scripts I've got working:

将图像数组加载到画布中

LOAD IMAGE ARRAY INTO CANVAS:

HTML

<canvas id="canvas" width=600 height=350></canvas>

JS

window.onload = function() {

var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height;

var delay=2000;
var nextTime=0;
var nextImage=0;

var imageURLs=[];  
imageURLs.push("img/sunflower0.jpg");
imageURLs.push("img/sunflower1.jpg");
imageURLs.push("img/sunflower2.jpg");

var imgs=[];
var imagesOK=0;
loadAllImages(start);

function loadAllImages(callback){
    for (var i=0; i<imageURLs.length; i++) {
        var img = new Image();
        imgs.push(img);
        img.onload = function(){ 
            imagesOK++; 
            if (imagesOK >= imageURLs.length ) {
                callback();
            }
        };
        img.src = imageURLs[i];
   }      
}

function start(){
    requestAnimationFrame(animate);
}

function animate(currentTime){
    requestAnimationFrame(animate);

    if(currentTime<nextTime){return;}
        ctx.clearRect(0,0,cw,ch);
        ctx.drawImage(imgs[nextImage],0,0);
        nextTime=currentTime+delay;
        nextImage++;
       if(nextImage>imgs.length-1){nextImage=0;}

}
} // close window.onload

将图像加载到画布中后逐渐消失:

FADE IN IMAGES AS THEY LOAD INTO CANVAS:

我设法使用Canvas和Greensock TweenMax完成了单独的代码工作:

I managed to get a separate bit of code working that does this using Canvas and Greensock TweenMax:

<script     src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.18.0/TweenMax.min.js">     </script>

<script>

var ctx, img;

function init() {
    ctx = document.getElementById("canvas").getContext("2d");

    img = new Image();
    img.src = "img/sunflower0.jpg";
    img.xpos = 0;
    img.ypos = 0;
    img.globalAlpha = 0;

    img.onload = function() {
        TweenMax.ticker.addEventListener("tick",loop);
    }

    TweenMax.to(img, 5 ,{globalAlpha:1});
}

function loop(){
   ctx.clearRect(0,0,500,336);
   ctx.globalAlpha = img.globalAlpha;
   ctx.drawImage(img, img.xpos, img.ypos);
}

init(); 

谁能告诉我如何结合这两个脚本来获得交叉淡入淡出的效果?

Can anyone show me how to combine these two scripts to get a crossfade effect?

非常感谢!

推荐答案

为此,我将使用三个画布:

I would use three canvases for this :

var imgs = [];

var rand = Math.random;
var common = "http://lorempixel.com/500/300?";
var imageURLs = [common + rand(), common + rand(), common + rand(), common + rand(), common + rand()];

var imagesOK = 0;
function loadAllImages(callback) {
  for (var i = 0; i < imageURLs.length; i++) {
    var img = new Image();
    imgs.push(img);
    img.onload = function() {
      imagesOK++;
      if (imagesOK >= imageURLs.length) {
        callback();
      }
    };
    img.src = imageURLs[i];
  }
}
var ctx = main.getContext('2d');
var last = main.cloneNode(true).getContext('2d');
var next = main.cloneNode(true).getContext('2d');

var current = 0;
var op = 1;

function nextImage() {
  if (current++ >= imgs.length - 1) current = 0;
  op = 1;
  fade();
}

function fade() {
  op -= .01;
  
  last.clearRect(0, 0, main.width, main.height);
  last.globalAlpha = op;
  last.drawImage(imgs[current], 0, 0);

  next.clearRect(0, 0, main.width, main.height);
  next.globalAlpha = 1 - op;
  next.drawImage(imgs[(current + 1) % (imgs.length)], 0, 0);

  ctx.clearRect(0, 0, main.width, main.height);
  ctx.drawImage(last.canvas, 0, 0);
  ctx.drawImage(next.canvas, 0, 0);

  if (op <= 0) setTimeout(nextImage, 1500);
  else requestAnimationFrame(fade);
}
loadAllImages(fade);

<canvas id="main" width="500" height="300"></canvas>

这篇关于画布图像动画(交叉渐变)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆