婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > HTML5 Canvas 破碎重組的視頻特效的示例代碼

HTML5 Canvas 破碎重組的視頻特效的示例代碼

熱門標簽:地圖標注自己去過的地方 電銷機器人視頻 高德地圖標注錯誤怎么修改 洛陽市伊川縣地圖標注中心官網 標準智能外呼系統 會聲會影怎樣做地圖標注效果 搜狗星級酒店地圖標注 平頂山電子地圖標注怎么修改 江蘇高頻外呼系統線路

也許你見過HTML5圖片破碎動畫特效,實現的原理也挺簡單的。但是你應該沒有見過視頻也可以破碎重組,這個HTML5動畫就是利用Canvas的相關特性,實現了點擊鼠標讓視頻破碎重組的效果。在視頻區域點擊鼠標,即可讓該區域的視頻破碎,讓后經過一段時間后,破碎的區域又可以重組還原,視覺效果非常棒。

HTML代碼
 

        <video id="sourcevid" autoplay="true" loop="true">
            <source src="BigBuckBunny_640x360.mp4" type="video/mp4"/>
            <source src="BigBuckBunny_640x360.ogv" type="video/ogg"/>
        </video>
        <canvas id="sourcecopy" width="640" height="360"></canvas>
</div>
<div>
<center>
    <div style="z-index:1;position:relative;text-align:center;font-size:16px;font-weight:bold;width:1000px;top:60px;">Click video to blow it up!</div>
    <canvas id="output" width="1000" height="600" onmousedown="dropBomb(event, this)" style="border: 0 none">        </canvas>
</center>
</div>

JavaScript代碼

var video;
var copy;
var copycanvas;
var draw;

var TILE_WIDTH = 32;
var TILE_HEIGHT = 24;
var TILE_CENTER_WIDTH = 16;
var TILE_CENTER_HEIGHT = 12;
var SOURCERECT = {x:0, y:0, width:0, height:0};
var PAINTRECT = {x:0, y:0, width:1000, height:600};

function init(){
    video = document.getElementById('sourcevid');
    copycanvas = document.getElementById('sourcecopy');
    copy = copycanvas.getContext('2d');
    var outputcanvas = document.getElementById('output');
    draw = outputcanvas.getContext('2d');
    setInterval("processFrame()", 33);
}
function createTiles(){
    var offsetX = TILE_CENTER_WIDTH+(PAINTRECT.width-SOURCERECT.width)/2;
    var offsetY = TILE_CENTER_HEIGHT+(PAINTRECT.height-SOURCERECT.height)/2;
    var y=0;
    while(y < SOURCERECT.height){
        var x=0;
        while(x < SOURCERECT.width){
            var tile = new Tile();
            tile.videoX = x;
            tile.videoY = y;
            tile.originX = offsetX+x;
            tile.originY = offsetY+y;
            tile.currentX = tile.originX;
            tile.currentY = tile.originY;
            tiles.push(tile);
            x+=TILE_WIDTH;
        }
        y+=TILE_HEIGHT;
    }
}

