图像处理 QImage

news2025/7/26 19:23:02

在Qt中有四种处理图像的方法:

  • QImage  :使用I/O ,可以对像素进行处理
  • QPixmap:主要用在屏幕的显示
  • QBitmap: QPixmap的子类,处理颜色深度,只能显示黑白两种颜色,用于遮罩
  • QPicture:用来重演QPainter命令

QPainter绘制图像的方法:

  • QPainter::drawImage()    绘制Image
  • QPainter::drawPixmap()  绘制Pixmap
  • QPainter::drawPixmap()  绘制Bitmap
  • QPainter::drawPicture()   绘制Picture

QImage

  • QImage 类提供独立于硬件的图像表示形式,允许直接访问像素数据,并可用作绘画设备
  • QImage是QPaintDevice的子类,所以QPainter可以直接在图像上绘制。在 QImage 上使用Qpainter时,可以在当前 GUI 线程以外的其他线程中执行绘制。
  • QImage 对象可以按值传递,因为 QImage 类使用隐式数据共享。Qmage对象也可以流式传输和比较。

Qt中支持的图像格式:

格式支持的操作
BMP读/写
GIF
JPG读/写
JPEG读/写
PNG读/写
PBM
PGM
PPM读/写
XBM读/写
XPM读/写

QImage::Format

有几十种图像格式,可以去查看官方文档。

QImage::Format_Invalid图像无效。
QImage::Format_Indexed8图像使用 8 位索引存储到颜色图中
QImage::Format_RGB32图像使用 32 位 RGB 格式 (0xffRRGGBB) 存储
QImage::Format_ARGB32图像使用 32 位 ARGB 格式 (0xAARRGGBB) 存储。
QImage::Format_RGB16图像使用 16 位 RGB 格式 (5-6-5) 存储。

 构造函数:有两种

图像参数:

size()图片的大小
width()图片宽度
height()图片的高度
dotsPertMeterX()返回在物理计量中水平适合的像素数
dotsPertMeterY()返回在物理计量中竖直适合的像素数
valid()判断是否为有效位置
offset()返回偏移量

 像素操作:

setPixelColor()设置指定坐标的颜色
setPixel(position,index_rgb)返回给定位置的像素颜色为index_rgb
setColor()设置索引处的颜色
setColorCount()扩容
pixel()返回索引处的颜色  QRgb
pixelColor()

返回索引处的颜色  QColor

pixelFromat()返回指定位置的格式
pixelIndex()返回指定位置的索引
scanLine()返回索引处的像素指针
bits()返回指向第一个像素数据的指针。这等效于scanLine(0)

设置像素的颜色:

1.直接设置颜色

    QImage image(3,3,QImage::Format_Indexed8);
    //直接设置像素点位颜色
    image.setPixel(0,0,qRgb(0,255,255));
    image.setPixel(0,1,qRgb(255,0,255));
    image.setPixel(0,2,qRgb(255,255,0));

2.通过setColor()存储颜色然后再添加

setColor()会存储索引处的颜色

    QImage image(3,3,QImage::Format_Indexed8);
    //直接设置像素点位颜色
    image.setColor(0,qRgb(0,255,255));//索引0对应的元素为qRgb(0,255,255)
    image.setColor(1,qRgb(255,0,255));//索引1对应的元素为qRgb(255,0,255)
    image.setColor(2,qRgb(255,255,0));//索引2对应的元素为qRgb(255,255,0)
    //设置颜色
    image.setPixel(0,0,0);
    image.setPixel(0,1,1);
    image.setPixel(0,2,2);

遍历像素 :

1.直接遍历

    QImage image(10,10,QImage::Format_Indexed8);
    //遍历像素
    for(int x=0;x<image.width();x++)
    {
        for(int y=0;y<image.height();y++)
        {
            image.setPixel(x,y,qRgb(100,100,100));//把全部像素的颜色修改为qRgb(100,100,100)
        }
    }

2.按行遍历

使用scanLine()获取一行的像素

  • uchar*QImage::scanLine(inti) 返回的是一个指针
  • 访问32bpp 图像数据,请将返回的指针转换为(QRgb具有 32 位大小)并使用它来读取/写入像素值
  • 使用参数时使用qRed()、qGreen()、qBlue()和qAlpha() 访问像素
    QImage image(10,10,QImage::Format_RGB32);
    //遍历像素
    //读取行
    for(int y=0;y<image.height();y++)
    {
        QRgb* line=(QRgb *)image.scanLine(y);//读取行
        for(int x=0;x<image.height();x++)
        {
            //遍历像素颜色
            qDebug()<<qRed(line[x]);
            qDebug()<<qGreen(line[x]);
            qDebug()<<qBlue(line[x]);
        }

    }

