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

Qt纯实现图片处理工具:支持多形态绘制、自适应缩放与背景图功能

Qt实现的包含图片显示功能、自适应缩放、背景图片、画roi工具。 不依赖其他库纯Qt实现。 在图片上可以画矩形、矩形旋转、圆形、同心圆、多边形、直线、卡尺、锚点、清空。 源码 使用Qt5.6.1_MinGW、Qt5.15.1_MinGW、Qt5.15.1_msvc编译通过其他版本请自行尝试。在图像处理工具开发中经常需要实现灵活的ROI标注功能。最近用Qt搓了个轻量级解决方案核心代码不到2000行就实现了九种图形标注。最爽的是不依赖OpenCV等第三方库直接继承QGraphicsView就能玩转各种骚操作。先看自适应缩放的核心实现这里有个小技巧void ImageView::wheelEvent(QWheelEvent* event) { if(event-angleDelta().y() 0) scale(1.2, 1.2); // 滚轮放大 else scale(1/1.2, 1/1.2); // 滚轮缩小 } void ImageView::resizeEvent(QResizeEvent* event) { fitInView(sceneRect(), Qt::KeepAspectRatio); // 窗口缩放时自适应 }这样写的好处是既支持主动缩放又保持宽高比记得要在构造函数里设置setRenderHint(QPainter::SmoothPixmapTransform)让缩放更顺滑。背景图片处理更简单粗暴直接搞个全屏矩形void ImageScene::setBackgroundImage(const QPixmap pixmap) { clearBackground(); m_bgItem addPixmap(pixmap); m_bgItem-setZValue(-1); // 确保在最底层 }重点聊聊旋转矩形的实现这里我踩过的坑值得一说。普通矩形用QRectF就能搞定但旋转时需要自己计算四个顶点QRectF baseRect QRectF(startPoint, endPoint).normalized(); QPolygonF rotatedRect; QTransform transform; transform.rotate(angle_, startPoint.x(), startPoint.y()); // 绕起点旋转 rotatedRect transform.mapToPolygon(baseRect.toRect());这里用QTransform做旋转变换比手动计算坐标省事多了。记得要处理旋转后的碰撞检测可以用QGraphicsPolygonItem代替普通的矩形Item。Qt实现的包含图片显示功能、自适应缩放、背景图片、画roi工具。 不依赖其他库纯Qt实现。 在图片上可以画矩形、矩形旋转、圆形、同心圆、多边形、直线、卡尺、锚点、清空。 源码 使用Qt5.6.1_MinGW、Qt5.15.1_MinGW、Qt5.15.1_msvc编译通过其他版本请自行尝试。同心圆的实现更有意思我直接在鼠标移动事件里动态更新void ImageView::mouseMoveEvent(QMouseEvent* event) { if(mode_ CONCENTRIC_CIRCLE) { QPointF pos mapToScene(event-pos()); double radius QLineF(centerPoint_, pos).length(); outerCircle-setRect(centerPoint_.x()-radius, centerPoint_.y()-radius, radius*2, radius*2); innerCircle-setRect(centerPoint_.x()-radius/2, centerPoint_.y()-radius/2, radius, radius); } }这里维护两个QGraphicsEllipseItem外圆半径实时跟随鼠标位置内圆固定为一半比例。卡尺工具是当之无愧的MVP用QPainterPath画出刻度效果QPainterPath path; path.moveTo(start); path.lineTo(end); // 添加刻度线 for(int i0; i10; i){ QPointF pos start (end - start)*i/10; path.addPath(createTickMark(pos, angle)); // 生成单个刻度 }createTickMark函数负责计算垂直方向的短线段配合旋转角度生成测量刻度。清空功能别直接用scene-clear()会误删背景图。我这样处理void ImageScene::clearAllROI() { foreach(QGraphicsItem* item, items()){ if(item ! m_bgItem item-zValue() 0) removeItem(item); } }用zValue区分背景和ROI项妈妈再也不用担心误删背景了。这个方案在5.6到5.15的Qt版本都能跑实测内存占用相当友好。想要更炫的效果可以自己继承QGraphicsItem实现paint()方法用QPainter玩点渐变填充或者阴影效果。源码里还藏了个彩蛋——按Ctrl滚轮能横向滚动试试看

相关文章:

Qt纯实现图片处理工具:支持多形态绘制、自适应缩放与背景图功能

Qt实现的包含图片显示功能、自适应缩放、背景图片、画roi工具。 不依赖其他库纯Qt实现。 在图片上可以画矩形、矩形旋转、圆形、同心圆、多边形、直线、卡尺、锚点、清空。 源码: 使用Qt5.6.1_MinGW、Qt5.15.1_MinGW、Qt5.15.1_msvc编译通过,其他版本请自…...

Can协议(一)

CAN设备(如CAN盒)上常见的 ‌PWR(Power)‌、‌ERR(Error)‌ 和 ‌CAN‌ 三个指示灯,其含义如下: 1.PWR(电源指示灯)‌ PWR是电源指示灯,表示设备是…...

SSD1308 OLED驱动库:I²C接口128×64单色屏嵌入式实战指南

1. SSD1308_128x64_I2C 驱动库深度解析:面向嵌入式工程师的OLED显示系统构建指南 SSD1308_128x64_I2C 是一款专为嵌入式平台设计的轻量级、高可靠性 OLED 显示驱动库,面向 SSD1308 控制器的 12864 像素单色 OLED 屏模组,采用标准 IC&#xf…...

BMP280非阻塞驱动库:嵌入式气压温度传感器实时采集方案

1. BMP280_DEV库深度解析:面向嵌入式工程师的非阻塞式气压/温度传感器驱动设计与实践1.1 库定位与核心价值主张BMP280_DEV是一个专为嵌入式系统设计的、Arduino兼容的非阻塞式BMP280传感器驱动库。其核心价值不在于简单封装IC/SPI通信,而在于提供一套可预…...

LangFlow助力内容创作:快速搭建自媒体文案生成工作流

LangFlow助力内容创作:快速搭建自媒体文案生成工作流 1. 为什么选择LangFlow进行内容创作 在当今内容爆炸的时代,自媒体创作者面临巨大的创作压力。每天需要产出大量高质量内容,同时还要保持创意和独特性。传统的人工创作方式不仅效率低下&…...

SEO_网站SEO优化全流程步骤详解与实战

SEO: 网站SEO优化全流程步骤详解与实战在当今数字化时代,网站SEO优化已经成为提升网站流量和品牌知名度的关键。无论你是一个新手,还是有一定经验的网站管理者,了解SEO全流程步骤是提升网站排名的基础。本文将详细介绍网站SEO优化的全流程步骤…...

SEO_详解SEO核心关键词研究与布局方法(86 )

SEO核心关键词研究的重要性在当今的互联网时代,搜索引擎优化(SEO)已经成为了网站提升流量和品牌知名度的重要手段之一。其中,核心关键词研究与布局是SEO的核心环节。无论你是一位新手还是资深的SEO专家,理解和掌握SEO核…...

[STM32] - 深入解析STM32CubeMX配置FatFs的SD卡驱动层:从初始化时序到错误码03的根因追踪

1. STM32CubeMX与FatFs基础配置实战 第一次用STM32CubeMX配置FatFs时,我像大多数开发者一样,以为按照默认配置勾选几个选项就能轻松搞定SD卡读写。结果在f_mount()阶段就遭遇了经典的FR_NOT_READY(错误码03),这个看似简…...

别再死磕从头训练了!用YOLO预训练模型,5分钟搞定你的自定义数据集

5分钟实战:用YOLO预训练模型高效攻克小数据集目标检测 当我在第一次尝试用YOLO训练自己的安全帽检测模型时,面对仅有300张标注图片的数据集,训练结果惨不忍睹——模型要么完全无法识别目标,要么把工地上的所有黄色物体都误判为安全…...

GLM-OCR入门教程:Python环境安装与第一个识别程序

GLM-OCR入门教程:Python环境安装与第一个识别程序 你是不是也对“让电脑看懂图片里的字”这件事感到好奇?网上那些高大上的技术文章,动不动就是一堆术语,看得人云里雾里。今天,咱们就换个方式,不讲复杂的原…...

3层架构解析:构建企业级HTML转Word文档转换系统的技术实践

3层架构解析:构建企业级HTML转Word文档转换系统的技术实践 【免费下载链接】html-to-docx HTML to DOCX converter 项目地址: https://gitcode.com/gh_mirrors/ht/html-to-docx 在数字化转型的浪潮中,文档格式转换已成为企业级应用中的核心需求之…...

手把手教你用MATLAB实现一阶RC低通滤波器(附完整代码与避坑指南)

MATLAB实战:一阶RC低通滤波器设计与工程避坑指南 1. 从理论到实践:RC低通滤波器的核心原理 在嵌入式系统和信号处理领域,RC低通滤波器是最基础却至关重要的电路单元。想象一下这样的场景:您从传感器采集的温度数据总是夹杂着高频干…...

SEO_详解SEO核心关键词研究与布局策略

SEO核心关键词研究的重要性在当今的数字营销中,搜索引擎优化(SEO)是企业获取流量和提升品牌知名度的重要途径之一。其中,SEO核心关键词研究与布局策略是整个SEO工作的基石。本文将详解SEO核心关键词研究与布局策略,帮助…...

P1023 税收与补贴问题【洛谷算法习题】

P1023 税收与补贴问题 网页链接 P1023 税收与补贴问题 题目背景 每样商品的价格越低,其销量就会相应增大。现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高…...

电气间隙与爬电距离:PCB安规设计的物理本质与开槽实践

1. 电气安全基础:电气间隙与爬电距离的本质辨析在电子系统尤其是涉及市电接入、高压隔离或安全隔离等级要求的硬件设计中,电气间隙(Clearance)与爬电距离(Creepage)是两个不可混淆、但又紧密关联的核心安规…...

从选题到答辩:手把手教你用STM32和传感器搞定一个能落地的物联网毕设(避坑指南+代码框架)

从零到落地的STM32物联网毕设实战指南:避坑技巧与代码框架全解析 作为一名曾经被毕业设计折磨得焦头烂额的过来人,我完全理解你现在的心情——手头有个STM32开发板,学过一些传感器知识,但面对"完成一个完整物联网项目"的…...

攻克任务栏定制难题:7+ Taskbar Tweaker的7个实战故障排除指南

攻克任务栏定制难题:7 Taskbar Tweaker的7个实战故障排除指南 【免费下载链接】7-Taskbar-Tweaker Windows Taskbar Customization Tool 项目地址: https://gitcode.com/gh_mirrors/7t/7-Taskbar-Tweaker 副标题:零代码解决常见问题,高…...

深夜告警:一次线上 OOM 的完整排查实录

上个月我们组有台服务半夜挂了,监控短信把同事从睡梦里叫起来,一看日志: java.lang.OutOfMemoryError: Java heap space 这种情况我自己也遇到过不止一次,每次第一反应都是"先重启再说"。但重启完问题还在,过几个小时又挂,反复折腾。 后来我整理了一套相对固…...

突破行业瓶颈的色彩管理开源方案:OpenColorIO配置为ACES深度解析

突破行业瓶颈的色彩管理开源方案:OpenColorIO配置为ACES深度解析 【免费下载链接】OpenColorIO-Config-ACES 项目地址: https://gitcode.com/gh_mirrors/op/OpenColorIO-Config-ACES 在影视制作与视觉效果领域,色彩一致性始终是横跨拍摄、剪辑、…...

实战演练:基于Python的MA、MACD、KDJ、RSI、OBV技术指标计算与SVM预测模型构建

1. 技术指标计算基础与数据准备 在开始构建预测模型之前,我们需要先理解几个核心概念。技术指标就像是股市的"体检报告",通过数学公式对原始交易数据进行加工,帮助我们更清晰地看到市场走势。这次我们要重点关注的五个指标各有特点…...

Z-Image-Turbo-辉夜巫女保姆级部署教程:Windows系统安装与配置全攻略

Z-Image-Turbo-辉夜巫女保姆级部署教程:Windows系统安装与配置全攻略 你是不是也眼馋那些AI生成的精美图片,但一看到复杂的Linux命令和服务器配置就头疼?别担心,今天咱们就来点不一样的。我手把手带你,在你自己最熟悉…...

Python3.12虚拟环境踩坑记:为什么安装pwntools会报错ModuleNotFoundError?

Python 3.12虚拟环境疑难解析:从ModuleNotFoundError到安全开发环境搭建 最近在安全研究项目中尝试使用Python 3.12创建虚拟环境时,遇到了一个令人困惑的问题——安装pwntools后运行ROPgadget时提示ModuleNotFoundError: No module named distutils。这个…...

OpenClaw+GLM-4.7-Flash自动化社交媒体管理:从创作到发布

OpenClawGLM-4.7-Flash自动化社交媒体管理:从创作到发布 1. 为什么需要自动化社交媒体管理 去年夏天,当我决定认真运营个人技术博客的社交媒体账号时,很快发现手动管理成了时间黑洞。每天要花两小时写文案、配图、定时发布,还要…...

卡梅德生物技术快报:基于噬菌体展示的骆驼纳米抗体筛选流程解析——以FlgE蛋白为例

在生物计算与合成生物学深度融合的当下,纳米抗体筛选已成为高通量抗体工程领域的核心研究方向,而骆驼纳米抗体凭借分子量小、稳定性强、亲和力高、易重组表达等独特优势,成为病原蛋白靶向检测、抗菌分子研发的理想工具。本文结合实操案例&…...

避坑指南:Python解析Cyber Record时常见的3个错误及解决方法(基于cyber_py3)

Python解析Cyber Record避坑实战:3个高频错误与深度解决方案 在自动驾驶和机器人开发领域,Cyber Record作为百度Apollo生态中的重要数据记录格式,承载着传感器数据、算法中间结果等关键信息。许多开发者选择Python作为快速原型开发语言&#…...

MySQL多表关系1

...

TouchGal:重新定义Galgame文化交流体验的现代化平台

TouchGal:重新定义Galgame文化交流体验的现代化平台 【免费下载链接】kun-touchgal-next TouchGAL是立足于分享快乐的一站式Galgame文化社区, 为Gal爱好者提供一片净土! 项目地址: https://gitcode.com/gh_mirrors/ku/kun-touchgal-next 对于视觉小说爱好者而…...

利用Spring Boot构建高效文学名著共享平台的技术实践

1. 为什么选择Spring Boot构建文学共享平台 第一次接触文学名著共享平台的需求时,我脑海中闪过的第一个念头就是:这玩意儿得扛得住高并发啊!想象一下《红楼梦》新版本上线时,成千上万书迷同时涌入的场景,传统Java EE架…...

如何实现Obsidian本地化:知识管理的图片链接稳定性保障指南

如何实现Obsidian本地化:知识管理的图片链接稳定性保障指南 【免费下载链接】obsidian-local-images 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-local-images 在数字笔记日益成为知识管理核心载体的今天,你是否曾因外部图片链接失效…...

终极解决方案:macOS Fiji启动失败的完整修复指南

终极解决方案:macOS Fiji启动失败的完整修复指南 【免费下载链接】fiji A "batteries-included" distribution of ImageJ :battery: 项目地址: https://gitcode.com/gh_mirrors/fi/fiji Fiji作为"开箱即用"的ImageJ发行版,是…...