var RAD = Math.PI/180;
var randomJump = false;
var tiles = [];
var debug = false;
function processFrame(){
    if(!isNaN(video.duration)){
        if(SOURCERECT.width == 0){
            SOURCERECT = {x:0,y:0,width:video.videoWidth,height:video.videoHeight};
            createTiles();
        }
        //this is to keep my sanity while developing
        if(randomJump){
            randomJump = false;
            video.currentTime = Math.random()*video.duration;
        }
        //loop
        if(video.currentTime == video.duration){
            video.currentTime = 0;
        }
    }
    var debugStr = "";
    //copy tiles
    copy.drawImage(video, 0, 0);
    draw.clearRect(PAINTRECT.x, PAINTRECT.y,PAINTRECT.width,PAINTRECT.height);

    for(var i=0; i<tiles.length; i++){
        var tile = tiles[i];
        if(tile.force > 0.0001){
            //expand
            tile.moveX *= tile.force;
            tile.moveY *= tile.force;
            tile.moveRotation *= tile.force;
            tile.currentX += tile.moveX;
            tile.currentY += tile.moveY;
            tile.rotation += tile.moveRotation;
            tile.rotation %= 360;
            tile.force *= 0.9;
            if(tile.currentX <= 0 || tile.currentX >= PAINTRECT.width){
                tile.moveX *= -1;
            }
            if(tile.currentY <= 0 || tile.currentY >= PAINTRECT.height){
                tile.moveY *= -1;
            }
        }else if(tile.rotation != 0 || tile.currentX != tile.originX || tile.currentY != tile.originY){
            //contract
            var diffx = (tile.originX-tile.currentX)*0.2;
            var diffy = (tile.originY-tile.currentY)*0.2;
            var diffRot = (0-tile.rotation)*0.2;

            if(Math.abs(diffx) < 0.5){
                tile.currentX = tile.originX;
            }else{
                tile.currentX += diffx;
            }
            if(Math.abs(diffy) < 0.5){
                tile.currentY = tile.originY;
            }else{
                tile.currentY += diffy;
            }
            if(Math.abs(diffRot) < 0.5){
                tile.rotation = 0;
            }else{
                tile.rotation += diffRot;
            }
        }else{
            tile.force = 0;
        }
        draw.save();
        draw.translate(tile.currentX, tile.currentY);
        draw.rotate(tile.rotation*RAD);
        draw.drawImage(copycanvas, tile.videoX, tile.videoY, TILE_WIDTH, TILE_HEIGHT, -TILE_CENTER_WIDTH, -TILE_CENTER_HEIGHT, TILE_WIDTH, TILE_HEIGHT);
        draw.restore();
    }
    if(debug){
        debug = false;
        document.getElementById('trace').innerHTML = debugStr;
    }
}

function explode(x, y){
    for(var i=0; i<tiles.length; i++){
        var tile = tiles[i];

        var xdiff = tile.currentX-x;
        var ydiff = tile.currentY-y;
        var dist = Math.sqrt(xdiff*xdiff + ydiff*ydiff);

        var randRange = 220+(Math.random()*30);
        var range = randRange-dist;
        var force = 3*(range/randRange);
        if(force > tile.force){
            tile.force = force;
            var radians = Math.atan2(ydiff, xdiff);
            tile.moveX = Math.cos(radians);
            tile.moveY = Math.sin(radians);
            tile.moveRotation = 0.5-Math.random();
        }
    }
    tiles.sort(zindexSort);
    processFrame();
}
function zindexSort(a, b){
    return (a.force-b.force);
}

function dropBomb(evt, obj){
    var posx = 0;
    var posy = 0;
    var e = evt || window.event;
    if (e.pageX || e.pageY){
        posx = e.pageX;
        posy = e.pageY;
    }else if (e.clientX || e.clientY) {
        posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
        posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
    }
    var canvasX = posx-obj.offsetLeft;
    var canvasY = posy-obj.offsetTop;
    explode(canvasX, canvasY);
}

function Tile(){
    this.originX = 0;
    this.originY = 0;
    this.currentX = 0;
    this.currentY = 0;
    this.rotation = 0;
    this.force = 0;
    this.z = 0;
    this.moveX= 0;
    this.moveY= 0;
    this.moveRotation = 0;

    this.videoX = 0;
    this.videoY = 0;
}

