zoukankan      html  css  js  c++  java
  • canvas知识02:图片放大镜效果

    效果截图:

    JS代码:

    <script>
        // 初始化canvas01和上下文环境
        var cav01 = document.getElementById('cav01');
        var cxt01 = cav01.getContext('2d');
    
        // 初始化canvas02和上下文环境
        var cav02 = document.getElementById('cav02');
        var cxt02 = cav02.getContext('2d');
    
        //初始化image对象和缩放比例
        var oImg = new Image();
        var scale;
    
        window.onload = function(){
    
            //设置图片路径
            oImg.src = 'images/02.jpg';
    
            //设置主canvas的宽高
            cav01.width = 800;
            cav01.height = 500;
    
            oImg.onload = function(){
    
                //设置离屏canvas的宽高,与原始图片的宽高一致
                cav02.width = oImg.width;
                cav02.height = oImg.height;
    
                //初始化鼠标按下状态和设置缩放比例
                var isMouseDown = false;
                scale = cav02.width/cav01.width;
    
                //绘制图像到canvas,第二个canvas初始时是隐藏的
                cxt01.drawImage( oImg, 0, 0, cav01.width, cav01.height);
                cxt02.drawImage( oImg, 0, 0, cav02.width, cav02.height); 
    
                //鼠标按下状态
                cav01.onmousedown = function(e){
    
                    //获取鼠标相对于canvas的坐标
                    var pos = getMousePos(e.clientX,e.clientY);
    
                    //阻止鼠标默认事件
                    e.preventDefault();
    
                    //调用绘制放大镜方法
                    drawFilterImg(true,pos);
    
                    //把isMouseDown标记设置为true;
                    isMouseDown = true;
                }
    
                //鼠标移动状态
                cav01.onmousemove = function(e){
    //获取鼠标相对于canvas的坐标 var pos = getMousePos(e.clientX,e.clientY); e.preventDefault(); //根据isMouseDown状态,调用绘制放大镜方法 if(isMouseDown == true ){ drawFilterImg(true,pos); } } // 鼠标抬起状态 cav01.onmouseup = function(e){ //获取鼠标相对于canvas的坐标 var pos = getMousePos(e.clientX,e.clientY); e.preventDefault(); //调用绘制放大镜方法 drawFilterImg(false); //把isMouseDown状态设置为false isMouseDown = false; } } // 绘制放大镜方法 flag:用于判断是否开始绘制,pos:鼠标相对于canvas画布的坐标 function drawFilterImg(flag,pos){ //每次调用先清空canvas画布,避免出现重复图像 cxt01.clearRect( 0, 0, cav01.width, cav01.height); cxt01.drawImage( oImg, 0, 0, cav01.width, cav01.height); //定义放大镜半径 var r = 100; if(flag == true){ //调用绘制放大区域方法 drawFilterImgCon(pos,r); } } //绘制放大区域方法 function drawFilterImgCon(pos,r){ //大图图像上开始剪切的坐标 var sx = pos.x*scale - r; var sy = pos.y*scale - r; //画在canvas上的坐标 var dx = pos.x - r; var dy = pos.y - r; cxt01.save(); cxt01.strokeStyle = 'rgba(0,0,0,0.3)'; cxt01.lineWidth = 2; cxt01.beginPath(); cxt01.arc( pos.x, pos.y, r, 0 , Math.PI*2); cxt01.stroke(); cxt01.clip(); cxt01.drawImage( cav02, sx, sy, r*2, r*2, dx, dy, r*2, r*2); cxt01.restore(); } //定义获取鼠标在canvas上位置的方法 //x:鼠标距离窗口的x坐标,y:鼠标距离窗口的y坐标 function getMousePos(x,y){ var oCanPos = cav01.getBoundingClientRect(); return { x: x-oCanPos.left, y: y-oCanPos.top } } } </script>

     HTML代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>canvas图片放大镜</title>
        <style>
            body{ background-color: #333; padding-top: 60px; }
            #cav01{ display: block; margin: 0 auto; }
            #cav02{ display: none;}
        </style>
    </head>
    <body>
        <!-- 主canvas -->
        <canvas id="cav01" style="border:1px solid #666;"></canvas>
        <!-- 离屏canvas,用于放置放大的图片,默认状态为隐藏 -->
        <canvas id="cav02"></canvas>
    </body>
    </html>

    来源:慕课网Canvas玩转图像处理

  • 相关阅读:
    VisualSVN 4.0.11补丁原创发布
    用Advanced Installer制作DotNetBar for Windows Forms 12.0.0.1_冰河之刃重打包版详解
    树霉派4B换国内源注意事项
    StepShot4.3.0安装包_KeyGen发布
    NoSQL Manager for Cassandra 3.2.0.1 带Key
    NoSQL Manager for MongoDB 4.6.0.3 带key
    数值分析 三次样条插值及实现
    POJ 1753 Flip Game 暴力 深搜
    最短路问题 Dijkstra算法- 路径还原
    任意两点间的最短路问题 Floyd-Warshall算法
  • 原文地址:https://www.cnblogs.com/lvmylife/p/5390423.html
Copyright © 2011-2022 走看看