Qt 实现橡皮擦拭显示图片

1.简介

在一些游戏中看见类似解密破案的效果,使用手触摸去擦拭图片上的灰尘,然后显示最终的图片,所以也想试试Qt实现的效果。大家有自己想做的效果,都可以尝试。

以下是效果展示图。

可以控制橡皮擦的大小,进行擦拭。

2.原理

鼠标按住,然后移动,不断的给移动的圆形区域设置像素点的值,显示图片。

源码:

#include "wipewidget.h"
#include "ui_wipewidget.h"
#include <QDebug>

WipeWidget::WipeWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::WipeWidget)
{
    ui->setupUi(this);

    setMouseTracking(true);
}

WipeWidget::~WipeWidget()
{
    delete ui;
}

void WipeWidget::setEraserSize(int size)
{
    m_eraserSize = size;
    m_point = QPoint(this->width()/2,this->height()/2);

    update();
}

void WipeWidget::paintEvent(QPaintEvent *e)
{
    Q_UNUSED(e);
    //画圆圈
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true); // 启用抗锯齿
    painter.drawImage(0,0,m_image);

    QPen pen;
    pen.setWidth(2);
    pen.setColor(Qt::white);
    painter.setPen(pen);

    qDebug()<<"";
    painter.drawEllipse(m_point,m_eraserSize,m_eraserSize);

    if(m_isMousePressed)
        setImage(m_point);
}

void WipeWidget::mousePressEvent(QMouseEvent *event)
{
    m_isMousePressed = true;
}

void WipeWidget::mouseReleaseEvent(QMouseEvent *event)
{
    Q_UNUSED(event);
    m_isMousePressed = false;
}

void WipeWidget::mouseMoveEvent(QMouseEvent *event)
{
    m_point = event->pos();
    update();
}

void WipeWidget::showEvent(QShowEvent *event)
{
    Q_UNUSED(event);
    if(m_isInit)
       return;

    m_isInit = true;
    m_srcImage = QImage("./demo.jpeg").scaled(this->width(),this->height());
    m_image = QImage(m_srcImage.width(),m_srcImage.height(),m_srcImage.format());
}

void WipeWidget::setImage(QPoint point)
{
    int centerX = point.x();
    int centerY = point.y();

    if(centerX > m_srcImage.width() ||
       centerY > m_srcImage.height())
        return;

    int radius = m_eraserSize;

    for (int x = qMax(centerX - radius,0);
         x < qMin(centerX + radius,m_srcImage.width()); x++)
    {
        for (int y = qMax(centerY - radius,0);
             y < qMin(centerY + radius,m_srcImage.height()); y++)
        {
            if ((x - centerX) * (x - centerX) + (y - centerY) * (y - centerY) <= radius * radius)
            {
                if(x <= m_srcImage.width() && m_srcImage.height()-y <= m_srcImage.height())
                {
                    m_image.setPixel(x,y,m_srcImage.pixel(x, y));
                }
            }
        }
    }
}

3.完整工程

https://download.csdn.net/download/wzz953200463/88906763

4.相关推荐

1.圆形进度条实现

2.麦克风音量大小模拟

3.自定义时钟

4.自定义长条进度条

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python开发工具:pycharm使用注意事项以及设置

上一篇文章写了pycharm的安装以及运行&#xff0c;但是在安装过程中遇到了一些问题&#xff0c;接下来详细解析安装过程中遇到的问题&#xff0c;注意事项以及设置配置依赖等信息 安装遇到的问题&#xff1a; 协议许可证关闭不了&#xff1a;PyCharm安装完成后&#xff0c;打…

低代码平台开发——基于React(文末送书)

目录 小程一言适用对象本书达成 书籍介绍作者简介内容介绍书籍目录阅读指导 小程送书 小程一言 《低代码平台开发——基于React》这本书主要围绕低代码平台和React技术的结合展开&#xff0c;为读者提供了关于低代码平台开发的理论和实践知识。 ## 书中内容简介 书中内容分为…

AI大预言模型——ChatGPT与AI绘图及论文高效写作

原文链接&#xff1a;AI大预言模型——ChatGPT与AI绘图及论文高效写作 2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网…

文件上传之图片马

图片马介绍 图片马&#xff1a;就是在正常图片中插入木马。 图片马的制作 1.我们先创建php木马文件1.php&#xff0c;内容有以下两种方式&#xff1a; <?php eval($_POST[a]); ?> /* 常规一句话木马 */ <?php $aPD9waHAgQGV2YWwoJF9QT1NUWydhJ10pOz8; $myfile…

Python图像处理【21】基于卷积神经网络增强微光图像

基于卷积神经网络增强微光图像 0. 前言1. MBLLEN 网络架构2. 增强微光图像小结系列链接 0. 前言 在本节中&#xff0c;我们将学习如何基于预训练的深度学习模型执行微光/夜间图像增强。由于难以同时处理包括亮度、对比度、伪影和噪声在内的所有因素&#xff0c;因此微光图像增…

Qt::TabWidget

在Tab的右上角添加控件 QPushButton *add new QPushButton; add->setText(""); add->resize(30,30); ui->tabWidget->setCornerWidget(add,Qt::TopRightCorner); 结果&#xff1a; Tab添加子页 QWidget*newp new QWidget; ui->tabWidget->add…

