抠图软件

本博客介绍了一个使用QtQuick实现的图像选择和裁切应用,通过FileDialog选取图片,利用Canvas进行实时预览与裁切,并提供保存功能。支持多点触控调整裁切框位置。
import QtQuick 2.11
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.3
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.4

 
Window {
    visible: true
    width: 640
    height: 480
    color: "black";

 
    onWidthChanged: mask.recalc();
    onHeightChanged: mask.recalc();

 
    Image{
        id : source1;
        anchors.fill: parent
        fillMode: Image.PreserveAspectFit;

 
        visible: false;
        asynchronous: true
        onStateChanged:
        {
            if (status == Image.Ready)
            {
                console.log(" Image loaded");
                mask.recalc();
            }
       }
    }

 
    FileDialog
    {
        id: fileDialog
        title: "Please choose an Image File";
        nameFilters: [" Image Files(*.jpg *.png *.gif)"];
        onAccepted: {
            source1.source = fileDialog.fileUrl;
            console.log("fileDialog.fileUrl"+fileDialog.fileUrl)
        }
        }

 

 
    Canvas {
        id:forSaveCanvas;
        width: 128;
        height: 128;
        contextType: "2d";
        visible: false;
        z:2;
        anchors.top:parent.top;
        anchors.right:parent.right;
        anchors.margins:4;

 
        property var  imageData: null;
        onPaint: {
            if (imageData != null)
            {
                context.drawImage(imageData,0,0);
            }
        }

 
        function setImageData(data)
        {
            imageData = data;
            requestPaint();
        }
    }

 
    Canvas{
        id: mask;
        anchors.fill: parent;
        z:1;
        property real w: width;
        property real h: height;
        property real dx: 0;
        property real dy: 0;
        property real dw: 0;
        property real dh: 0;
        property real frameX: 66;
        property real frameY: 66;

 
        function calc()
        {
            var sw = source.sourceSize.width;
            var sh = source.sourceSize.height;

 
            if(sw > 0 && sh > 0)
            {
                if (sw <= w && sh <= h )
                {
                    dw =sw;
                    dh = sh;
                }
                else
                {
                    var sRatio = sw / sh;
                    dw = sRatio * h;

 
                    if (dw > w)
                    {
                        dh = w /sRatio;
                        dw = w;
                    }
                    else
                    {
                       dh = h;
                    }
                }
            }

 
            dx = (w-dw) /2;
            dy = (h-dh) /2;
        }

 

 

 
    function recalc()
    {
        calc();
        requestPaint();
    }

 
    function getImageData()
    {
        return context.getImageData(frameX - 64, frameY - 64,128,128);
    }

 
    onPaint:{
     var ctx = getContext("2d");
        if (dw < 1 || dh < 1)
        {
            ctx.fillStyle = " #0000a0";
            ctx.font = "20pt sans-serif";
            ctx.textAlign = "center";
            ctx.fillText("Please Choose An image File", width/2, height/2);

 
            return ;
        }
    ctx.clearRect(0,0,width,height);
    ctx.drawImage(source,dx,dy,dw,dh);
     var xStart = frameX - 66;
      var yStart = frameY - 66;
        ctx.save();
        ctx.fillRect(0,0,w,yStart);
        var yOffset = yStart +132;
        ctx.fillRect(0, yOffset,  w, h - yOffset);
        ctx.fillRect(0,yStart,xStart,132);
        var xoffSet = xStart +132;
        ctx.fillRect(xoffSet,yStart,w-xoffSet,132);

 
        // see through area

 
        ctx.strokeStyle = "red";
        ctx.fillStyle = "#00000000";
        ctx.lineWidth = 2;
        ctx.beginPath();
        ctx.rect(xStart,yStart,132,132);
        ctx.fill();
        ctx.stroke();
        ctx.closePath();
        ctx.restore();
    }

 
 }
    MultiPointTouchArea{
        anchors.fill: parent;
        minimumTouchPoints: 1;
        maximumTouchPoints: 1;
        touchPoints: [
            TouchPoint{
                id: point1;
            }
        ]

 
        onUpdated: {
            mask.frameX = point1.x;
            mask.frameY = point1.y;
            mask.requestPaint();
        }

 
        onReleased: {
            forSaveCanvas.setImageData(mask.getImageData());
            actionPanel.visible = true;
        }

 
        onPressed:  {
            actionPanel.visible = false;
        }

 
    }

 
    Component{
        id :flatButton;
        ButtonStyle{
            background:Rectangle{
                implicitWidth: 70;
                implicitHeight: 30;
                border.width: control.hovered?2:1;
                border.color: control.hovered?"#c0c0c0" : "#909090";
                color: control.pressed?"#a0a0a0" : "#707070";
            }
            label:Text{
                anchors.fill:parent;
                font.pointSize: 12;
                horizontalAlignment: Text.AlignHCenter;
                verticalAlignment: Text.AlignVCenter;
                text:control.text;
                color:(control.hovered && !control.pressed)?"blue" :"white";
            }
        }

 
    }

 
    Row{
        anchors.horizontalCenter: parent.horizontalCenter;
        anchors.bottom: parent.bottom
        anchors.bottomMargin: 20;
        id:actionPanel;
        z:5;
        spacing: 8;
        Button{
            style: flatButton;
            text:"open";
            onClicked: fileDialog.open();
        }
        Button{
            style: flatButton;
            text:"Save";
            onClicked: {
                forSaveCanvas.save("selected.png");
                actionPanel.visible = false;
            }
        }

 
        Button{
            style: flatButton
            text: "Cancel";
            onClicked: actionPanel.visible = false;
        }
    }
}

 

 
(Kriging_NSGA2)克里金模型结合多目标遗传算法求最优因变量及对应的最佳自变量组合研究(Matlab代码实现)内容概要:本文介绍了克里金模型(Kriging)与多目标遗传算法NSGA-II相结合的方法,用于求解最优因变量及其对应的最佳自变量组合,并提供了完整的Matlab代码实现。该方法首先利用克里金模型构建高精度的代理模型,逼近复杂的非线性系统响应,减少计算成本;随后结合NSGA-II算法进行多目标优化,搜索帕累托前沿解集,从而获得多个最优折衷方案。文中详细阐述了代理模型构建、算法集成流程及参数设置,适用于工程设计、参数反演等复杂优化问题。此外,文档还展示了该方法在SCI一区论文中的复现应用,体现了其科学性与实用性。; 适合人群:具备一定Matlab编程基础,熟悉优化算法和数值建模的研究生、科研人员及工程技术人员,尤其适合从事仿真优化、实验设计、代理模型研究的相关领域工作者。; 使用场景及目标:①解决高计算成本的多目标优化问题,通过代理模型降低仿真次数;②在无法解析求导或函数高度非线性的情况下寻找最优变量组合;③复现SCI高水平论文中的优化方法,提升科研可信度与效率;④应用于工程设计、能源系统调度、智能制造等需参数优化的实际场景。; 阅读建议:建议读者结合提供的Matlab代码逐段理解算法实现过程,重点关注克里金模型的构建步骤与NSGA-II的集成方式,建议自行调整测试函数或实际案例验证算法性能,并配合YALMIP等工具包扩展优化求解能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值