图像处理 QImage

article/2025/10/19 5:36:31

在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://chatgpt.dhexx.cn/article/VaQiNOmg.shtml

相关文章

QImage的用法

QImage提供了几种加载图像文件的方法&#xff1a; &#xff08;1&#xff09;构造QImage对象 Image myImage1 QImage(filename); 根据文件名打开图像 支持的图片格式是&#xff1a; &#xff08;2&#xff09;QImage(uchar *data, int width, int height, Format format …) 用…

QImage使用说明

详细描述 QImage类提供独立于硬件的图像表示&#xff0c;允许直接访问像素数据&#xff0c;并可用作绘制设备。 Qt提供了四个用于处理图像数据的类&#xff1a;QImage、QPixmap、QBitmap和QPicture。QImage针对I/O、直接像素访问和操作进行了设计和优化&#xff0c;而QPixmap…

QImage类详解(QImage类型转换、QImage类函数及QImage像素操作)

QImage类&#xff08;QImage类型转换、QImage类函数及QImage像素操作&#xff09; 打开Qt帮助文档&#xff0c;会看到有关于QImage的描述如下&#xff1a;The QImage class provides a hardware-independent image representation that allows direct access to the pixel dat…

J1939 协议

J1939 协议简介 J1939协议是基于CAN 2.0B所发展的出来的&#xff0c;基于CAN 的物理层。主要用于commercial vehicle的通信。J1939的主要目的是制定统一的上层application诊断的信息。 J1939的最大特点是定义了PGN&#xff08;Parameter Group Number). 大多数的PGN是8个字节…

SAE J1939学习笔记(三)

J1939故障代码种类 J1939 由几个不同的诊断信息&#xff1a; –诊断信息 1 - DM1 – 现行故障代码 –诊断信息 2 - DM2 – 非现行故障代码 –诊断信息 3 - DM3 – 清除非现行故障代码 通常地&#xff0c;用户会用 DM1 信息来读取现行故障码。 DM1 信息是 PGN 65226 or FECA h…

新功能发布—TSMaster如何实现J1939多帧报文收发

前言 众所周知&#xff0c;J1939协议是由美国汽车工程师协会&#xff08;SAE&#xff09;定义的一组标准。J1939标准用于卡车、公共汽车和移动液压等重型车辆。如今大多数车辆都通过CAN进行ECU通信。但是CAN总线仅仅是提供了通信的基础&#xff08;就像是电话&#xff09;&…

CAN协议 J1939

转自&#xff1a;http://blog.sina.com.cn/s/blog_bf97bd7e0102wl2y.html 这几天在公司看了SAE推行的 J1939标准&#xff08;SAE&#xff1a;美国汽车工程协会&#xff09;&#xff0c;这里整理下学习要点&#xff0c;主要包含以下几个协议&#xff1a; 物理层 SAE J1939-11…

J1939协议与CAN2.0对应关系图表

SAE J1939 消息帧格式定义与CAN 2.0B帧格式对应关系 J1939应用层协议详细描述了用于J1939网络的每个参数&#xff0c;包括其数据长度、数据类型、分辨率、范围及参考标签&#xff0c;并为每个参数分配了一个编号&#xff08;SPN&#xff09;。由于J1939协议是以协议数据单元&am…

Python实现CAN总线J1939报文接收、发送

前言 J1939协议是由美国汽车工程师协会&#xff08;SAE&#xff09; (SAE协会简介)定义的一组标准。J1939标准用于卡车、公共汽车和移动液压等重型车辆。在许多方面&#xff0c;J1939标准类似于旧版J1708和J1587标准&#xff0c;但J1939标准协议建立在CAN&#xff08;控制器区域…

J1939标准概述【小白入门】

文章目录 J1939标准概述&#xff1a;J1939/11物理层J1939/13板外诊断连接器J1939/21数据链路层J1939/31网络层J1939/71车辆应用层J1939/73应用层-诊断层J1939/81网络管理总结 J1939标准概述&#xff1a; J1939由下列子标准组成&#xff1a; J1939 – 串行控制和通信车辆网络…

