当前位置: 首页 > news >正文

十七、【文本编辑器(三)】图像坐标变换


目录

一、缩放功能

二、旋转功能

三、镜像功能

四、QMatrix简单介绍


一、缩放功能

(1)在头文件中添加 “protected slots:" 变量:

void ShowZoomln( );

(2)在 createActionso函数的最后添力口事件关联:

connect(zoomlnAction,SIGNAL(triggered()),this,SLOT(ShowZoomln()));

(3) 实现图形放大功能的函数 ShowZoomIn() 如下:

void ImgProcessor::ShowZoomln( )
{if(img.isNull())return;QMatrix martix;martix.scale(2,2);img = img.transformed(martix);showWidget->imageLabel->setPixmap(QPixmap::fromlmage(img));
}

解析:

  • if(img.isNull( )) 有效性判断。
  • QMatrix martix、martix.scale(2,2)、img = img.transformed(martix):声明一个 QMatrix 类的实例,按照两倍比例对水平和垂直方向进行放大,并将当前显示的图形按照该坐标矩阵进行转换。
  • QMatrix & QMatrix::scale(qreal sx,qreal sy)函数返回缩放后的 matrix 对象引用,若要实现两倍比例的缩小,则参数 SX 和 sy 改为 0.5 即可。
  • showWidget->imageLabeI->setPixmap(QPixmap::fromImage(img)):重新设置显示图形。

(4) 在头文件中添加 “protected slots:” 变量:

void ShowZoomOut( );

(5) 在 createActions() 函数的最后添加事件关联:

connect(zoomOutAction,SIGNAL(triggered()),this,SLOT(ShowZoomOut()));

(6) 实现图形缩小功能的函数 ShowZoomOuto如下:

void ImgProcessor::ShowZoomOut()
{if(img.isNull())return;QMatrix matrix;matrix.scale(0.5, 0.5);img = img.transformed(matrix);showWidget->imageLabel->setPixmap(QPixmap::fromlmage(img));
}

(7) 运行程序,单击“编辑”->“放大”命令或单击工具栏上的按钮,界面效果如下图所示。

二、旋转功能

        ShowRotate90()函数实现的是图形的旋转,此函数实现坐标的逆时针旋转 90°。具体实现步骤如下。

(1)在头文件中添加 “protected slots:” 变量:

void ShowRotate90();

(2)在 createActionso函数的最后添加事件关联:

connect(rotate90ActionzSIGNAL(triggered( )),this,SLOT(ShowRotate90()));

(3)ShowRotate90()函数的具体实现代码如下:

void ImgProcessor::ShowRotate90()
{if(img.isNull())return;QMatrix matrix;matrix.rotate(90);img = img.transformed(matrix);showWidget->imageLabel->setPixmap(QPixmap::fromlmage(img));
}

   transformed() 函数是 QPixmap 类的成员函数,用于将当前图片按照给定的变换矩阵进行变换。这个函数会返回一个新的 QPixmap 对象,表示经过变换后的图片。

        类似地,实现旋转 180° 和 270°功能也是相似的代码。

(4)运行程序,单击“旋转”->“旋转 90。”命令或单击工具栏上的按钮,图像旋转效果如下图所示。

三、镜像功能

        ShowMiirorVertical()函数实现的是图形的纵向镜像,ShowMirrorHorizontal()实现的则是横向镜像。通过 QImage::mirrored(bool horizontal,bool vertical)实现图形的镜像功能,参数 horizontal 和 vertical 分别指定了镜像的方向。具体实现步骤如下。

(1)在头文件中添加 “protected slots:" 变量:

void ShowMirrorVertical();
void ShowMirrorHorizontal();

(2) 在 createActions() 函数的最后添加事件关联:

connect(mirrorVerticalAction,SIGNAL(triggered()),this,SLOT(ShowMirrorVertical()));
connect(mirrorHorizontalAction,SIGNAL(triggered()),this,SLOT(ShowMirrorHorizontai()));

(3)ShowMirrorVertical ()、ShowMirrorHorizontal ()函数的具体实现代码如下:

void ImgProcessor::ShowMirrorVertical()
{if(img.isNull())return;img=img.mirrored(false,true);showWidget->imageLabel->setPixmap(QPixmap::fromlmage(img));
}
void ImgProcessor::ShowMirrorHorizontal()
{if(img.isNull())return;img=img.mirrored(true,false);showWidget->imageLabel->setPixmap(QPixmap::fromlmage(img));
}

(4)此时运行程序,单击“镜像”->"横向镜像" 命令,显示效果如下图所示。

四、QMatrix简单介绍

        QMatrix是Qt框架中的一个类,用于表示2D变换矩阵。通过QMatrix类,可以进行平移、旋转、缩放等2D变换操作,常用于Qt中的绘图操作。

(1)translate(dx, dy): 平移变换示例

#include <QMatrix>int main() {QMatrix matrix;matrix.translate(100, 100); // 在水平方向上平移100个单位,在垂直方向上平移100个单位// 应用变换后,matrix表示的是一个将坐标系向右平移100个单位,向下平移100个单位的变换矩阵return 0;
}