/*
    getPixel
    return pixel object {r,g,b,a}
*/
function getPixel(imageData, x, y){
    var data = imageData.data;
    var pos = (x + y * imageData.width) * 4;
    return {r:data[pos], g:data[pos+1], b:data[pos+2], a:data[pos+3]}
}
/*
    setPixel
    set pixel object {r,g,b,a}
*/
function setPixel(imageData, x, y, pixel){
    var data = imageData.data;
    var pos = (x + y * imageData.width) * 4;
    data[pos] = pixel.r;
    data[pos+1] = pixel.g;
    data[pos+2] = pixel.b;
    data[pos+3] = pixel.a;
}
/*
    copyPixel
    faster then using getPixel/setPixel combo
*/
function copyPixel(sImageData, sx, sy, dImageData, dx, dy){
    var spos = (sx + sy * sImageData.width) * 4;
    var dpos = (dx + dy * dImageData.width) * 4;
    dImageData.data[dpos] = sImageData.data[spos];     //R
    dImageData.data[dpos+1] = sImageData.data[spos+1]; //G
    dImageData.data[dpos+2] = sImageData.data[spos+2]; //B
    dImageData.data[dpos+3] = sImageData.data[spos+3]; //A
}
</script>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

標簽:鄂爾多斯 果洛 常德 廣東 廣西 阿克蘇 蚌埠 松原

