4.5.2_带有透明度特效的橡皮筋式选取框

4.5.2_带有透明度特效的橡皮筋式选取框

<!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="resetBtn" value="重置" /></div>
        <canvas id="canvas" width="800" height="520"></canvas>
    </body>
    <script>
        var canvas = document.getElementById('canvas');
        var context = canvas.getContext('2d');
        var resetBtn = document.getElementById('resetBtn');

        var image = new Image();
        var imageData;
        var imageDataCopy = context.createImageData(canvas.width,canvas.height);
        var mousedown ={};
        var rubberbandRectangle = {};
        var dragging = false;

        //初始化
        context.strokeStyle = 'navy';
        context.lineWidth = 1;

        image.src = 'img/waterfall.jpg';
        image.onload = function(){
            context.drawImage(image,0,0,canvas.width,canvas.height);
        }
        //事件控制器
        resetBtn.onclick = function (){
            context.clearRect(0,0,canvas.width,canvas.height);
            context.drawImage(image,0,0,canvas.width,canvas.height);
        }

        canvas.onmousedown = function(e){
            var loc = windowToCanvas(e.clientX,e.clientY);
            e.preventDefault();
            rubberbandStar(loc.x,loc.y);
        }
        canvas.onmouseup = function(){
            rubberbandEnd();
        }
        canvas.onmousemove = function (e){
            var loc;
            if(dragging){
                loc = windowToCanvas(e.clientX,e.clientY);
                rubberbandStretch(loc.x,loc.y);
            }
        }
        function rubberbandStar(x,y){
            mousedown.x = x;
            mousedown.y = y;
            dragging = true;
            captureRubberbandPixels();
        }
        function rubberbandStretch(x,y){
            if(rubberbandRectangle.width>2*context.lineWidth&&rubberbandRectangle.height>2*context.lineWidth){
                if(imageData !== undefined){
                    restoreRubberbandPixels();
                }
            }
            setRubberbandRectangle(x,y);
            if(rubberbandRectangle.width>2*context.lineWidth&&rubberbandRectangle.height>2*context.lineWidth){
                drawRubberband();
            }
        }
        function rubberbandEnd(){
            context.putImageData(imageData,0,0);
            context.drawImage(canvas,rubberbandRectangle.left+2*context.lineWidth,
                rubberbandRectangle.top+2*context.lineWidth,
                rubberbandRectangle.width-4*context.lineWidth,
                rubberbandRectangle.height - 4*context.lineWidth,
                0,0,canvas.width,canvas.height);
                dragging = false;
                imageData = undefined;
        }
        //设置矩形
        function setRubberbandRectangle(x,y){
            rubberbandRectangle.left = Math.min(x,mousedown.x);
            rubberbandRectangle.top = Math.min(y,mousedown.y);
            rubberbandRectangle.width = Math.abs(x - mousedown.x);
            rubberbandRectangle.height = Math.abs(y - mousedown.y);
        }
        function drawRubberband(){
            context.strokeRect(rubberbandRectangle.left+context.lineWidth,
                                rubberbandRectangle.top+context.lineWidth,
                                rubberbandRectangle.width-2*context.lineWidth,
                                rubberbandRectangle.height - 2*context.lineWidth);

        }
        function restoreRubberbandPixels(){
            var deviceWidthOverCSSPixels = imageData.width/canvas.width;
            var deviceHeightOverCSSPixels = imageData.height/canvas.height;
            //恢复原有的图像像素
            context.putImageData(imageData,0,0);
            //加入半透明区域
             context.putImageData(imageDataCopy,0,0,
                rubberbandRectangle.left,
                rubberbandRectangle.top,
                rubberbandRectangle.width*deviceWidthOverCSSPixels,
                rubberbandRectangle.height*deviceHeightOverCSSPixels);
        }
        //获取
        function captureRubberbandPixels(){
            imageData = context.getImageData(0,0,canvas.width,canvas.height);
            copyCanvasPixels();
        }
        //保存透明度降低一半的
        function copyCanvasPixels(){
            for(var i = 0; i<3;i++){
                imageDataCopy.data[i] = imageData.data[i];
            }
            for(var i=3; i<imageData.data.length-4;i+=4){
                imageDataCopy.data[i] = imageData.data[i]/2; //透明度
                imageDataCopy.data[i+1] = imageData.data[i+1]; //红
                imageDataCopy.data[i+2] = imageData.data[i+2]; //绿
                imageDataCopy.data[i+3] = imageData.data[i+3]; //蓝
            }
        }
        //转换坐标
        function windowToCanvas(x,y){
            var bbox = canvas.getBoundingClientRect();
            return {
                x:x-bbox.left*(canvas.width/bbox.width),
                y:y-bbox.top*(canvas.height/bbox.height)
            };
        }
    </script>
</html>
OpenCV是一个开源的计算机视觉库,它提供了丰富的图像处理和计算机视觉算法。下面是使用OpenCV 4.5.2的步骤: 1. 下载OpenCV 4.5.2:你可以从OpenCV的官方GitHub页面下载OpenCV 4.5.2的源代码或者预编译的二进制文件。根据你的需求选择合适的版本进行下载。 2. 安装Visual Studio 2019:OpenCV需要使用C++编译器进行编译,因此你需要安装Visual Studio 2019作为开发环境。 3. 下载OpenCV扩展模块:如果你需要使用OpenCV的扩展功能,你可以从OpenCV的官方GitHub页面下载对应版本的扩展模块。 4. 下载CMake:CMake是一个跨平台的构建工具,你需要下载并安装CMake来配置和生成OpenCV的项目文件。 5. 解压OpenCV、扩展模块和CMake:将下载的OpenCV、扩展模块和CMake解压到指定的目录,例如D:\opencv4.5.2、D:\opencv_contrib-4.5.2和D:\cmake3.21。 6. 使用CMake进行编译:打开CMake GUI,设置源代码路径为OpenCV的根目录(例如D:\opencv4.5.2),设置构建路径为一个新的目录(例如D:\opencv4.5.2_build),点击Configure按钮,选择Visual Studio 2019作为生成器,点击Generate按钮生成Visual Studio的项目文件。 7. 打开生成的Visual Studio项目文件:在构建路径中找到生成的Visual Studio项目文件(例如D:\opencv4.5.2_build\OpenCV.sln),双击打开。 8. 编译OpenCV:在Visual Studio中,选择Release或Debug配置,点击生成按钮开始编译OpenCV。 9. 完成编译:编译完成后,你可以在构建路径中找到生成的OpenCV库文件和可执行文件。 10. 使用OpenCV:现在你可以在你的项目中使用OpenCV库进行图像处理和计算机视觉任务了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值