qt+opencv实现图片编辑器

这篇具有很好参考价值的文章主要介绍了qt+opencv实现图片编辑器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

实现效果

qt 图片编辑,ui,qt,开发语言
qt 图片编辑,ui,qt,开发语言

业务逻辑

借助QLabel容器,进行显示图片作为背景,然后重写QLabel类实现矩形,直线和圆形的实现。opencv板块直接实现相关图片操作。

核心代码部分

打开图片

//打开图片
void Widget::on_pushButton_clicked()
{
    QImage image;
    QString OpenFile;
    OpenFile = QFileDialog::getOpenFileName(this,
                                            "please choose an image file",
                                            "",
                                            "Image Files(*.jpg *.png *.bmp *.pgm *.pbm);;All(*.*)");
    if (OpenFile =="") {
        QMessageBox::warning(this,QString::fromLocal8Bit("错误"), QString::fromLocal8Bit("打开照片为空!"));
        return;
    }
    file_name = OpenFile;
    is_save = true;
    container_is_empty = false;
    image.load(OpenFile);
    src_img.load(OpenFile);
    current_img.load(OpenFile);
    ui->label->clear();
    QPixmap pixmap = QPixmap::fromImage(image);
    ui->label->resize(QSize(image.width(),image.height()));
    ui->label->setPixmap(QPixmap::fromImage(image));
    ui->label->setScaledContents(true);
    ui->radioButton->setChecked(1);
}

裁切

//裁切
void Widget::btn_cut_img_clicked() {

    if (container_is_empty){
        QMessageBox::warning(this,QString::fromLocal8Bit("错误"), QString::fromLocal8Bit("照片为空!"));
        return;
    }
    //本地裁剪
    QImage img = ui->label->pixmap()->toImage();
    QImage testImg = img.copy(begin_point.x(), begin_point.y(), end_point.x()-begin_point.x(),end_point.y()-begin_point.y());
    QPixmap resImage = QPixmap::fromImage(testImg);
    resImage.scaled(ui->label->size(), Qt::IgnoreAspectRatio);
    QSize size;
    size.setWidth(testImg.width());
    size.setHeight(testImg.height());

    ui->label->resize(size);
    ui->label->setGeometry(init_pos_x, init_pos_y, end_point.x()-begin_point.x(),end_point.y()-begin_point.y());
    ui->label->setPixmap(resImage);
    current_img = testImg.copy();
    ui->label->setScaledContents(true);
    ui->radioButton->setChecked(1);
    ui->pushButton_5->setEnabled(false);
    is_save = false;

}

改变亮度和对比度

//改变亮度和对比度
void Widget::change_bright_and_contact() {
    if (container_is_empty){
        QMessageBox::warning(this,QString::fromLocal8Bit("错误"), QString::fromLocal8Bit("照片为空!"));
        return;
    }
    bright = ui->spinBox->value();
    contract = ui->spinBox_2->value();
    printf("br= %d,con=%d\n",bright,contract);
    QImage image = ui->label->pixmap()->toImage();
    Mat img = QImageToMat(current_img),res;
    img.convertTo(res,-1,(double)(bright/30+1),contract);
    image = Mat2QImage(res);
    ui->label->setPixmap(QPixmap::fromImage(image));
    ui->label->setScaledContents(true);
    current_img = image.copy();         //保存当前图片
    is_save = false;
}

顺时针旋转和逆时针旋转文章来源地址https://www.toymoban.com/news/detail-597998.html

//顺时针旋转
void Widget::btn_right_rotation() {

    if (container_is_empty){
        QMessageBox::warning(this,QString::fromLocal8Bit("错误"), QString::fromLocal8Bit("照片为空!"));
        return;
    }
    //顺时针旋转90度
    QMatrix matrix;
    matrix.rotate(90.0);//以90度为例
    QImage image = ui->label->pixmap()->toImage();
    image = image.transformed(matrix,Qt::SmoothTransformation);
    QPixmap pixmap = QPixmap::fromImage(image);
    ui->label->setGeometry(init_pos_x,init_pos_y,image.width(),image.height());
    ui->label->setPixmap(QPixmap::fromImage(image));
    ui->label->setScaledContents(true);
    current_img = image.copy();
    is_save = false;

}

