4.7_將圖像淡入至canvas

4.7_將圖像淡入至canvas

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>將圖像淡入至canvas</title>
        <style>
            body{
                background: #eee;
            }
            #canvas{
                background: #fff;
                cursor: pointer;
                margin-left: 20px;
                margin-top: 50px;
                box-shadow: 4px 4px 8px rgba(0,0,0,0.5);
                -webkit-box-shadow: 4px 4px 8px rgba(0,0,0,0.5);
                -moz-box-shadow: 4px 4px 8px rgba(0,0,0,0.5);
            }
            #controls{
                position: absolute;
                top: 20px;
                left: 50px;
            }
        </style>
    </head>
    <body>
        <div id="controls"><input type="button" id="fadeBtn" value="圖畫淡入" /></div>
        <canvas id="canvas" width="800" height="520"></canvas>
    </body>
    <script>
        var canvas = document.getElementById('canvas');
        var context = canvas.getContext('2d');
        var fadeBtn = document.getElementById('fadeBtn');

        var offscreenCanvas = document.createElement('canvas');
        var offscreenContext = offscreenCanvas.getContext('2d');

        var imageData;
        var imageDataOffscreen;
        var interval = null;

        var image = new Image();

        //初始化
        offscreenCanvas.width = canvas.width;
        offscreenCanvas.height = canvas.height;
        image.src = 'img/waterfall.jpg';
        image.onload = function(){
            //先將圖像數據保存入離屏canvas中
            offscreenContext.drawImage(image,0,0,image.width,image.height,0,0,offscreenCanvas.width,offscreenCanvas.height);
        }

        //事件
        fadeBtn.onclick = function(){
            //得到離屏圖像的數據
            imageDataOffscreen = offscreenContext.getImageData(0,0,canvas.width,canvas.height);
            fadeIn(context,offscreenContext.getImageData(0,0,canvas.width,canvas.height),50,1000/60);
        }

        //淡入函數
        function fadeIn(context,imageData,steps,millisecondsPerStep){
            var frame = 0;

            //將離屏的圖像全部透明度降爲0
            for(var i =3 ;i<imageData.data.length;i+=4){
                imageData.data[i] = 0 ;
            };

            interval = setInterval(function(){
                frame++;
                if(frame>steps){
                    clearInterval(interval);    
                }else{
                    increaseTransperency(imageData,steps);
                    context.putImageData(imageData,0,0);
                }
            },millisecondsPerStep);
        }

        //漸增透明度
        function increaseTransperency(imageData,steps){
            var alpha;
            var currentAlpha;
            var alphaStep;
            var length = imageData.data.length;

            for(var i =3 ;i<length;i+=4){
                alpha = imageDataOffscreen.data[i];
                if(alpha>0){
                    currentAlpha = imageData.data[i];
                    alphaStep = Math.ceil(alpha/steps);

                    if(currentAlpha +alphaStep<=alpha){
                        imageData.data[i] +=alphaStep;
                    }else{
                        imageData.data[i] =alpha;
                    }
                }
            }
        }
    </script>   
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章