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="800" height="500">
</canvas>

<img src="e.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 = 50;
    var originalRectangle = {};
    var scale = 5;
    var scaleGlassRectangle
    centerPoint.x = 200;
    centerPoint.y = 200;
    window.onload = function () {
        addListener();
        draw();
    }
    function drawBackGround() {
        context.drawImage(img, 0, 0);
    }
    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
        )
        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();
        }
    }
    function windowToCanvas(x, y) {
        var bbox = canvas.getBoundingClientRect();
        var bbox = canvas.getBoundingClientRect();
        return {x: x - bbox.left, y: y - bbox.top}
    }
</script>
</body>
</html>

放大前
放大后
第二种:
新建一个canvas画布,在上面显示放大部分

<!DOCTYPE html>
<html>

<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        #copycanvas {
            border: 1px solid #000;
            display: none;
        }

        #square {
            width: 90px;
            height: 90px;
            background-color: #cc3;
            border: 1px solid #f00;
            opacity: 0.5;
            position: absolute;
            z-index: 999;
            display: none;
            cursor: crosshair;
        }
    </style>
</head>
<body>
    <canvas id="canvas" width="450" height="300"></canvas>
    <button id="big">局域放大</button>
    <canvas id="copycanvas" width="450" height="300"></canvas>
    <div id="square"></div>
    <script>
        var canvas = document.getElementById('canvas'), 
            context = canvas.getContext('2d'),  
            copycanvas = document.getElementById('copycanvas'),  
            copycontext = copycanvas.getContext('2d'),
            square = document.getElementById('square'),  
            squaredata = {},
            box = canvas.getBoundingClientRect();
        var btn = document.getElementById('big')
        image = new Image();
        image.src = "e.jpg";
        image.onload = function () {
            context.drawImage(image, 0, 0, canvas.width, canvas.height);
        };
        btn.onclick = function () {
            canvas.onmouseover = function (e) {
                var x = e.clientX, 
                    y = e.clientY;
                createSquare(x, y); 
            };
            window.onmousemove = function (e) {
                var x = e.clientX,
                    y = e.clientY;
                if (x >= canvas.offsetLeft && x <= canvas.offsetLeft + canvas.width &&
                    y >= canvas.offsetTop && y <= canvas.offsetTop + canvas.height) {
                    createSquare(x, y);
                } else {
                    hideSquare();
                    hideCanvas();
                }
            }
            function showSquare() {
                square.style.display = 'block';
            }
            function hideSquare() {
                square.style.display = 'none';
            }
            function showCanvas() {
                copycanvas.style.display = "inline";
            }
            function hideCanvas() {
                copycanvas.style.display = "none";
            }
            function createSquare(x, y) {
                x = x - 45 < canvas.offsetLeft ? canvas.offsetLeft : x - 45;
                y = y - 45 < canvas.offsetTop ? canvas.offsetTop : y - 45;
                x = x + 90 < box.right ? x : box.right - 90;
                y = y + 90 < box.bottom ? y : box.bottom - 90;
                squaredata.left = x;
                squaredata.top = y;
                moveSquare(x, y);
            }
            function moveSquare(x, y) {
                square.style.left = x + "px";
                square.style.top = y + "px";
                showCanvas();
                showSquare();
                copy();
            }
            function copy() {
                copycontext.drawImage(
                    canvas,
                    squaredata.left - box.left,
                    squaredata.top - box.top,
                    90,
                    90,
                    0,
                    0,
                    copycanvas.width,
                    copycanvas.height
                );
            }
        }

    </script>
</body>

</html>

放大前
放大后

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现TK Canvas中的超大图片放大和缩小功能,可以通过以下步骤实现: 1. 在Canvas中创建一个Image对象,并使用Canvas.create_image()方法将其添加到Canvas中。 2. 创建一个滚动条Scrollbar对象,并使用Canvas.config()方法将其与Canvas关联起来。 3. 创建一个Canvas.scale()方法,用于在Canvas中缩放Image对象的大小。 4. 绑定滚动条和Canvas.scale()方法,以便在滚动条滚动时调整Image对象的大小。 下面是一个示例代码,演示了如何在TK Canvas中实现超大图片放大和缩小功能: ```python from tkinter import * class ImageCanvas(Frame): def __init__(self, master=None): Frame.__init__(self, master) # 创建一个Canvas和一个Scrollbar self.canvas = Canvas(self, width=800, height=600) self.scrollbar = Scrollbar(self, orient=VERTICAL, command=self.canvas.yview) self.canvas.config(yscrollcommand=self.scrollbar.set) # 将Canvas和Scrollbar添加到Frame中 self.scrollbar.pack(side=RIGHT, fill=Y) self.canvas.pack(side=LEFT, fill=BOTH, expand=TRUE) # 创建一个Image对象,并将其添加到Canvas中 self.image = PhotoImage(file='large_image.gif') self.canvas.create_image(0, 0, image=self.image, anchor=NW) # 设置Canvas的可滚动区域 self.canvas.config(scrollregion=self.canvas.bbox(ALL)) # 设置Canvas的初始缩放大小 self.scale = 1.0 # 绑定事件,实现鼠标滚轮放大缩小功能 self.canvas.bind('<MouseWheel>', self.onMouseWheel) def onMouseWheel(self, event): # 获取滚轮滚动方向 delta = event.delta # 根据滚轮滚动方向调整放大小 if delta > 0: self.scale *= 1.1 elif delta < 0: self.scale /= 1.1 # 调整Canvas中Image对象的大小 x = self.canvas.canvasx(event.x) y = self.canvas.canvasy(event.y) self.canvas.scale('all', x, y, self.scale, self.scale) # 更新Canvas的可滚动区域 self.canvas.config(scrollregion=self.canvas.bbox(ALL)) if __name__ == '__main__': root = Tk() app = ImageCanvas(master=root) app.pack(side=TOP, fill=BOTH, expand=TRUE) root.mainloop() ``` 在这个示例代码中,我们创建了一个ImageCanvas类,继承自Frame类,并在该类中实现了一个包含Canvas和Scrollbar的Frame,以及一个实现放大和缩小功能的Canvas。用户可以使用鼠标滚轮来放大或缩小图片,同时可以使用滚动条来浏览整张图片

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值