Qt实现 图片处理器PictureEdit

目录

  • 图片处理器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.mzph.cn/news/97347.shtml

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

相关文章

【赠书活动】如何让AI在企业多快好省的落地

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

【LeetCode: 2034. 股票价格波动 | 有序表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

[极客大挑战 2019]BabySQL 1

#做题方法# 进去之后做了简单的注入发现有错误回显&#xff0c;就进行注入发现过滤了sql语 后面进行了双写and payload&#xff1a; ?usernameadmin%27%20aandnd%20updatexml(1,concat(0x7e,dAtabase(),0x7e,version()),1)%20--&passwordadmi 接下来又 ?usernameadm…

yolov5及yolov7实战之剪枝

之前有讲过一次yolov5的剪枝&#xff1a;yolov5实战之模型剪枝_yolov5模型剪枝-CSDN博客 当时基于的是比较老的yolov5版本&#xff0c;剪枝对整个训练代码的改动也比较多。最近发现一个比较好用的剪枝库&#xff0c;可以在不怎么改动原有训练代码的情况下&#xff0c;实现剪枝的…

李沐深度学习记录5:13.Dropout

Dropout从零开始实现 import torch from torch import nn from d2l import torch as d2l# 定义Dropout函数 def dropout_layer(X, dropout):assert 0 < dropout < 1# 在本情况中&#xff0c;所有元素都被丢弃if dropout 1:return torch.zeros_like(X)# 在本情况中&…

超自动化加速落地,助力运营效率和用户体验显著提升|爱分析报告

RPA、iPaaS、AI、低代码、BPM、流程挖掘等在帮助企业实现自动化的同时&#xff0c;也在构建一座座“自动化烟囱”。自动化工具尚未融为一体&#xff0c;协同价值没有得到释放。Gartner于2019年提出超自动化&#xff08;Hyperautomation&#xff09;概念&#xff0c;主要从技术组…

【动手学深度学习】课程笔记 04 数据操作和数据预处理

目录 数据操作 N维数组样例 访问元素 数据操作实现 入门 运算符 广播机制 节省内存 转换为其他Python对象 数据预处理实现 数据操作 N维数组是机器学习和神经网路的主要数据结构。 N维数组样例 访问元素 数据操作实现 下面介绍一下本课程中需要用到的PyTorch相关操…

BJT晶体管

BJT晶体管也叫双极结型三极管&#xff0c;主要有PNP、NPN型两种&#xff0c;符号如下&#xff1a; 中间的是基极&#xff08;最薄&#xff0c;用于控制&#xff09;&#xff0c;带箭头的是发射极&#xff08;自由电子浓度高&#xff09;&#xff0c;剩下的就是集电极&#xff0…

no Go files in ...问题

golang项目&#xff0c;当我们微服务分模块开发时&#xff0c;习惯把main.go放在cmd目录下分模块放置&#xff0c;此时&#xff0c;我们在项目根目录下执行go test . 或go build . 时会报错“no Go files in ...”, 这是因为在.目录下找不到go程序&#xff0c;或者找不到程序入…

springboot整合pi支付开发

pi支付流程图&#xff1a; 使用Pi SDK功能发起支付由 Pi SDK 自动调用的回调函数&#xff08;让您的应用服务器知道它需要发出批准 API 请求&#xff09;从您的应用程序服务器到 Pi 服务器的 API 请求以批准付款&#xff08;让 Pi 服务器知道您知道此付款&#xff09;Pi浏览器向…

【排序算法】堆排序详解与实现

一、堆排序的思想 堆排序(Heapsort)是指利用堆积树&#xff08;堆&#xff09;这种数据结构所设计的一种排序算法&#xff0c;它是选择排序的一种。它是通过堆&#xff08;若不清楚什么是堆&#xff0c;可以看我前面的文章&#xff0c;有详细阐述&#xff09;来进行选择数据&am…

论文阅读-- A simple transmit diversity technique for wireless communications

一种简单的无线通信发射分集技术 论文信息&#xff1a; Alamouti S M. A simple transmit diversity technique for wireless communications[J]. IEEE Journal on selected areas in communications, 1998, 16(8): 1451-1458. 创新性&#xff1a; 提出了一种新的发射分集方…

WEB各类常用测试工具

一、单元测试/测试运行器 1、Jest 知名的 Java 单元测试工具&#xff0c;由 Facebook 开源&#xff0c;开箱即用。它在最基础层面被设计用于快速、简单地编写地道的 Java 测试&#xff0c;能自动模拟 require() 返回的 CommonJS 模块&#xff0c;并提供了包括内置的测试环境 …

华为OD机试 - 最小步骤数(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入&#xff1a;4 8 7 5 2 3 6 4 8 12、输出&#xff1a;23、说明&#xff1a;4、思路分析 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《…

aarch64 平台 musl gcc 工具链手动编译方法

目标 手动编译一个 aarch64 平台的 musl gcc 工具链 musl libc 与 glibc、uclibc 等,都是 标准C 库, musl libc 是基于系统调用之上的 标准C 库,也就是用户态的 标准C 库。 musl libc 轻量、开源、免费,是一些 操作系统的选择,当前 Lite-OS 与 RT-Smart 等均采用自制的 mu…

【Vue面试题八】、为什么data属性是一个函数而不是一个对象?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;为什么data属性是一个函…

Spring实例化源码解析之Custom Events上集(八)

Events使用介绍 在ApplicationContext中&#xff0c;事件处理通过ApplicationEvent类和ApplicationListener接口提供。如果将实现ApplicationListener接口的bean部署到上下文中&#xff0c;每当一个ApplicationEvent被发布到ApplicationContext时&#xff0c;该bean将被通知。…

使用企业订货系统后的效果|软件定制开发|APP小程序搭建

使用企业订货系统后的效果|软件定制开发|APP小程序搭建 企业订货系统是一种高效的采购管理系统&#xff0c;它可以帮助企业更好地管理采购流程&#xff0c;降低采购成本&#xff0c;提高采购效率。 可以帮助企业提高销售效率和降低成本的软件工具。使用该系统后&#xff0c;企业…

如何使用 Tensor.art 实现文生图

摘要&#xff1a;Tensor.art 是一个基于 AI 的文本生成图像工具。本文介绍了如何使用 Tensor.art 来实现文生图的功能。 正文&#xff1a; 文生图是指将文本转换为图像的技术。它具有广泛的应用&#xff0c;例如在广告、教育和娱乐等领域。 Tensor.art 是一个基于 AI 的文本…

强制删除文件?正确操作方法分享!

“我昨天在删除文件时有个文件一直删除不掉。想用强制删除的方法来把它删掉&#xff0c;应该怎么操作呢&#xff1f;谁能教教我呀&#xff1f;” 在使用电脑的过程中&#xff0c;我们有时候可能会发现文件无论怎么删除都无法删掉&#xff0c;如果我们想要强制删除文件但不知道怎…