J1939-21数据链路层多帧协议PDU解析

一、协议数据单元&#xff08;PDU&#xff09; P 是优先级&#xff0c;R 是保留位&#xff0c;DP 是数据页&#xff0c;PF 是PDU 格式&#xff0c;PS 是特定PDU&#xff0c;SA 是源地址 优先级&#xff08;P&#xff09;&#xff1a;这三位仅在总线传输中用来优化消息延迟&…

CAN总线的特点及J1939协议通信原理、内容和应用

众多国际知名汽车公司早在20世纪80年代就积极致力于汽车网络技术的研究及应用。迄今已有多种网络标准&#xff0c;如专门用于货车和客车上的SAE的J1939、德国大众的ABUS、博世的CAN、美国商用机器的AutoCAN、ISO的VAN、马自达的PALMNET等。 在我国的轿车中已基本具有电子控制和…

IPEmotion采集J1939协议信号

一 背景 由于商用车相对于乘用车更注重实用性&#xff0c;功能也较单一&#xff0c;且具有产量小的特点&#xff0c;因此在设计开发时需要进行约束&#xff0c;以更大程度实现软硬件的复用和成本的降低&#xff0c;在此需求下J1939协议便随之产生了。 J1939协议是由美国汽车工…

SAE J1939协议读取车辆故障码

基于SAE J1939协议的车辆&#xff0c;默认开启数据广播。当有故障码时&#xff0c;也会按照故障码的格式进行广播。 此处基于外设主动&#xff1a;读取故障码个数->读取故障码->故障码解析 这个步骤来讲&#xff0c;如果被动接收故障码广播&#xff0c;如下解析也适用。 …

车用总线技术 | J1939协议实用指南与J1939数据记录方案

“没错&#xff0c;这是一份SAE J1939协议的简单、实用指南。”—虹科 开篇&#xff1a;在这篇介绍中&#xff0c;我们介绍了J1939协议的基本知识&#xff0c;其中包括PGN和SPN。因为这是一篇偏向应用的简介&#xff0c;所以您还将会学习到如何通过DBC文件解码J1939数据、如何…

SAE J1939协议学习笔记

引用百度百科&#xff1a; SAE J1939&#xff08;以下简称J1939&#xff09;是美国汽车工程协会&#xff08;SAE&#xff09;的推荐标准&#xff0c;用于为中重型道路车辆上电子部件间的通讯提供标准的体系结构。它由“卡车与大型客车电气与电子委员会”&#xff08;Track &am…

J1939学习(二)

PDU 应用或网络层提供被同化为协议数据单元&#xff08;PDU&#xff09;的信息串。PDU提供了一个框架&#xff0c;用于组织对发送的每个CAN数据帧至关重要的信息。SAE J1939 PDU由七个字段组成&#xff1a;&#xff08;1&#xff09;P、&#xff08;2&#xff09;EDP、&#x…

CAN总线(J1939)速成指南【1】

本文转载在我的微信公众号&#xff1a;古德曼汽车工业。公众号文章都会知识星球、知乎进行转载&#xff0c;请有兴趣的朋友可以关注我的微信公众号 原文地址&#xff1a;CAN总线(J1939)速成指南【1】 很久以前当思想对CAN总线还一窍不通的时候&#xff0c;尝试百度搜索过非常…

J1939协议实用指南与J1939数据记录方案

“没错&#xff0c;这是一份SAE J1939协议的简单、实用指南。”—虹科 开篇&#xff1a;在这篇介绍中&#xff0c;我们介绍了J1939协议的基本知识&#xff0c;其中包括PGN和SPN。因为这是一篇偏向应用的简介&#xff0c;所以您还将会学习到如何通过DBC文件解码J1939数据、如何记…

车载通信——J1939故障码

一、诊断 UDS是统一诊断系统 冻结帧&#xff1a;出现故障码时&#xff0c;ECU存储故障码出现时的数据&#xff0c;就是冻结帧。 二、J1939故障诊断 SAE J1939应用层定义了12种诊断报文&#xff08;Diagnostic Message,DM&#xff09;、诊断故障码&#xff08;DTC&#xff0…