实例的话请看点击以下链接:

 基于Qt的图像处理技术和算法_拳四郎的博客-CSDN博客_qt 滤波

一些其他的函数:

allGray()判断颜色是灰色阴影(红绿蓝相同)
colorTable()返回图像中的颜色表
depth()返回图像的深度
fill()给定颜色填充整个像素
invertPixels()反转图像的像素值
load()读取设备的图像
save()保存图像
scaled()缩放
setText()将图像文本设置为给定文本,并将其与给定关联
valid判断点位是否在图像上

打开或保存图片:load  save

    QImage image(10,10,QImage::Format_RGB32);
    image.load("D:/Qt_Android_work/data_082/456.png");//打开图像文件
    image.save("D:/123.png0");//保存图像文件

fill填充的使用:

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QImage image(100,100,QImage::Format_RGB32);
    image.fill(qRgb(200,200,200));//填充
    painter.drawImage(0,0,image);
}

 缩放的使用:

  •  该函数返回的是一个副本
  • size() 为图像大小
  • 后面的参数为设置纵横比

 

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QImage image(100,100,QImage::Format_RGB32);
    image.fill(qRgb(200,200,200));//填充
    image=image.scaled(image.width()*5,image.height()*5);//放大5倍
    painter.drawImage(0,0,image);
}


QImage可以用来绘图

QImage 也可以作为设备进行绘图

void Widget::paintEvent(QPaintEvent *event)
{
   QPainter painter;
   QImage image(200,200,QImage::Format_ARGB32);
   painter.begin(&image);
   painter.setPen(QPen(Qt::red,3));
   painter.setBrush(Qt::cyan);
   painter.drawRect(0,0,100,100);
   painter.drawEllipse(100,100,100,100);
   painter.end();
   painter.begin(this);
   painter.drawImage(0,0,image);//绘制
}

 

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

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

相关文章

Qt通过Doc模式读取XML并设计一个增删改查方便的一个操作类

前言 如果对开源库TinyXml有兴趣的可以去看看这篇文章。 C使用TinyXml(开源库)读取*.XMl文件 目录前言DOC 文档对象模型QtXML基本结构操作XML部署环境添加信息头读取XML文件添加根节点添加一个没有属性的节点添加一个有属性的节点添加一个元素节点给节点单独设置属性删除所有同…

开源软件安全与应对策略探讨 - Java 机密计算技术应用实践

据统计&#xff0c;90% 以上的应用都在使用第三方软件库&#xff0c;这些软件大部分都是开源的。与此同时&#xff0c;有超过一半的全球 500 强公司都在使用存在漏洞的开源软件。这幅漫画生动的描述了一个大型应用软件的组件架构&#xff0c;它可能建立在一个极其脆弱的开源组件…

SpringBoot整合Swagger2+Knife4j,注解使用

SpringBoot整合Swagger2Knife4j,注解使用 文章目录SpringBoot整合Swagger2Knife4j,注解使用前言一、swagger是什么&#xff1f;二、使用步骤1.引入库2.使用swagger的相关注解总结前言 swagger和postman都是后端编写的测试接口使用方式&#xff0c;由于实际开发的需求和使用习惯…

基于springboot的汽车租赁管理系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

pytorch实现mnist手写数字识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章地址&#xff1a; 365天深度学习训练营-第P1周&#xff1a;mnist手写数字识别&#x1f356; 作者&#xff1a;K同学啊一、 前期准备 1. 设置GPU import torch import torch.nn a…

MySQL8.0爬坑二三事

【下载】 地址&#xff1a;MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/ 【安装】 1.解压复制下面一堆文件到你需要的路径 2.如下图添加一个data文件夹&#xff0c;专门来放数据 3.新建一个my.ini的配置文件&#xff0c;里面内如如下 4…

如何将草料二维码收集到的表单信息同步至腾讯文档

在进行工业巡检场景如消防栓检查时&#xff0c;需要到达巡检地点后&#xff0c;扫描草料二维码&#xff0c;然后填写巡检的结果。事后&#xff0c;还需要有一个工作人员将草料二维码中的信息手动复制粘贴至腾讯文档中。那么能不能将我们信息填写后&#xff0c;自动就汇总至腾讯…

检索系统设计方案(重构)

