Qt 内存图像数组封装成QImage

当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行处理(如缩放、旋转)操作。如果能够将内存图像数据封装成QImage,则可以利用QImage强大的图像处理功能来进行图像处理,并能很好的进行显示。
在内存中,8bit灰度图像的宽度有可能不能满足BMP格式需求(为4的倍数),在封装成8bit灰度QImage时,会遇到封装不完整或错误的问题。本人总结了该问题,写了一个封装内存8bit灰度图像数据的C++类。

其中有借用别人的思路和方法。

头文件:

#include <QImage> 
#include <Windows.h> 
#include <assert.h> 
#include <QVector> 

class BufferToQImage
{
public:
	BufferToQImage();
	~BufferToQImage();

public:
	QImage Pk8bitGrayToQIm(const unsigned char *pBuffer, const int &bufWidth, const int &bufHight); //将8bit灰度数据封装成QImage 

private:
	QVector<QRgb> vcolorTable; //生成灰度颜色表 

};

源文件:

#include "BufferToQImage.h" 

BufferToQImage::BufferToQImage(void)
{
	for (int i = 0; i < 256; i++)
	{
		vcolorTable.append(qRgb(i, i, i));
	}
}

BufferToQImage::~BufferToQImage(void)
{

}

/*
* 函数名:Pk8bitGrayToQIm()
* 功能:将8bit灰度数据封装成QImage
* 参数:
*   pBuffer - 内存数据指针
*   bufWidth - 内存数据宽度
*   bufHight - 内存数据高度
* 返回值:QImage
* 作者:LYC
* 时间:2013.6.27
*/
QImage BufferToQImage::Pk8bitGrayToQIm(const unsigned char *pBuffer, const int &bufWidth, const int &bufHight)
{
	//对参数的有效性进行检查 
	assert((pBuffer != NULL) && (bufWidth > 0) && (bufHight > 0));

	int size = sizeof pBuffer;
	int biBitCount = 8; //灰度图像像素bit数 
	int lineByte = (bufWidth * biBitCount / 8 + 3) / 4 * 4; //bmp行byte数(格式宽度,为4的倍数) 

 	if (bufWidth == lineByte) //判断图像宽度与格式宽度 
 	{
 		QImage qIm = QImage(pBuffer, bufWidth, bufHight, QImage::Format_Indexed8);  //封装QImage 
 		qIm.setColorTable(vcolorTable); //设置颜色表 
 
 		return qIm;
 	}
 	else
	{
		QImage qImage = QImage(pBuffer, bufWidth, bufHight, bufWidth, QImage::Format_Indexed8);  //封装QImage 
		qImage.setColorTable(vcolorTable); //设置颜色表 

		return qImage;
	}
}

猜你喜欢

转载自blog.csdn.net/KaraQin/article/details/85772727
今日推荐