//逆时针旋转
void Widget::btn_left_rotation() {
    if (container_is_empty){
        QMessageBox::warning(this,QString::fromLocal8Bit("错误"), QString::fromLocal8Bit("照片为空!"));
        return;
    }
    //逆时针旋转90度
    QMatrix matrix;
    matrix.rotate(-90.0);//以90度为例
    QImage image = ui->label->pixmap()->toImage();
    image = image.transformed(matrix,Qt::SmoothTransformation);
    QPixmap pixmap = QPixmap::fromImage(image);
    ui->label->setGeometry(init_pos_x,init_pos_y,image.width(),image.height());
    ui->label->setPixmap(QPixmap::fromImage(image));
    ui->label->setScaledContents(true);
    current_img = image.copy();
    is_save = false;

}

重写的QLabel

//
// Created by ROG on 2022/10/13.
//

#include "MyLabel.h"
#include<QDebug>
#include <QMouseEvent>
#include <QPainter>
#include <QRect>
#include<QLabel>
extern bool rectangle_value = false;
extern bool circle_value = false;
extern bool line_value = false;
extern bool is_operate_check = false;
extern QPoint begin_point={0,0},end_point={0,0};
MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
}
//鼠标按下
void MyLabel::mousePressEvent(QMouseEvent *ev)
{
    //当鼠标左键按下  提示信息
    if( ev->button() ==  Qt::LeftButton && (rectangle_value || line_value || circle_value))
    {
        m_isMousePress = true;
        //获取点坐标
        m_beginPoint = ev->pos();
        qDebug()<<"00"<<m_beginPoint;
        //update();
    }else if (ev->button() ==  Qt::LeftButton && is_operate_check){
        //记录初始坐标
        OldPos = ev->pos();
        Pressed = true;
    }
}


//鼠标释放
void MyLabel::mouseReleaseEvent(QMouseEvent *ev)
{
    if(ev->button()==Qt::LeftButton && (rectangle_value || line_value || circle_value))
    {
        m_endPoint = ev->pos();
        m_isMousePress = false;
        qDebug()<<"00"<<m_endPoint;
        begin_point = m_beginPoint;
        end_point = m_endPoint;
        update();
    }else if (ev->button()==Qt::LeftButton && is_operate_check){
        Pressed = false;
        setCursor(Qt::ArrowCursor);
    }




}
//鼠标移动,更新矩形框
void MyLabel::mouseMoveEvent(QMouseEvent *ev)
{
    if( ev->buttons() &   Qt::LeftButton && (rectangle_value || line_value || circle_value))
    {
        m_midPoint=ev->pos();
        update();
    }else if (ev->buttons() &   Qt::LeftButton && is_operate_check){
        this->setCursor(Qt::SizeAllCursor);
        QPoint pos = ev->pos();
        int xPtInterval = pos.x() - OldPos.x();
        int yPtInterval = pos.y() - OldPos.y();

        XPtInterval += xPtInterval;
        YPtInterval += yPtInterval;

        OldPos = pos;

        this->setGeometry(XPtInterval,YPtInterval, this->width(), this->height());

        update();
    }
}


//画画
void MyLabel::paintEvent(QPaintEvent *ev)
{
    QLabel::paintEvent(ev);//先调用父类的paintEvent为了显示'背景'!!!

    QPainter m_painter(this);


    m_painter.setPen(QPen(Qt::red,2));
    m_painter.save();
    if (m_isMousePress)
    {
        if (rectangle_value) m_painter.drawRect(QRect(m_beginPoint,m_midPoint));
        else if (circle_value) m_painter.drawEllipse(QRectF(m_beginPoint,m_midPoint));
        else if (line_value) m_painter.drawLine(m_beginPoint,m_midPoint);
    }
    else if (!m_isMousePress )
    {
        if (rectangle_value) m_painter.drawRect(QRect(m_beginPoint,m_endPoint));
        else if (circle_value) m_painter.drawEllipse(QRectF(m_beginPoint,m_endPoint));
        else if (line_value) m_painter.drawLine(m_beginPoint,m_endPoint);
    }
    m_painter.restore();

}




