Qt之QImage类
文章目录
- 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();
Qt之QImage类相关推荐
- QT的QImage类的使用
详细说明 QImage类提供了独立于硬件的图像表示形式,该图像表示形式可以直接访问像素数据,并且可以用作绘制设备. Qt提供了四个用于处理图像数据的类:QImage,QPixmap,QBitmap和Q ...
- Qt的QImage类
QImage类提供了一个硬件无关的图像表示方法,该图像可以逐像素被访问和用于画图设备. Qt提供了QImage.QPixmap.QBitmap和QPicture四种图像操作类.QImage类主要用于I ...
- Qt QImage类详解(QImage类型转换、QImage类函数及QImage像素操作)
打开Qt帮助文档,会看到有关于QImage的描述如下:The QImage class provides a hardware-independent image representation tha ...
- 【Qt】QImage、QPixmap、QBitmap和QPicture
简述 Qt 提供了四个用于处理图像数据的类: QImage. QPixmap. QBitmap和QPicture.QImage是为 I/O 设计和优化的, 用于直接像素访问和操作, 而QPixmap是 ...
- QImage 类的基本操作
一.显示方法(两种):第一种更佳 1.QImage转QPixmap,然后用QLabel::setPixmap() 1 2 3 4 5 6 7 image=new QImage("D:/Tem ...
- Qt 的QString类的使用
Qt的QString类提供了很方便的对字符串操作的接口. 使某个字符填满字符串,也就是说字符串里的所有字符都有等长度的ch来代替. QString::fill ( QChar ch, int size ...
- Qt的QStyle类的标准图标汇总
Qt的QStyle类的标准图标用代码显示在界面如下: #include "QtWidgetsApplication1.h" #include<QPushButton> ...
- 【QImage类常用函数】
QImage类常用函数 1.构造函数(加载图片) 2.load()函数 3.width()函数 4.height()函数 5.size() 函数 6.sizeInBytes()函数 7.bytesPe ...
- Qt的QVector类
Qt的QVector类是一个类似标准C++vector的容器类(container class),它将数据存储在连续的内存空间里,因此在执行prepend.insert操作的时候比QList类慢. 如 ...
最新文章
- 再谈Spring Boot中的乱码和编码问题
- asp.net2.0跨域问题
- Oracle之例外(异常)
- 实习日志(1)2011-12-30
- fireworks8序列号:
- 编译原理实验二C语言实现,编译原理实验报告(c语言).pdf
- iOS性能优化之内存篇
- java图片压缩、图片缩放
- 基本面量化与美林时钟模型
- 个推-消息推送工具类
- 数据治理之主数据建模管理
- soot基础 -- soot中基本的对象
- 前端开发视频监控(flv / rtmp 格式)
- ROS入门五 TF坐标变换
- 含文档+PPT+源码等]精品基于SSM的图书管理系统[包运行成功]
- 常用电脑检测软件列表!提供下载!
- Delegate.Combine
- 会导致小程序onhide码 手机息屏_小程序onshow事件
- STM32编程---FlashRAM介绍
- 【TortoiseGit】本地仓库文件夹无故出红色叹号
热门文章
- Android安卓反编译apk源代码,移动应用开发课程
- 从信息传递的角度来看Android中的广播和Binder
- Samba服务所使用的端口和协议
- render函数的使用
- MATLAB中的bsxfun函数
- 简述数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型
- 跨境电商淘宝详情解决方案
- UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xca in position 24: invalid continuation byte
- css3 立方体3d旋转效果
- 史上最严数据保护条例欧盟GDPR今日生效,你可能需要这版中文全文(下)