4.5.1_利用getImageData()与putImageData()方法来实现橡皮筋式选取框

4.5.1_利用getImageData()与putImageData()方法来实现橡皮筋式选取框

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>利用getImageData()与putImageData()方法来实现橡皮筋式选取框</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 mousedown ={};
        var rubberbandRectangle = {};
        var dragging = false;

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

        image.src = 'img/waterfall.jpg';
        image.onload = function(){
            context.drawImage(image,0,0,canvas.width,canvas.height);
        }

        //事件控制器
        resetBtn.onclick = function (){
            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.onmousemove = function (e){
            var loc;
            if(dragging){
                loc = windowToCanvas(e.clientX,e.clientY);
                rubberbandStretch(loc.x,loc.y);
            }
        }
        canvas.onmouseup = function(){
            rubberbandEnd();
        }
        //开始
        function rubberbandStar(x,y){
            mousedown.x = x;
            mousedown.y = y;

            dragging = true;
        }
        function rubberbandStretch(x,y){
            //会覆盖上一次的边框
            if(rubberbandRectangle.width>2*context.lineWidth&&rubberbandRectangle.height>2*context.lineWidth){
                if(imageData!== undefined){
                    restoreRubberbandPixels();
                }
            }
            setRubberbandRecting(x,y);
            if(rubberbandRectangle.width>2*context.lineWidth&&rubberbandRectangle.height>2*context.lineWidth){
                updateRubberband();
            }
        }
        function restoreRubberbandPixels(){
            context.putImageData(imageData,rubberbandRectangle.left,rubberbandRectangle.top)
        }
        function updateRubberband(){
            captureRubberbandPixels();
            drawRubberband();
        }
        //获取选中区域像素
        function captureRubberbandPixels(){
            imageData = context.getImageData(rubberbandRectangle.left,rubberbandRectangle.top,rubberbandRectangle.width,rubberbandRectangle.height);
        }
        //绘制矩形
        function drawRubberband(){
            //绘制的边框比鼠标拉出来的小一个线宽
            context.strokeRect(rubberbandRectangle.left +context.lineWidth,rubberbandRectangle.top+context.lineWidth,
                               rubberbandRectangle.width - 2*context.lineWidth,rubberbandRectangle.height-2*context.lineWidth);
        }
        //设置矩形
        function setRubberbandRecting(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 rubberbandEnd(){
            context.drawImage(canvas,rubberbandRectangle.left+context.lineWidth*2,
                                rubberbandRectangle.top+context.lineWidth*2,
                                rubberbandRectangle.width - 4*context.lineWidth,
                                rubberbandRectangle.height - 4*context.lineWidth,0,0,canvas.width,canvas.height);
            dragging = false;
            imageData = undefined;
        }
        //转换坐标
        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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于opencv4.5.1 c实现智能抠图的代码: ```c #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { // 读取图像 Mat image = imread("image.jpg"); // 创建掩码图像 Mat mask = Mat::zeros(image.size(), CV_8UC1); // 创建矩形ROI Rect r(100, 100, 300, 300); // 在掩码画出ROI rectangle(mask, r, Scalar(255), FILLED); // 创建GrabCut算法需要的输入图像 Mat bgModel, fgModel; Mat grabcutInput; image.copyTo(grabcutInput); // 运行GrabCut算法 grabCut(grabcutInput, mask, r, bgModel, fgModel, 5, GC_INIT_WITH_RECT); // 创建前景掩码 Mat fgMask = (mask == GC_FGD) | (mask == GC_PR_FGD); // 将前景掩码应用于原始图像 Mat result; image.copyTo(result, fgMask); // 显示原始图像和抠图结果 imshow("Original", image); imshow("Result", result); waitKey(); return 0; } ``` 代码解析: 1. 首先,包含了需要的头文件和命名空间。 2. 然后,读取了一张图像并创建了一个掩码图像。 3. 接着,创建了一个矩形ROI并在掩码画出了该矩形。 4. 创建了GrabCut算法所需的输入图像,并运行了GrabCut算法。 5. 创建了前景掩码并将其应用于原始图像。 6. 最后,显示原始图像和抠图结果,并等待用户按下任意键结束程序。 这段代码实现的是基于GrabCut算法的智能抠图方法,可以根据用户提供的矩形ROI进行抠图。在这个例子,我们将矩形ROI设置为(100, 100, 300, 300)。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值