前一篇博客《把QImage转换为cv::Mat》介绍了像素在QImage和Mat里面不同的存储方式,以及如何实现从QImage到Mat的转换。了解了存储像素的机理之后,从Mat向QImage的转化也不难。Qimage的构造函数有很多种,其中一种构造函数的使用方法与我们在上一篇《把QImage转换为cv::Mat》Mat的构造方法相似:在构造时,都要告知构造函数,图像的每行有几个字节(bytesPerLine变量),这样就避免了字节错位的问题:
在上一篇博客的示例代码的基础上,我有添加了函数QImage MatToQImage(cv::Mat),实现从cv::Mat到QImage的转换:
QImage MatToQImage(cv::Mat mtx)
{
switch (mtx.type())
{
case CV_8UC1:
{
QImage img((const unsigned char *)(mtx.data), mtx.cols, mtx.rows, mtx.cols, QImage::Format_Grayscale8);
return img;
}
break;
case CV_8UC3:
{
QImage img((const unsigned char *)(mtx.data), mtx.cols, mtx.rows, mtx.cols * 3, QImage::Format_RGB888);
return img.rgbSwapped();
}
break;
case CV_8UC4:
{
QImage img((const unsigned char *)(mtx.data), mtx.cols, mtx.rows, mtx.cols * 4, QImage::Format_ARGB32);
return img;
}
break;
default:
{
QImage img;
return img;
}
break;
}
}
并且在WheelEvent()事件中对函数做了测试。测试了灰度图CV_8UC1和彩图CV_8UC3两种情况,均正常。CV_8UC4的情况下,颜色显示有问题,还在查问题。
#include "mat_qimage.h"
#include "cvUtility.h"
//#define GRAY
const int iWidth = 250, iHeight = 255;
unsigned char * m_pData = new unsigned char[iWidth * iHeight];
QImage m_Img;
Mat_QImage::Mat_QImage(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
#if defined(GRAY)
for(int k = 0; k<iWidth;k++)
{
for(int l = 0; l<iHeight; l++)
{
m_pData[l * iWidth + k] = k;
}
}
QImage img(m_pData, iWidth, iHeight, iWidth, QImage::Format_Grayscale8);
qDebug()<<img.bytesPerLine();
m_Img = QImage(iWidth, iHeight, QImage::Format_Grayscale8);
#else
QImage img;
img.load(QString("E:\\merge.bmp"));
m_Img = QImage(iWidth, iHeight, img.format());
#endif
QPainter qp;
qp.begin(&m_Img);
qp.drawImage(m_Img.rect(), img, img.rect());
qp.end();
}
Mat_QImage::~Mat_QImage()
{
if(m_pData)
delete [] m_pData;
}
void Mat_QImage::paintEvent(QPaintEvent *e)
{
QPainter qp;
qp.begin(this);
qp.drawImage(rect(), m_Img, m_Img.rect());
qp.end();
}
void Mat_QImage::mouseDoubleClickEvent(QMouseEvent *e)
{
cv::Mat mtx = QImageToMat(m_Img);
bool b = cv::imwrite("E:\\mtx.jpg", mtx);
qDebug()<<b;
}
void Mat_QImage::wheelEvent(QWheelEvent *e)
{
#if defined(GRAY)
cv::Mat mtx(iHeight, iWidth, CV_8UC1, m_pData);
cv::imwrite("E:\\raw_mtx.jpg", mtx);
m_Img = MatToQImage(mtx);
update();
m_Img.save("E:\\qimg.jpg");
#else
cv::Mat mtx = cv::imread("E:\\merge.bmp");
cv::Mat dst;
cv::resize(mtx, dst, cv::Size(iWidth, iHeight));
cv::imwrite("E:\\raw_mtx.jpg", dst);
m_Img = MatToQImage(dst);
update();
m_Img.save("E:\\qimg.jpg");
#endif
}