Qt实现 图片处理器PictureEdit

news2024/11/20 1:35:49

目录

  • 图片处理器PictureEdit
  • 1 创建工具栏
  • 2 打开图片
  • 3 显示图片
  • 4 灰度处理
  • 5 颜色反转
  • 6 马赛克

图片处理器PictureEdit

创建工程,添加资源文件

image-20230904144039679

1 创建工具栏

  • widget.h
#include <QWidget>
#include<QPixmap>
#include<QFileDialog>
#include<QAction>
#include<QToolBar>
#include<QIcon>

class QToolBar;
private:
    void createTollBar();

private:
    QPixmap pic;
    QToolBar * toolBar;
  • widget.cpp
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->createTollBar();
    this->resize(400,500);
}
  • 添加按钮及图标
void Widget::createTollBar()
{
    this->toolBar = new QToolBar(this);

    //打开图片
    QAction *openAct = new QAction(QIcon("://Icon/open.png"),"打开图片");
    this->toolBar->addAction(openAct);

    //还原
    QAction *recoverAct = new QAction(QIcon("://Icon/recover.png"),"还原图片");
    this->toolBar->addAction(recoverAct);

    //灰图
    QAction *grayAct = new QAction(QIcon("://Icon/gray.png"),"灰图处理");
    this->toolBar->addAction(grayAct);

    //反转
    QAction *invertnAct = new QAction(QIcon("://Icon/Invert colors.png"),"颜色反转");
    this->toolBar->addAction(invertnAct);

    //模糊
    QAction *blurAct = new QAction(QIcon("://Icon/blurring.png"),"模糊处理");
    this->toolBar->addAction(blurAct);

    //马赛克
    QAction *mosaicAct = new QAction(QIcon("://Icon/mosaic.png"),"马赛克处理");
    this->toolBar->addAction(mosaicAct);

    //水墨
    QAction *inkAct = new QAction(QIcon("://Icon/ink painting.png"),"水墨处理");
    this->toolBar->addAction(inkAct);
}

image-20230904144248136

2 打开图片

  • widget.h中添加槽
public slots:
    void openPic();
  • widget.cpp中实现
void Widget::openPic()
{
    QString filePath = QFileDialog::getOpenFileName(this,"打开图片","./","image(*.png *.jpg *.bmp");
    this->pic = QPixmap(filePath);
    this->resize(this->pic.size());
}
  • 然后在createToolBar函数中连接
    //打开图片
    QAction *openAct = new QAction(QIcon("://Icon/open.png"),"打开图片");

    //连接信号
    connect(openAct,&QAction::triggered,this,&Widget::openPic);
    this->toolBar->addAction(openAct);

image-20230904150102099

不过此时添加后图片还无法显示

3 显示图片

  • widget.h中重写画图的虚函数
protected:
    //重写虚函数
    void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
  • widget.cpp
void Widget::paintEvent(QPaintEvent *event)
{
    //显示在当前窗口
    QPainter p(this);
    //绘制图片
    p.drawPixmap(0,0,this->pic.width(),this->pic.height(),this->pic);
    QWidget::paintEvent(event);
}

image-20230904151536324

4 灰度处理

  • widget.h
    void grayPic();
  • widget.cpp
void Widget::grayPic()
{
    QImage image = this->pic.toImage();
    image.convertToFormat(QImage::Format_ARGB32);//转换成ARGB32以方便设置颜色
    //分辨遍历长和宽,因为图片长方形
    for(int i=0; i<=image.width();i++)
    {
        for(int j=0;j<image.height();j++)
        {
            //每个像素点都修改
            QRgb pixel = image.pixel(i,j);
            //平均值
            int avg = qGray(pixel);
            image.setPixel(i,j,qRgb(avg,avg,avg));
        }
    }
    this->pic = QPixmap::fromImage(image);
    //重新画图
    this->update();
}
  • createToolBar函数,连接信号
    //灰图
    QAction *grayAct = new QAction(QIcon("://Icon/gray.png"),"灰图处理");
    connect(grayAct,&QAction::triggered,this,&Widget::grayPic);
    this->toolBar->addAction(grayAct);