(2)rotate(angle): 旋转变换示例

#include <QMatrix>int main() {QMatrix matrix;matrix.rotate(45); // 逆时针旋转45度// 应用变换后,matrix表示的是一个逆时针旋转45度的变换矩阵return 0;
}

(3)scale(sx, sy): 缩放变换示例

#include <QMatrix>int main() {QMatrix matrix;matrix.scale(2, 2); // 水平和垂直方向都放大两倍// 应用变换后,matrix表示的是一个将坐标系在水平和垂直方向都放大两倍的变换矩阵return 0;
}

(4)shear(sh, sv): 剪切变换示例

#include <QMatrix>int main() {QMatrix matrix;matrix.shear(0.5, 0); // 水平方向上剪切因子为0.5,垂直方向上剪切因子为0// 应用变换后,matrix表示的是一个在水平方向上剪切因子为0.5的变换矩阵return 0;
}

(5)reset(): 重置矩阵示例

#include <QMatrix>int main() {QMatrix matrix;matrix.translate(100, 100);matrix.reset(); // 重置矩阵为单位矩阵,即恢复到没有任何变换的状态return 0;
}

(6)map(point): 点映射示例

#include <QMatrix>
#include <QPointF>int main() {QMatrix matrix;matrix.translate(100, 100);QPointF point(50, 50);QPointF transformedPoint = matrix.map(point); // 将点(50, 50)应用变换后得到的新点return 0;
}

      

相关文章:

十七、【文本编辑器(三)】图像坐标变换

目录 一、缩放功能 二、旋转功能 三、镜像功能 四、QMatrix简单介绍 一、缩放功能 &#xff08;1&#xff09;在头文件中添加 “protected slots:" 变量&#xff1a; void ShowZoomln( ); &#xff08;2&#xff09;在 createActionso函数的最后添力口事件关联&…...

生活中生智慧

【 圣人多过 小人无过 】 觉得自己做得不够才能做得更好&#xff0c;互相成全&#xff1b;反求诸己是致良知的第一步&#xff1b;有苦难才能超越自己&#xff0c;开胸怀和智慧&#xff1b;不浪费任何一次困苦&#xff0c;危机中寻找智慧&#xff0c;成长自己。 把困苦当作当下…...

2024第18届中国西部(成都)教育装备展12月14日举办

2025中国国际工业气体设备技术及应用展览会 2025 China International Industrial Gas Equipment Technology and Application Exhibition 时间&#xff1a;2025年3月18-20日 地点&#xff1a;北京全国农业展览馆&#xff08;新馆&#xff09; 展览前言 随着需求市场的持续…...

Webpack看这篇就够了

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...

基于京东电商蓝牙耳机产品评论数据的情感分析与文本分析

摘要 随着电子商务的迅速发展&#xff0c;了解用户对产品的意见和情感倾向对企业至关重要。本研究旨在利用Python大数据技术对电商产品评论进行情感分析和主题建模&#xff0c;为企业提供有价值的市场洞察。 通过爬虫获取电商评论数据&#xff0c;使用pandas清洗和预处理数据&a…...

【Linux网络】poll{初识poll / poll接口 / poll vs select / poll开发多客户端echo服务器}

文章目录 1.初识pollpoll与select的主要联系与区别poll的原理poll的优点poll的缺点poll vs select 2.poll开发多客户端echo服务器封装套接字接口Makefile主函数日志服务聊天服务器 1.初识poll poll是Linux系统中的一个系统调用&#xff0c;它用于监控多个文件描述符&#xff08…...

数据库db文件损坏修复方法(sqlite3:database disk image is malformed)

参考博客&#xff1a; https://www.cnblogs.com/liuyangQAQ/p/18037546 sqlite3数据库提示database disk image is malformed 解决办法-CSDN博客 【SQL】sqlite数据库损坏报错&#xff1a;database disk image is malformed&#xff08;已解决&#xff09;-CSDN博客 一、第…...

Prometheus 云原生 - 微服务监控报警系统 (Promethus、Grafana、Node_Exporter)部署、简单使用

目录 开始 Prometheus 介绍 基本原理 组件介绍 下文部署组件的工作方式 Prometheus 生态安装&#xff08;Mac&#xff09; 安装 prometheus 安装 grafana 安装 node_exporter Prometheus 生态安装&#xff08;Docker&#xff09; 安装 prometheus 安装 Grafana 安装…...

Spring源码注解篇三:深入理解@Component注解

Component及其派生注解的源码 Spring框架作为Java开发中不可或缺的一部分&#xff0c;其依赖注入机制的核心是通过注解来实现的。本文将深入探讨Spring中Component及其派生注解的源码实现&#xff0c;分析Spring如何通过类路径扫描&#xff08;Classpath Scanning&#xff09;和…...

SpringBoot中常用的注解及其用法