记一次系统重构设计背景介绍设计步骤架构图介绍架构设计注意点总结背景介绍 搜索链路主要部分 搜索引擎链路都包含这三部分&#xff0c;数据源、搜索引擎服务、搜索业务。 是不是很简单&#xff0c;感觉搜索也没那么难&#xff1f; 搜索链路确实都包括这三部分&#xff0c;…

编程参考 - 编程中给变量起名时如何选择前缀,以及匈牙利命名法等

我最开始当程序员用C语言写代码&#xff0c;公司里推行编码规范&#xff0c;变量的前缀都是有规定的。 比如整型变量&#xff0c;前面都是 u8Name, i8Name, u16Name, i16Name之类的。 尤其是嵌入式编程&#xff0c;涉及到代码移植的问题&#xff0c;最好使用和平台无关的类型定…

显存优化综述

显存优化综述动态图和静态图静态图显存优化动态图显存优化DTR问题解决办法重计算的局限性Cooprecomputable in placeop-guided allocationLayout-aware Eviction实验效果消耗的时间显存碎片率搜索时间动态图和静态图 动态图是边计算边搭建计算图&#xff0c;中间结果一目了然。…

Quasar搭建教程初体验

文章目录一、Quasar框架介绍二、搭建一个简单的Quasar程序1、Quasar CLI安装2、创建Quasar应用程序3、运行Quasar三、使用Quasar开发SSR四、使用Quasar开发桌面应用(Electron)1、添加Quasar Electron模式2、运行开发五、使用Quasar移动应用(Capacitor)1、下载安装AndroidStudio…

测试用例设计方法之判定表法

概念&#xff1a; 等价类&#xff0c;边界值分析法一般是对单一输入进行测试用例分析的方法。 判定表是对其的一种补充&#xff0c;对于多种输入之间存在的组合关系并且对应执行不同动作&#xff0c;进行测试用例的分析的方法。 应用场景&#xff1a; 当一个界面中有多个控…

数据集成产品分析

数据集成产品分析 数据集成产品致力于异构数据源之间的数据交换与汇聚&#xff0c;该类产品是数据中台建设的第一环节&#xff0c;笔者将通过两篇文章对数据集成产品进行分析。 数据同步&#xff0c;又称为数据集成、数据迁移&#xff0c;主要用于实现不同系统间的数据流转。…

C++之结构、枚举

结构 C提供了struct关键字可以将不同类型封装在一起,形成结构体. 数组中存储的是相同类型的数据&#xff0c;而结构中可以存储不同类型的数据。定义结构就像定义一个新的数据类型一样. 结构是类的基石 结构的定义、声明与初始化 定义语法格式: struct 结构体类型名 { 成员…

深入浅出PyTorch——PyTorch生态简介+模型部署

1. 生态简介 介绍PyTorch生态在图像、视频、文本等领域中的发展&#xff0c;针对某个领域选择其中有代表性的一个工具包进行详细介绍 1.1 torchvision torchvision包含了在计算机视觉中常常用到的数据集&#xff0c;模型和图像处理的方式 函数作用 torchvision.datasets * 计…

PLC中ST编程的无符号数逻辑运算

AND与运算&#xff0c;两个数据每个位进行与运算&#xff0c;只有当相同位的值都为1时&#xff0c;那个位结果为1&#xff1b; 2# 0000 0100 1101 0010 2# 0001 0110 0010 1110 AND 2# 0000 0100 0000 0010 OR或运算&#xff0c;两个数据每个位进行或运算&#xff0c;只…

国产化Kettle、JDK、MySQL下载安装操作步骤

一、Kettle下载安装 &#xff08;一&#xff09;、kettle的下载 1、登录https://sourceforge.net/projects/pentaho/ 2、点击“Files”&#xff0c;进入Home / Data Integration 目录&#xff0c;下载需要的版本&#xff0c;以6.1为例。 3、点击“pdi-ce-6.1.0.1-196.zip”…

自制操作系统日记(8):变量显示

代码仓库地址&#xff1a;https://github.com/freedom-xiao007/operating-system 简介 上篇中&#xff0c;我们显示了静态的字符串在桌面上&#xff0c;本篇进一步探索&#xff0c;能将定义的整型变量的值显示在桌面上 探索历程说明 本来想着应该是一两天能搞定的&#xff…

基于智能算法的无人机路径规划研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Docker学习(4)—— 容器数据卷

数据卷是为了实现数据的持久化&#xff0c;完全独立于容器的生存周期&#xff0c;因此Docker不会在删除容器时删除其挂载的数据卷。 通过下述方式运行一个容器&#xff0c;会自动将docker容器内的数据保存进宿主机的磁盘中 docker run -it --privilegedtrue -v /宿主机绝对路…