Qt之QImage类

article/2025/10/19 5:34:15

文章目录

  • QT——QImage类
      • QImage获取图像的数据信息
      • QImage图像格式转换
          • 由RGB格式转换为BGR格式
          • 将彩色图转换为灰度图
          • 图像保存
      • QImage图像显示在QLabel上
          • QPixmap与QImage之间的互相转换
          • Mat与QImage之间的互相转换
          • 8位的灰度图像进行显示QImage::Format_Indexed8
          • 三通道的彩色图进行显示QImage::Format_RGB888
          • 16位的灰度图像进行显示
          • 图像适应QLabel进行显示
          • 出现图像歪斜的问题

QT——QImage类

Qt中QImage类封装了对于一般图像像素级的操作,图像显示则使用QPixmap。

QImage获取图像的数据信息

获取图像的首地址:返回第一个像素数据的指针

const uchar *QImage::bits() const

获取图像的总字节数

int QImage::byteCount() const

获取图像每行字节数

int QImage::bytesPerLine() const  

还可以这样计算(width:图像宽度,img.depth是图图像深度):

int bytePerLine = (width * img.depth()  +  31) / 32 * 4;

位深:位深是指存储每个像素所用的位数.

QImage img;
int ImgDepth = img.depth()  #返回当前图像的位深.

QImage图像格式转换

由RGB格式转换为BGR格式

返回一个QImage

QImage::rgbSwapped() 

将图片中像素值中的红色和蓝色组件的值交换,将RGB图像转换为BGR图像

QImage image(fileName);
QImage bgr = image.rgbSwapped();
将彩色图转换为灰度图

返回一个QImage

QImage::convertToFormat()

灰度图的参数应该选择为QImage::Format_Grayscale8但是必须在Qt5.5以上版本才能支持

QImage image(fileName);
QImage gray = image.convertToFormat(QImage::Format_Grayscale8);
图像保存
bool QImage::save(const QString &fileName, const char *format = Q_NULLPTR, int quality = -1) const

format选择保存的格式,支持格式如下:

BMP(Windows Bitmap) 
GIF(Graphic Interchange Format (optional)) 
JPG(Joint Photographic Experts Group) 
JPEG(Joint Photographic Experts Group) 
PNG(Portable Network Graphics) 
PBM(Portable Bitmap) 
PGM(Portable Graymap) 
PPM(Portable Pixmap) 
XBM(X11 Bitmap) 
XPM(X11 Pixmap)

quality必须在0到100或-1范围内。
指定0来获得小的压缩文件,100用于大的未压缩文件,和-1(默认)使用默认设置。

QString imagePath = “image.bmp”;
QImage image;
image.save(imagePath,"BMP");

QImage图像显示在QLabel上

在这里插入图片描述

QPixmap与QImage之间的互相转换

QPixmap转换为QImage

QPixmap pix(path);
QImage img = pix.toImage();

QImage转换为QPixmap

QImage img(path);
QPixmap pix = QPixmap::fromImage(img);
Mat与QImage之间的互相转换

QImage转换为Mat

cv::Mat QImage2cvMat(QImage image)
{cv::Mat mat;qDebug() << image.format();switch(image.format()){case QImage::Format_ARGB32:case QImage::Format_RGB32:case QImage::Format_ARGB32_Premultiplied:mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());break;case QImage::Format_RGB888:mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());cv::cvtColor(mat, mat, CV_BGR2RGB);break;case QImage::Format_Indexed8:mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());break;}return mat;
}

Mat转换为QImage

QImage cvMat2QImage(const cv::Mat& mat)
{// 8-bits unsigned, NO. OF CHANNELS = 1if(mat.type() == CV_8UC1){QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);// Set the color table (used to translate colour indexes to qRgb values)image.setColorCount(256);for(int i = 0; i < 256; i++){image.setColor(i, qRgb(i, i, i));}// Copy input Matuchar *pSrc = mat.data;for(int row = 0; row < mat.rows; row ++){uchar *pDest = image.scanLine(row);memcpy(pDest, pSrc, mat.cols);pSrc += mat.step;}return image;}// 8-bits unsigned, NO. OF CHANNELS = 3else if(mat.type() == CV_8UC3){// Copy input Matconst uchar *pSrc = (const uchar*)mat.data;// Create QImage with same dimensions as input MatQImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);return image.rgbSwapped();}else if(mat.type() == CV_8UC4){qDebug() << "CV_8UC4";// Copy input Matconst uchar *pSrc = (const uchar*)mat.data;// Create QImage with same dimensions as input MatQImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);return image.copy();}else{qDebug() << "ERROR: Mat could not be converted to QImage.";return QImage();}
}
8位的灰度图像进行显示QImage::Format_Indexed8
QImage image;
image = QImage((const uchar*)SrcImage, ImgWidth, ImgHeight, QImage::Format_Indexed8).rgbSwapped();
ui->label_6->setPixmap(QPixmap::fromImage(image));
三通道的彩色图进行显示QImage::Format_RGB888
QImage image;
image = QImage((const uchar*)SrcImage, ImgWidth, ImgHeight, QImage::Format_RGB888).rgbSwapped();
ui->label_6->setPixmap(QPixmap::fromImage(image));
16位的灰度图像进行显示