Chain-of-thought prompting(链式思考提示)

1.大模型“涌现”的思维链 最近 AI 大厂的开发人员和高校的 NLP 研究人员&#xff0c;都在琢磨&#xff0c;怎么让大模型“涌现”。 所谓“涌现”&#xff0c;在大模型领域指的是当模型突破某个规模时&#xff0c;性能显著提升&#xff0c;表现出让人惊艳、意想不到的能力。比如…

【进击的算法】动态规划——01背包

&#x1f37f;本文主题&#xff1a;动态规划 01背包 背包问题 C/C 算法 &#x1f388;更多算法&#xff1a;基础回溯算法 基础动态规划 &#x1f495;我的主页&#xff1a;蓝色学者的主页 文章目录 一、前言二、概念✔️动态规划概念✔️01背包的概念 三、问题描述与讲解&#…

《PyTorch深度学习实践》第十一讲卷积神经网络进阶

一、 1、卷积核超参数选择困难&#xff0c;自动找到卷积的最佳组合。 2、1x1卷积核&#xff0c;不同通道的信息融合。使用1x1卷积核虽然参数量增加了&#xff0c;但是能够显著的降低计算量(operations) 3、Inception Moudel由4个分支组成&#xff0c;要分清哪些是在Init里定义…

数据库设计革命:逻辑模型的演变与面向对象的突破

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

C 判断

判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。 C 语言把任何非零和非空的值假定为 true&#xff0c;把零或 null 假定为 false。 下面…

YOLOv7优化改进:下采样创新篇 | 新颖的下采样ADown | YOLOv9

💡💡💡本文独家改进:新颖的下采样ADown来自于YOLOv9,助力YOLOv7,将ADown添加在backbone和head处,提供多个yaml改进方法 💡💡💡在多个私有数据集和公开数据集VisDrone2019、PASCAL VOC实现涨点 收录 YOLOv7原创自研 https://blog.csdn.net/m0_63774211/ca…

Jmeter学习系列之七:并发线程组Concurrency Thread Group详解

一、Concurrency Thread Group的介绍 Concurrency Thread Group提供了用于配置多个线程计划的简化方法该线程组目的是为了保持并发水平,意味着如果并发线程不够,则在运行线程中启动额外的线程和Standard Thread Group不同,它不会预先创建所有线程,因此不会使用额外的内存对…

【数据结构】插入排序详细图解(一看就懂)

&#x1f4af; 博客内容&#xff1a;【数据结构】插入排序详细图解&#xff08;一看就懂&#xff09; &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f989;所属专栏&#xff1a;数据结构笔记 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;…

CleanMyMac X软件的清理效果怎么样?好不好用

在实际使用中&#xff0c;CleanMyMac X的清理效果非常显著。以下是一些实际的使用案例和数据&#xff1a; 清理效果的实例&#xff1a;一位Mac用户反映&#xff0c;他的Mac电脑在使用了三年后&#xff0c;通过CleanMyMac X的清理&#xff0c;成功清除了超过62GB的垃圾数据。这…

Cesium 自定义Primitive - 矩形

一、创作思路 1、创建一个自定义CustomPrimitive 2、然后根据两个点&#xff0c;生成矩形 3、方便后期绘制矩形 二、实现代码 1、在vue的包中加入turf. npm install turf/turf 1、创建一个CustomRectanglePrimitive类,并加入更新的代码 import {Color,GeometryInstance,Groun…

【PPT技巧】PPT怎么设置修改文件密码?

PPT文件制作好了之后&#xff0c;保护内容防止在演示时出错是很重要的&#xff0c;那么如何将PPT文件设置成禁止修改模式呢&#xff1f;今天分享几个方法给大家。 方法一 将PPT文件直接保存或者另存为一份文件&#xff0c;在保存时&#xff0c;将文件格式选择为PowerPoint图片…

win系统如何同时安装MySQL5和MySQL8

win系统如何同时安装MySQL5和MySQL8 文章目录 win系统如何同时安装MySQL5和MySQL81、准备好两种版本的数据库2、下载后解压到你指定的目录3、手动配置安装MySQL5和8安装MySQL53.1创建my.ini文件3.2生成data文件夹 安装MySQL83.1创建my.ini文件3.2生成data文件夹 4、配置环境变量…

【.NET Core】深入理解IO - 读取器和编写器

【.NET Core】深入理解IO - 读取器和编写器 文章目录 【.NET Core】深入理解IO - 读取器和编写器一、概述二、BinaryReader和BinaryWriter2.1 BinartReader类2.2 BinaryWriter类 三、StreamReader和StreamWriter3.1 StreamReader类3.1 StreamWriter类StreamWriter类构造函数Str…

【Datawhale组队学习:Sora原理与技术实战】Attention和LLM

Attention Attention 注意力&#xff0c;从两个不同的主体开始。 论文&#xff1a;https://arxiv.org/pdf/1703.03906.pdf seq2seq代码仓&#xff1a;https://github.com/google/seq2seq 计算方法&#xff1a; 加性Attention&#xff0c;如&#xff08;Bahdanau attention&…