html用畫布canvas實現放大鏡效果(放大不糊的那種)

放大不糊的方法就是放大img而不是canvas,因爲畫布分辨率沒有原圖高。


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Glass</title>
    <style type="text/css">
        #canvas {
            display: block;
            border: 1px solid red;
            margin: 0 auto;
            cursor: crosshair;
        }
    </style>
</head>
<body>
<canvas id="canvas" width="755.833" height="430.75">
</canvas>

<img src="0.jpg" style="display: none" id="img">

<script type="text/javascript">
    var canvas = document.getElementById("canvas");
    var context = canvas.getContext("2d");
    var img = document.getElementById("img");
         // // 圖片被放大區域的中心點,也是放大鏡的中心點
        var centerPoint = {};
        // 圖片被放大區域的半徑
        var originalRadius = 100;
        // 圖片被放大區域
        var originalRectangle = {};
        // 放大倍數
        var scale = 5;
        //alert("111")
        // 放大後區域
        var scaleGlassRectangle
        centerPoint.x = 0;
        centerPoint.y = 0;
        img.onload = function () {
            addListener();
            draw();
        }
        function drawBackGround() {
            context.drawImage(img, 0, 0,canvas.width,canvas.height);
        }
        function calOriginalRectangle(point) {
            originalRectangle.x = point.x - originalRadius;
            originalRectangle.y = point.y - originalRadius;
            originalRectangle.width = originalRadius * 2;
            originalRectangle.height = originalRadius * 2;
        }
        function drawMagnifyingGlass() {
            scaleGlassRectangle = {
                x: centerPoint.x - originalRectangle.width * scale / 2,
                y: centerPoint.y - originalRectangle.height * scale / 2,
                width: originalRectangle.width * scale,
                height: originalRectangle.height * scale
            }
            context.save();
            context.beginPath();
            context.arc(centerPoint.x, centerPoint.y, originalRadius, 0, Math.PI * 2, false);
            context.clip();
            // context.drawImage(canvas,
            //         originalRectangle.x, originalRectangle.y,
            //         originalRectangle.width, originalRectangle.height,
            //         scaleGlassRectangle.x, scaleGlassRectangle.y,
            //         scaleGlassRectangle.width, scaleGlassRectangle.height
            // )
            //放大不糊的方法就是放大img而不是canvas,因爲畫布分辨率沒有原圖高。
            scalex=img.width/canvas.width;
            scaley=img.height/canvas.height;
            context.drawImage(img,
                originalRectangle.x*scalex, originalRectangle.y*scaley,
                originalRectangle.width*scalex, originalRectangle.height*scaley,
                scaleGlassRectangle.x, scaleGlassRectangle.y,
                scaleGlassRectangle.width, scaleGlassRectangle.height
            )
            context.restore();
            context.beginPath();
            var gradient = context.createRadialGradient(
                    centerPoint.x, centerPoint.y, originalRadius - 5,
                    centerPoint.x, centerPoint.y, originalRadius);
            gradient.addColorStop(0, 'rgba(0,0,0,0.2)');
            gradient.addColorStop(0.80, 'silver');
            gradient.addColorStop(0.90, 'silver');
            gradient.addColorStop(1.0, 'rgba(150,150,150,0.9)');
            context.strokeStyle = gradient;
            context.lineWidth = 5;
            context.arc(centerPoint.x, centerPoint.y, originalRadius, 0, Math.PI * 2, false);
            context.stroke();
        }
        function draw() {
            context.clearRect(0, 0, canvas.width, canvas.height);
            drawBackGround();
            calOriginalRectangle(centerPoint);
            drawMagnifyingGlass();
        }
        function addListener() {
            canvas.onmousemove = function (e) {
                centerPoint = windowToCanvas(e.clientX, e.clientY);
                draw();
            }
            document.onkeyup = function (e) {
                if (e.key == 'w') {
                    //alert("w");
                    centerPoint.y -=0.5 //intAdd(centerPoint.y, -2);
                }
                if (e.key == 'a') {
                    centerPoint.x -=0.5 //intAdd(centerPoint.x, -2);
                }
                if (e.key == 's') {
                    centerPoint.y +=0.5// intAdd(centerPoint.y, 2);
                }
                if (e.key == 'd') {
                    centerPoint.x +=0.5// intAdd(centerPoint.x, 2);
                }
                draw();
            }
        }
        function windowToCanvas(x, y) {
            var bbox = canvas.getBoundingClientRect();
            var bbox = canvas.getBoundingClientRect();
            return {x: x - bbox.left, y: y - bbox.top}
        }
</script>
</body>
</html>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章