巨人網絡通訊聲明:本文標題《HTML5 Canvas 破碎重組的視頻特效的示例代碼》,本文關鍵詞  HTML5,Canvas,破碎,重組,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《HTML5 Canvas 破碎重組的視頻特效的示例代碼》相關的同類信息!
  • 本頁收集關于HTML5 Canvas 破碎重組的視頻特效的示例代碼的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美日韩精品电影| 日韩国产精品久久久久久亚洲| 亚洲三级视频在线观看| 免费av网站大全久久| 91成人免费电影| 欧美激情一区二区三区蜜桃视频| 日本aⅴ亚洲精品中文乱码| 91传媒视频在线播放| 国产精品高潮呻吟| 成人精品视频.| 久久久久久久久久久久久久久99 | 欧美亚洲图片小说| 亚洲精品老司机| 在线看国产一区| 亚洲夂夂婷婷色拍ww47| 色偷偷久久一区二区三区| 自拍偷在线精品自拍偷无码专区| av综合在线播放| 日韩毛片一二三区| 色综合天天性综合| 亚洲一区二区三区四区不卡| 色88888久久久久久影院野外| 亚洲男女一区二区三区| 91国内精品野花午夜精品| 亚洲一区二区三区国产| 欧美日本一道本| 美女脱光内衣内裤视频久久影院| 日韩三级精品电影久久久| 国产精品主播直播| 国产肉丝袜一区二区| 久久久亚洲午夜电影| 国产精品一区二区不卡| 国产蜜臀97一区二区三区| 成人黄色免费短视频| 自拍偷拍欧美激情| 91国偷自产一区二区使用方法| 天堂一区二区在线| 久久亚洲捆绑美女| 成人不卡免费av| 亚洲地区一二三色| 欧美mv日韩mv| 97久久超碰国产精品| 亚洲国产精品一区二区久久恐怖片| 91精品国产麻豆国产自产在线| 国产又粗又猛又爽又黄91精品| 国产精品成人免费在线| 欧美性猛交xxxxxx富婆| 麻豆极品一区二区三区| 国产精品久久久久国产精品日日| 欧美日韩一区精品| 国产精品888| 亚洲国产视频一区二区| 久久久亚洲精品石原莉奈| 91视频国产资源| 另类小说综合欧美亚洲| 综合激情网...| 久久亚洲一区二区三区明星换脸| 99免费精品视频| 男女男精品视频| 综合久久久久久| 久久久一区二区三区捆绑**| 欧美日韩情趣电影| 成人自拍视频在线观看| 日本成人超碰在线观看| |精品福利一区二区三区| 精品久久久久一区| 欧美午夜理伦三级在线观看| 国产成人在线看| 婷婷丁香久久五月婷婷| 国产精品色在线| 日韩欧美色综合| 91成人免费网站| 99麻豆久久久国产精品免费优播| 日本视频一区二区| 亚洲欧美视频在线观看视频| 日韩欧美成人一区| 欧美日韩免费电影| proumb性欧美在线观看| 韩日欧美一区二区三区| 亚洲成人www| 中文字幕在线不卡一区二区三区| 精品日韩在线一区| 精品视频免费在线| 99视频在线观看一区三区| 国产资源在线一区| 丝袜美腿亚洲一区| 一区二区三区美女视频| 中文字幕色av一区二区三区| 国产一区二区网址| 视频一区二区三区入口| 一级做a爱片久久| 亚洲欧洲成人av每日更新| 国产午夜精品久久久久久免费视| 日韩一区二区三| 欧美一区二区三区免费在线看| 一区二区三区中文免费| 中文字幕一区二区5566日韩| 国产校园另类小说区| 精品久久久久久亚洲综合网| 欧美日韩国产三级| 欧美色视频在线观看| 91一区二区在线| 不卡的电影网站| 成人爽a毛片一区二区免费| 国产综合色视频| 麻豆精品一区二区三区| 男人的天堂亚洲一区| 日韩不卡在线观看日韩不卡视频| 一区二区三区成人在线视频| 亚洲美腿欧美偷拍| 一区二区三区欧美亚洲| 亚洲欧美日韩成人高清在线一区| 国产精品欧美极品| 国产精品理论片在线观看| 国产精品久久久久永久免费观看| 国产女主播视频一区二区| 久久精品一区八戒影视| 国产亚洲一区二区三区在线观看 | 国产精品一区二区x88av| 久久精品国产澳门| 久久av资源网| 国产在线麻豆精品观看| 国产成人亚洲综合a∨婷婷 | 欧美精品久久久久久久多人混战 | 国产一区二区主播在线| 成人网男人的天堂| 99久久免费国产| 在线观看免费成人| 欧美人狂配大交3d怪物一区| 91精品国产色综合久久ai换脸| 欧美一卡二卡三卡四卡| 2023国产精品| 中文字幕在线一区免费| 在线精品视频一区二区| 亚洲成av人影院| 另类欧美日韩国产在线| 国产精品一区二区男女羞羞无遮挡| 97aⅴ精品视频一二三区| 欧美性xxxxxxxx| 日韩女同互慰一区二区| 欧美激情综合在线| 亚洲国产毛片aaaaa无费看| 另类专区欧美蜜桃臀第一页| 国产精品影视在线观看| 色综合婷婷久久| 精品国产制服丝袜高跟| 国产精品久久久久影院老司| 午夜激情久久久| 国产成人亚洲综合a∨婷婷图片| 日本精品一区二区三区四区的功能| 欧美久久一区二区| 国产性色一区二区| 欧美日韩高清一区二区不卡| 欧美成人精品二区三区99精品| 在线一区二区三区四区| 精品少妇一区二区三区日产乱码| 欧美日韩你懂得| 中文字幕在线不卡一区| 久久不见久久见免费视频7 | 亚洲四区在线观看| 日本不卡一区二区| 91蜜桃在线观看| 精品成人a区在线观看| 玉米视频成人免费看| 狠狠狠色丁香婷婷综合久久五月| 欧美在线|欧美| 国产亚洲欧美一级| 三级不卡在线观看| 99国产欧美另类久久久精品| 日韩精品一区二区三区中文精品| 亚洲黄一区二区三区| 国产成+人+日韩+欧美+亚洲| 91精品婷婷国产综合久久竹菊| 综合网在线视频| 韩国女主播一区| 91.com视频| 亚洲精品欧美综合四区| 国产精品一区二区三区网站| 91精品国产综合久久久久久久| 亚洲综合免费观看高清完整版在线 | 国产精品一区二区果冻传媒| 日本sm残虐另类| 在线观看av不卡| 国产精品乱人伦一区二区| 另类中文字幕网| 欧美日韩国产乱码电影| 综合在线观看色| 成人精品一区二区三区中文字幕 | 国产精品1024| 69堂国产成人免费视频| 亚洲欧美国产毛片在线| 乱一区二区av| 欧美不卡视频一区| 亚洲成人手机在线| 91视频免费看| 综合网在线视频| 99在线视频精品| 亚洲天堂免费看| 日本伦理一区二区| 亚洲精品中文字幕乱码三区|