到了这里,关于qt+opencv实现图片编辑器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#时间轴曲线图形编辑器开发2-核心功能实现

    目录 三、关键帧编辑 1、新建Winform工程 (1)界面布局  (2)全局变量 2、关键帧添加和删除 (1)鼠标在曲线上识别 (2)键盘按键按下捕捉 (3)关键帧添加、删除  (4)修改关键帧值 3、曲线插值 (1)三次样条插值 (2)工程代码下载链接 四、曲线数据导出和读取 1、数

    2024年02月15日
    浏览(28)
  • Yjs + Quill 实现文档多人协同编辑器开发(基础+实战)

            感谢大家对文章的关注哈,大家提出的无法在不同浏览器协同的问题,经过两天多的学习研究,终于是解决了。目前版本已经正常提到 git 上了, 运行脚本:npm run startServer,是通过WebRTC 的形式实现协同(该方案仅支持内网系统,因为webRTC在外网使用需要stun 服务支

    2024年02月10日
    浏览(39)
  • DAY1,Qt [ 手动实现登录框(信息调试类,按钮类,行编辑器类,标签类的使用)]

    ---mychat.h---头文件 ---mychar.cpp---源文件 ---main.cpp---测试文件 结果---    

    2024年02月14日
    浏览(30)
  • Unity3d C#利用Editor编辑器拓展实现配置UI背景样式一键设置UI背景样式功能(含源码)

    在开发UI滚动列表的时候,经常会有每项的背景图不统一的情况,会间隔重复的情况居多。这种情况下,手动去设置间隔一行的背景图或者颜色是比较麻烦的。在此背景下,笔者尝试写个小工具,在搭建UI时配置一下循环背景的样式,可以通过一键点击后设置UI背景的样式,省

    2024年02月03日
    浏览(33)
  • 【NKeditor】富文本编辑器上传图片

    使用NKeditor富文本编辑器上传图片,同时上传到七牛云存储上。后端语言使用ThinkPHP。 下载地址:NKeditor: NKedtior是一款优秀的轻量级Web编辑器,基于 Kindedior 二次开发 里面的文档demo写的比较详细,可以直接使用,不过里面上传七牛云的代码不能用,所以我是自己写的。   把

    2024年02月10日
    浏览(38)
  • 秀米编辑器(xiumi)+百度编辑器(Ueditor) 集成 :解决集成问题,秀米编辑器导出到百度编辑器格式问题,图片保存到自己的服务器(阿里云OSS)

    1.集成前提条件:         1. 需要集成 百度编辑器 到环境中         2. https 环境下才可以导出数据到百度编辑器,如果不是https环境,会出现错误          然后我们开始讲解如何集成: 2.引入资源: //百度编辑器 需要修改的文件(配置与原始的配置不一样,后面

    2024年02月09日
    浏览(34)
  • 4.1 Bootstrap UI 编辑器

    以下是 15 款最好的 Bootstrap 编辑器或者是在线编辑工具。 这是一个 Bootstrap 主题生成器,使用最新的 Bootstrap 3 版本和 Angular JS 版本,提供一个鲜活的用户修改预览。它包括了各种各样的导入,一个颜色选择器和智能的预先输入。更神奇的是,Bootstrap 会根据用户的每个选择来

    2024年02月15日
    浏览(36)
  • wangEditor富文本编辑器图片/视频上传

    wangEditor 有丰富的 API 和足够的扩展性,允许我们自定义开发菜单、模块、插件等。在 Vue、React 中运用也很方便。因此本文介绍下vue中富文本上传图片和视频。 安装引入后富文本有显示上传图片按钮,点击上传后会报 没有配置上传地址 的错误,如下图所示: 所以自定义上传

    2024年02月15日
    浏览(38)
  • tinymce4/5实现将word中内容(文字图片等)直接粘贴至编辑器中——利用插件tinymce-powerpaste-plugin

    TinyMCE是一款易用、且功能强大的所见即所得的富文本编辑器。同类程序有:UEditor、Kindeditor、Simditor、CKEditor、wangEditor、Suneditor、froala等等。 TinyMCE的优势: 开源可商用,基于LGPL2.1 插件丰富,自带插件基本涵盖日常所需功能(示例看下面的Demo-2) 接口丰富,可扩展性强,有

    2024年02月15日
    浏览(32)
  • android项目实战之编辑器图片上传预览

    现状分析 项目的需求用到编辑器,编辑器中又可能用到图片上传功能。 实现方案 1. 增加依赖库,可以参考前面的几篇文章,都有描述。 2. 核心代码实现 欢迎点赞、收藏、转发。

    2024年02月04日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包