4.5.2.4_浮雕濾鏡

4.5.2.4_浮雕濾鏡

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>浮雕濾鏡</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="embossBtn" value="原圖" /></div>
        <canvas id="canvas" width="800" height="520"></canvas>
    </body>
    <script>
        var canvas = document.getElementById('canvas');
        var context = canvas.getContext('2d');
        var embossBtn = document.getElementById('embossBtn');

        var image = new Image();
        var embossed = false;

        //初始化
        image.src = 'img/waterfall.jpg';
        image.onload = function(){
            drawOriginalImage();
        }

        //事件
        embossBtn.onclick = function(){
            if(embossed){
                embossBtn.value = '浮雕';
                drawOriginalImage();
                embossed=false;

            }else{
                embossBtn.value = '原圖';
                drawEmboss();
                embossed=true;
            }
        }

        //繪製原圖
        function drawOriginalImage(){
            context.drawImage(image,0,0,image.width,image.height,0,0,canvas.width,canvas.height);
        }
        //繪製浮雕圖
        function drawEmboss(){
            var imageData = context.getImageData(0,0,canvas.width,canvas.height);
            var data = imageData.data;
            var width = imageData.width;//設備像素
            var length = data.length;

            for(var i =0;i<length;i++){//遍歷每個像素

                //不讓超過最後一行
                if(i<length-width*4){ //不包含最後一行

                    //不包含透明度的值
                    if((i+1)%4 !==0){

                        //在每行最後一個像素取左邊的鄰近像素
                        if((i+4)%(width*4) == 0){//代表每行最後一個像素

                            //給最右邊像素重新定rgba
                            data[i] = data[i-4];
                            data[i+1] = data[i-3];
                            data[i+2] = data[i-2];
                            data[i+3] = data[i-1];
                            i+=4; //直接跳到下一個像素

                        }else{ //最終符合條件的,不是最後一行,也不在每行最後一個的像素,且除去了像素集合中爲透明度的值

                            data[i] = 255/2 
                                      + 2*data[i] //現有像素
                                      - data[i+4] //下一個像素
                                      - data[i+width*4]; //下一行同一位置像素

                        }

                    }

                }else{ //最後一行,取上一行的像素
                    if((i+1)%4 !== 0){
                        data[i] = data[i -width+4];
                    }
                }
            }
            context.putImageData(imageData,0,0);
        }
        </script>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章