image-20230904152803901

5 颜色反转

  • widget.h
    void invertnPic();
  • widget.cpp
void Widget::invertnPic()
{
    QImage image = this->pic.toImage();
    image.convertToFormat(QImage::Format_ARGB32);//转换成ARGB32以方便设置颜色
    //分辨遍历长和宽,因为图片长方形
    for(int i=0; i<=image.width();i++)
    {
        for(int j=0;j<image.height();j++)
        {
            //每个像素点都修改
            QColor pixel = image.pixelColor(i,j);

            int r = pixel.red();
            int g = pixel.green();
            int b = pixel.blue();

            QColor newColor((255-r),(255,g),(255-b));
            image.setPixelColor(i,j,newColor);
        }
    }
    this->pic = QPixmap::fromImage(image);
    //重新画图
    this->update();
}
  • createToolBar函数,连接信号
    //反转
    QAction *invertnAct = new QAction(QIcon("://Icon/Invert colors.png"),"颜色反转");
    connect(invertnAct,&QAction::triggered,this,&Widget::invertnPic);
    this->toolBar->addAction(invertnAct);

image-20230904154033208

6 马赛克

  • widget.h
    void mosaicPic();
  • widget.cpp
void Widget::mosaicPic()
{
    QImage image = this->pic.toImage();
    image.convertToFormat(QImage::Format_ARGB32);//转换成ARGB32以方便设置颜色
    //分辨遍历长和宽,因为图片长方形
    int w = image.width()%SIZE;
    int h = image.height()%SIZE;
    for(int i=0; i<=image.width()-w;i+=SIZE)
    {
        for(int j=0;j<image.height()-h;j+=SIZE)
        {
            //每个像素点都修改
            int r=0,g=0,b=0;
            for(int m = i;m<i+SIZE;m++)
            {
                for(int n = j;n<j+SIZE;n++)
                {
                    QColor c = image.pixelColor(m,n);
                    r+=c.red();
                    g+=c.green();
                    b+=c.blue();
                }
            }
            QColor newColor(r/(SIZE*SIZE),g/(SIZE*SIZE),b/(SIZE*SIZE));
            for(int m = i;m<i+SIZE;m++)
            {
                for(int n = j;n<j+SIZE;n++)
                {
                    image.setPixelColor(m,n,newColor);
                }
            }
        }
    }
    this->pic = QPixmap::fromImage(image);
    //重新画图
    this->update();
}
  • createToolBar函数,连接信号
    //马赛克
    QAction *mosaicAct = new QAction(QIcon("://Icon/mosaic.png"),"马赛克处理");
    connect(mosaicAct,&QAction::triggered,this,&Widget::mosaicPic);
    this->toolBar->addAction(mosaicAct);

image-20230904162403774

  • createToolBar函数,连接信号
    //马赛克
    QAction *mosaicAct = new QAction(QIcon("://Icon/mosaic.png"),"马赛克处理");
    connect(mosaicAct,&QAction::triggered,this,&Widget::mosaicPic);
    this->toolBar->addAction(mosaicAct);