QImage不支持对16位的图像进行显示,必须转换为8位图像进行显示

图像适应QLabel进行显示
labelShow=new QLabel(this);
SrcImage = imread("D://lena.jpg");
image = QImage((const uchar*)SrcImage.data, SrcImage.cols, SrcImage.rows, QImage::Format_RGB888).rgbSwapped();
image = image.scaled(labelShow->size(),Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
labelShow->setScaledContents(true);
labelShow->setPixmap(QPixmap::fromImage(image));
出现图像歪斜的问题

对于上述方法,有些图像可以显示正常,但是有些图像出现歪斜的状态,应该是没有达到4字节对齐的状态

将mat转QImage的代码改成如下代码:

image = QImage((const uchar*)SrcImage.data, SrcImage.cols, SrcImage.rows, SrcImage.cols*SrcImage.channels(),QImage::Format_RGB888).rgbSwapped();

http://chatgpt.dhexx.cn/article/hKCbVX82.shtml

相关文章

QImage 图像处理

首页博客学院下载GitChatTinyMind论坛问答商城 写博客发Chat登录注册 youngyang_sjtu的博客 RSS订阅 转 QImage像素级操作 2018年03月20日 14:31:04 阅读数&#xff1a;754 转自http://blog.csdn.net/silangquan/article/details/41008183 这篇文章主要阐述了如何使用…

QImage的显示

因为想利用QT的gui在arm上显示的缘故&#xff0c;因此开始接触了QT。最近&#xff0c;用QT在弄一个显示图片的小程序。程序如下&#xff1a; #include <QtGui/QApplication> #include "mainwindow.h" #include "qimage.h" #include "qlabel.h&q…

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

打开Qt帮助文档&#xff0c;会看到有关于QImage的描述如下&#xff1a;The QImage class provides a hardware-independent image representation that allows direct access to the pixel data, and can be used as a paint device。即QImage类是设备无关的图像&#xff0c;可…

PyQt5-QImage、QPixmap、Opencv与QLabel、Matplotlib的互动

文章目录 前言一、转换1.1 Opencv_to_QPixmap1.2 QImage_to_QPixmap1.3 QPixmap_to_Opencv1.4 QImage_to_Opencv1.5 Opencv_to_QImage 二、实战案例2.1 案例1-图像旋转 总结 前言 早期进行图像旋转用的笨方法是&#xff1a; cv2.imread()读取图像numpy旋转图像将旋转后的图像保…

QImage 图片分割、保存

QImage 图片分割、保存 简介 之前一直只用Qt做图片显示&#xff0c;这次突发奇想想用Qt做做图像相关的&#xff0c;就尝试了一下图片切割&#xff0c;保存。 QImage介绍 QImage类为Qt提供的一个支持图像算法处理的类库&#xff0c;可以精确到像素及单位。在我理解不是提供了…

QImage类

QImage类提供了一个硬件无关的图像表示方法&#xff0c;该图像可以逐像素被访问和用于画图设备。 Qt提供了QImage、QPixmap、QBitmap和QPicture四种图像操作类。QImage类主要用于I/O和直接逐像素访问、操作&#xff1b;QPixmap主要用于在屏幕中显示图像&#xff1b;QBitmap是一…

Qt使用QImage保存成JPG(PNG)图像到本地

一、QImage类简介 QImage提供了一个与硬件无关的图像表示方法&#xff0c;允许直接访问像素数据&#xff0c;可用作绘图设备。QImage类支持QImage::Format、enum描述的多种图像格式。包括8-bit, 32-bit 和alpha混合图像QImage 提供很多可以用于获取图像信息和进行图像变换的函…

QImage

一、描述 QImage 类提供了一种独立于硬件的图像表示&#xff0c;允许直接访问像素数据&#xff0c;并且可以用作绘图设备。 QImage 是为 I/O 和直接像素访问和操作而设计和优化的&#xff0c; 因为 QImage 是 QPaintDevice 的子类&#xff0c;所以 QPainter 可用于直接在图像…

图像处理 QImage

在Qt中有四种处理图像的方法&#xff1a; QImage &#xff1a;使用I/O &#xff0c;可以对像素进行处理QPixmap&#xff1a;主要用在屏幕的显示QBitmap&#xff1a; QPixmap的子类&#xff0c;处理颜色深度&#xff0c;只能显示黑白两种颜色&#xff0c;用于遮罩QPicture&…

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;这三位仅在总线传输中用来优化消息延迟&…