canvas-图像放大镜

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>canvas-放大镜</title>
    <style>
        body{
            padding: 0px;
            margin: 0px;
        }
        #canvas{
            border: 1px solid red;
            margin: 100px;
        }
    </style>
</head>
<body>
    <canvas id="canvas" width="800px" height="500px">
    </canvas>
    <script>
        //获取到canvas元素
        var canvas = document.getElementById('canvas');
        //获取canvas中的画图环境
        var context = canvas.getContext('2d');

        var img = new Image();
        img.src = "./image/liuyifei.jpg";

        window.onload = function(){
            //获取放大镜
            getfangdajing(context,canvas,img,150,2);
        }

        /*
        *   context:绘制环境对象,
        *   element:canvas元素对象
        *   img:图片对象
        *   diameter:放大镜的大小,
        *   ratio:图形的放大比例,
        *  (比例 = 原图 :镜中图像)0<ratio<1缩小图像,ratio>1放大图像
        * */
        function getfangdajing(context,element,img,diameter,ratio){
            //绘制图片
            context.drawImage(img,0,0,element.width,element.height);
            //鼠标在element中移动触发事件
            element.onmousemove = function (e){
                context.clearRect(0,0,element.width,element.height);
                //绘制图片
                context.drawImage(img,0,0,element.width,element.height);
                //解决浏览器兼容问题
                var e = e ? e : window.event;
                //获取鼠标在element元素中的坐标值
                var cxy =  windowToCanvas(element,e.clientX,e.clientY);
                context.save();//保存当前绘制环境
                //获取放大镜
                getClip(context,cxy.x,cxy.y,diameter/2);
                //将内容放入到放大镜中显示
                //根据鼠标点的坐标值计算出在原图的坐标值
                var ytx0=img.width/element.width*cxy.x;//计算出鼠标在原图的X坐标值
                var yty0=img.height/element.height*cxy.y//计算出鼠标在原图的Y坐标值
                //(原图形/显示图形比例)* (放大镜直径/比例= 镜中的图形所占大小)= 原图要截取的图像大小
                var ytclipValueW = img.width/element.width*diameter/ratio;//在原图截取图片的宽度
                var ytclipValueH =  img.height/element.height*diameter/ratio;//在原图截取图片的宽度
                //.drawImage(图像对象,原图像截取的起始X坐标,原图像截取的起始Y坐标,原图像截取的宽度,原图像截取的高度,
                // 绘制图像的起始X坐标,绘制图像的起始Y坐标,绘制图像所需要的宽度,绘制图像所需要的高度);
                context.drawImage(img,ytx0-ytclipValueW/2,yty0-ytclipValueH/2,ytclipValueW,ytclipValueH,cxy.x-diameter/2,cxy.y-diameter/2,diameter,diameter);
                context.restore();//恢复当前保存的绘制环境
            }
        }

        /*
        * 获取放大镜框:进行图层切割
        * context:绘制环境对象
        * x:鼠标在画布中的X坐标
        * y:鼠标在画布中的Y坐标
        * r:放大镜的直径
        * */
        function getClip(context,x,y,r){
            context.beginPath();
            context.arc(x,y,r,0,Math.PI*2,false);
            context.stroke();
            context.clip();//沿形状切除向外的图层
        }


        /*
        * 坐标转换:将window中的坐标转换到元素盒子中的坐标,并返回(x,y)坐标
        * element:canvas元素对象
        * x:鼠标在当前窗口X坐标值
        * y:鼠标在当前窗口Y坐标值
        * */
        function windowToCanvas(element,x,y){
            //获取当前鼠标在window中的坐标值
           // alert(event.clientX+"-------"+event.clientY);
            //获取元素的坐标属性
            var box = element.getBoundingClientRect();
            var bx = x - box.left;
            var by = y - box.top;
            return {x:bx,y:by};
        }

    </script>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值