[外链图片转存中…(img-xxswHv9g-1696602317319)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1064562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3D孪生场景搭建:模拟仿真

前面几期文章介绍如何使用NSDT 编辑器 搭建3D应用场景&#xff0c;本期介绍下孪生场景中一个一个非常重要的功能&#xff1a;模拟仿真。 1、什么是模拟仿真 模拟仿真是一种用于描述、分析和模拟现实世界中系统、过程或事件的计算机模型和程序。仿真通过输入各种参数和条件&am…

雷达电子箔条干扰和雷达诱饵简介

一、JAMMING 利用箔条、角反射器和诱饵进行机械干扰。 1、箔条(Chaff) 箔条是一种雷达干扰,在这种干扰中,飞机或其他目标散布一团薄薄的铝、金属化玻璃纤维或塑料,它们要么作为一组主要目标出现在雷达屏幕上,要么以多次回击淹没屏幕。 图1 箔条 2、箔条的雷达散射截面…

[算法应用]关键路径算法的简单应用

(0)免责声明: 算法和数据结构都是我自己写的,为了提交这次的作业,所以把去年写过的算法重新翻新了一下,数据结构也简单整理了一下,重新放上来了. 整个程序是可以顺利跑通的,同学们可以用代码检测一下自己的结果对不对,切勿抄袭. (真的不想手推关键路径了....真的....不过复习…

2023-10-06 LeetCode每日一题(买卖股票的最佳时机含手续费)

2023-10-06每日一题 一、题目编号 714. 买卖股票的最佳时机含手续费二、题目链接 点击跳转到题目位置 三、题目描述 给定一个整数数组 prices&#xff0c;其中 prices[i]表示第 i 天的股票价格 &#xff1b;整数 fee 代表了交易股票的手续费用。 你可以无限次地完成交易&…

C++转换函数

什么是转换函数? C转换函数是一种特殊的成员函数&#xff0c;用于将一个类的对象转换为另一个类型。它是通过在类中定义特定的函数来实现的。 转换函数的用途&#xff1a; 类型转换&#xff1a;转换函数可以将一个类的对象从一种类型转换为另一种类型。这样可以方便地在不同…

前端还不会低代码?快来学习这5个开源的前端低代码项目

GoView GoView是一个开源项目&#xff0c;其技术栈基于Vue3、TypeScript4、Vite2、NaiveUI、ECharts5和Axios。该项目通过Vue组件实现数据中动态刷新渲染&#xff0c;且其内部图表可以自由替换。 项目地址&#xff1a; https://gitee.com/dromara/go-view 以下是GoView开源项目…

【C++设计模式之备忘录模式:行为型】分析及示例

简介 备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型设计模式&#xff0c;它用于保存和恢复对象的状态。备忘录模式通过将对象的状态封装成一个备忘录&#xff08;Memento&#xff09;&#xff0c;并将备忘录保存在一个管理者&#xff08;Caretaker&#xff…

结构化面试 --- 介绍 + 人际关系

目录 一、介绍 1、认识考试 2、认识考官 3、认识对手 4、认识考场 5、认识规则 6、如何备考 二、人际关系 练习题 第一题&#xff08;换岗&#xff09; 第二题&#xff08;办法&#xff09; 第三题&#xff08;相处&#xff09; 第四题 第五题 第六题 …

初级数值计算理论总结

本文用于总结复习与研究生面试 一问&#xff0c;小伙子会不会数值计算啊一答&#xff1a;会二问&#xff1a;哦&#xff0c;讲讲看二答&#xff1a;讲不出来三问&#xff1a;...... 数值求根 二分法Jacobi 迭代法 Jacobi 迭代改进算法&#xff08;事后加速法&#xff09;&#…

[架构之路-228]:目标系统 - 纵向分层 - 计算机硬件与体系结构 - 硬盘存储结构原理:如何表征0和1,即如何存储0和1,如何读数据,如何写数据(修改数据)

目录 前言&#xff1a; 一、磁盘的盘面组成 1.1 磁盘是什么 ​编辑1.2 磁盘存储介质 1.3 磁盘数据的组织 1.3.1 分层组织&#xff1a;盘面号 1.3.2 扇区和磁道 1.3.3 数据 1.3.4 磁盘数据0和1的存储方式 1.3.5 磁盘数据0和1的修正方法 1.3.6 磁盘数据0和1的读 二、…

【AI视野·今日Robot 机器人论文速览 第四十九期】Fri, 6 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Fri, 6 Oct 2023 Totally 29 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;ContactGen, 基于生成模型的抓取手势生成&#xff0c;类人五指手。(from 伊利诺伊大学 香槟) 数据集&#xff1a;GRAB da…

多线程 - 定时器

多线程 - 定时器 定时器的背景知识 定时器 ~~ (就类似于定闹钟) 平时的闹钟,有两种风格: 指定特定时刻,提醒指定特定时间段之后,提醒 这里的“定时器”,不是提醒,而是执行一个实现准备好的方法/代码,它是开发中一个常用的组件,尤其是在网络编程的时候,使用浏览器上网,打开…

【立体视觉(五)】之立体匹配与SGM算法

【立体视觉&#xff08;五&#xff09;】之立体匹配与SGM算法 一、立体匹配一&#xff09;基本步骤二&#xff09;局部立体匹配三&#xff09;全局立体匹配四&#xff09;评价标准1. 均方误差(RMS)2. 错误匹配率百分比(PBM) 二、半全局(SGM)立体匹配一&#xff09;代价计算二&a…

雷达干扰和烧穿范围简介

一、干扰信号比 J/S或J-to-S是从目标发射的干扰信号接收的功率(J)与从目标的雷达反向散射接收的功率的比率。 二、烧穿范围 通过电子攻击(J)可以首先检测到目标回波信号(S)的雷达到目标的距离。 三、自保护干扰 也称为主瓣干扰(雷达回波源和干扰机并置)。 烧穿范围…

汽车驾驶任务的隐马尔可夫模型识别方法研究

汽车驾驶任务的隐马尔可夫模型识别方法研究 一、Introduction 自动驾驶汽车经过了几十年的发展&#xff0c;是目前国内外汽车行业中的重要研究方向。自 动驾驶汽车的智能化需要车辆能够有类“人”的行为&#xff0c;在决策策略上可以满足人的心理 需求。人在驾驶过程中&#…

Aasee Api开放平台上线啦!

使用方法 首先介绍使用方法&#xff0c;只需导入一个SDK即可使用实现调用第三方的接口&#xff0c;那如何导入SDK呢&#xff0c;目前jar已经上传至maven中心仓库可直接引入到pom文件中使用&#xff0c;下面是例子&#xff1a; <dependency><groupId>io.github.Aa…

攻防世界-T1 Training-WWW-Robots

文章目录 步骤1步骤二结束语 步骤1 看到文本——>提取有效信息——>利用有效信息 文本&#xff1a;In this little training challenge, you are going to learn about the Robots_exclusion_standard. The robots.txt file is used by web crawlers to check if they …

jar 命令启动java 指定配置文件路径 jar如何启动

一、各种启动方式 1.java -jar # 例子 java -jar test.jar 1. 2. 这是最简单的启动方式&#xff0c;同时弊端也是很多的。 弊端1&#xff1a;exit 退出终端会导致java进程中断。 弊端2&#xff1a;ctrlc 退出启动展示页会导致java进程中断。 弊端3&#xff1a;直接关闭终端会…

FREERTOS内容解惑与综合应用(基于STM32F103)

本文基础内容参考的是正点原子的FREERTOS课程。 这是基于HAL库的 正点原子手把手教你学FreeRTOS实时系统 这是基于标准库的 正点原子FreeRTOS手把手教学-基于STM32 基础知识&#xff0c;直接参考正点原子《FreeRTOS开发指南V1.1》基于标准库的&#xff0c;此处不再赘述。 本文…

【Java 进阶篇】HTML介绍与软件架构相关知识详解

HTML&#xff08;Hypertext Markup Language&#xff09;是一种用于创建网页的标记语言。它是互联网上信息传递和展示的基础&#xff0c;无论是在浏览器中查看网页还是在移动设备上浏览应用程序&#xff0c;HTML都扮演着关键角色。本文将向您介绍HTML的基础知识&#xff0c;并探…