1. 常用类注解 RestController和Controller是Spring中用于定义控制器的两个类注解. 1.1 RestController RestController是一个组合类注解,是Controller和ResponseBody两个注解的组合,在使 用 RestController 注解标记的类中&#xff0c;每个方法的返回值都会以 JSON 或 XML…...

【大语言模型】私有化搭建-企业知识库-知识问答系统

下面是我关于大语言模型学习的一点记录 目录 人工智能学习路线 MaxKB 系统(基于大语言模型的知识问答系统) 部署开源大语言模型LLM 1.CPU模式(没有好的GPU&#xff0c;算力和效果较差) 2.GPU模式&#xff08;需要有NVIDIA显卡支持&#xff09; Ollama网络配置 Ollama前…...

CSS常用的样式

字体和文本样式 font-family: 定义文本字体。 font-size: 设置字体大小。 color: 设置文本颜色。 text-align: 水平对齐文本&#xff08;左对齐、右对齐、居中、两端对齐&#xff09;。 line-height: 设置行间距。 text-decoration: 控制文本装饰线&#xff08;如下划线、…...

结合实体类型信息(2)——基于本体的知识图谱补全深度学习方法

1 引言 1.1 问题 目前KGC和KGE提案的两个主要缺点是:(1)它们没有利用本体信息;(二)对训练时未见的事实和新鲜事物不能预测的。 1.2 解决方案 一种新的知识图嵌入初始化方法。 1.3 结合的信息 知识库中的实体向量表示&#xff0b;编码后的本体信息——>增强 KGC 2基…...

如何在电脑上演示手机上APP,远程排查移动端app问题

0序&#xff1a; 对接客户&#xff0c;给领导演示移动端产品&#xff0c;或者远程帮用户排查移动端产品的问题。都需要让别人能够看到自己在操作手机。 会议室可以使用投屏&#xff0c;但需要切换电脑和手机。 排查问题经常都是截图、或者手机上录制视频&#xff0c;十分繁琐…...

SQL Server 创建用户并授权

创建用户前需要有一个数据库&#xff0c;创建数据库命令如下&#xff1a; CREATE DATABASE [数据库名称]; CREATE DATABASE database1; 一、创建登录用户 方式1&#xff1a;SQL命令 命令格式&#xff1a;CREATE LOGIN [用户名] WITH PASSWORD 密码; 例如&#xff0c;创建…...

网关设备BL122实现Modbus RTU/TCP转Profinet协议

Modbus与Profinet是两种广泛应用于工业自动化领域的通信协议&#xff1a;Modbus因其简单性和兼容性&#xff0c;在许多工业设备中得到广泛应用&#xff1b;而Profinet提供了高速、高精度的通信能力&#xff0c;适合于复杂控制系统和实时应用&#xff0c;但两者之间的差异导致了…...

采购管理软件:改善初创企业的采购流程

说到初创企业&#xff0c;人们往往会联想到一个宽松的工作环境&#xff0c;缺乏严格的流程规范&#xff0c;以及公司收入的迅猛增长。这种快速增长可能会被认为会导致工作流程的无序和缺乏结构&#xff0c;使得员工在决策上具有较大的自由度&#xff0c;例如在采购方面。 在这…...

Python 是一种用途广泛的编程语言,应用于各个领域

1. 网络和互联网开发: Python 拥有丰富的框架和库&#xff0c;使其成为 Web 开发的理想选择。 框架: Django 和 Pyramid 用于构建复杂的 Web 应用。Flask 和 Bottle 则适合轻量级应用和 API。 库: Python 标准库支持处理 HTML、XML、JSON 和电子邮件。此外&#xff0c;还有强大…...

【VUE】9、VUE项目中使用VUEX完成状态管理

Vuex 是一个专为 Vue.js 应用程序设计的状态管理模式&#xff0c;它帮助开发者更有效地管理组件间共享的状态。在 Vue 项目中使用 Vuex&#xff0c;可以解决复杂应用中状态管理的困扰&#xff0c;确保状态变更的可追踪性和一致性。 1、Vuex 核心概念 State&#xff08;状态&a…...

【eNSP模拟实验】单臂路由实现VLAN间通信

实验需求 如下图所示&#xff0c;辅导员办公室需要访问处在不同vlan的学生管理服务器的文件&#xff0c;那么如何实现两台终端相互通信呢&#xff1f;我们可以使用单臂路由的方式来实现。 单臂路由&#xff08;router-on-a-stick&#xff09;是指在路由器的一个接口上通过配置…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...

实战设计模式之模板方法模式

概述 模板方法模式定义了一个操作中的算法骨架&#xff0c;并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下&#xff0c;重新定义算法中的某些步骤。简单来说&#xff0c;就是在一个方法中定义了要执行的步骤顺序或算法框架&#xff0c;但允许子类…...

数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)

目录 &#x1f50d; 若用递归计算每一项&#xff0c;会发生什么&#xff1f; Horners Rule&#xff08;霍纳法则&#xff09; 第一步&#xff1a;我们从最原始的泰勒公式出发 第二步&#xff1a;从形式上重新观察展开式 &#x1f31f; 第三步&#xff1a;引出霍纳法则&…...