文章目录

  • 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类相关推荐

  1. QT的QImage类的使用

    详细说明 QImage类提供了独立于硬件的图像表示形式,该图像表示形式可以直接访问像素数据,并且可以用作绘制设备. Qt提供了四个用于处理图像数据的类:QImage,QPixmap,QBitmap和Q ...

  2. Qt的QImage类

    QImage类提供了一个硬件无关的图像表示方法,该图像可以逐像素被访问和用于画图设备. Qt提供了QImage.QPixmap.QBitmap和QPicture四种图像操作类.QImage类主要用于I ...

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

    打开Qt帮助文档,会看到有关于QImage的描述如下:The QImage class provides a hardware-independent image representation tha ...

  4. 【Qt】QImage、QPixmap、QBitmap和QPicture

    简述 Qt 提供了四个用于处理图像数据的类: QImage. QPixmap. QBitmap和QPicture.QImage是为 I/O 设计和优化的, 用于直接像素访问和操作, 而QPixmap是 ...

  5. QImage 类的基本操作

    一.显示方法(两种):第一种更佳 1.QImage转QPixmap,然后用QLabel::setPixmap() 1 2 3 4 5 6 7 image=new QImage("D:/Tem ...

  6. Qt 的QString类的使用

    Qt的QString类提供了很方便的对字符串操作的接口. 使某个字符填满字符串,也就是说字符串里的所有字符都有等长度的ch来代替. QString::fill ( QChar ch, int size ...

  7. Qt的QStyle类的标准图标汇总

    Qt的QStyle类的标准图标用代码显示在界面如下: #include "QtWidgetsApplication1.h" #include<QPushButton> ...

  8. 【QImage类常用函数】

    QImage类常用函数 1.构造函数(加载图片) 2.load()函数 3.width()函数 4.height()函数 5.size() 函数 6.sizeInBytes()函数 7.bytesPe ...

  9. Qt的QVector类

    Qt的QVector类是一个类似标准C++vector的容器类(container class),它将数据存储在连续的内存空间里,因此在执行prepend.insert操作的时候比QList类慢. 如 ...

最新文章

  1. 再谈Spring Boot中的乱码和编码问题
  2. asp.net2.0跨域问题
  3. Oracle之例外(异常)
  4. 实习日志(1)2011-12-30
  5. fireworks8序列号:
  6. 编译原理实验二C语言实现,编译原理实验报告(c语言).pdf
  7. iOS性能优化之内存篇
  8. java图片压缩、图片缩放
  9. 基本面量化与美林时钟模型
  10. 个推-消息推送工具类
  11. 数据治理之主数据建模管理
  12. soot基础 -- soot中基本的对象
  13. 前端开发视频监控(flv / rtmp 格式)
  14. ROS入门五 TF坐标变换
  15. 含文档+PPT+源码等]精品基于SSM的图书管理系统[包运行成功]
  16. 常用电脑检测软件列表!提供下载!
  17. Delegate.Combine
  18. 会导致小程序onhide码 手机息屏_小程序onshow事件
  19. STM32编程---FlashRAM介绍
  20. 【TortoiseGit】本地仓库文件夹无故出红色叹号

热门文章

  1. Android安卓反编译apk源代码,移动应用开发课程
  2. 从信息传递的角度来看Android中的广播和Binder
  3. Samba服务所使用的端口和协议
  4. render函数的使用
  5. MATLAB中的bsxfun函数
  6. 简述数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型
  7. 跨境电商淘宝详情解决方案
  8. UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xca in position 24: invalid continuation byte
  9. css3 立方体3d旋转效果
  10. 史上最严数据保护条例欧盟GDPR今日生效,你可能需要这版中文全文(下)