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;
	}
}

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Qt对复数数组进行FFT并绘制图像的示例代码: ```cpp #include <QCoreApplication> #include <QImage> #include <QPainter> #include <QDebug> #include <fftw3.h> // 定义图像大小 const int IMAGE_WIDTH = 800; const int IMAGE_HEIGHT = 600; // 定义复数数组大小 const int N = 512; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 初始化FFTW库 fftw_init_threads(); fftw_plan_with_nthreads(4); // 创建输入和输出数组 fftw_complex *in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N); fftw_complex *out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N); // 创建正弦波信号 for (int i = 0; i < N; i++) { in[i][0] = sin(2 * M_PI * i / N); in[i][1] = 0; } // 创建FFT计算计划 fftw_plan plan = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE); // 执行FFT计算 fftw_execute(plan); // 创建图像对象 QImage image(IMAGE_WIDTH, IMAGE_HEIGHT, QImage::Format_RGB32); QPainter painter(&image); // 绘制波形图 painter.fillRect(image.rect(), Qt::white); painter.setPen(Qt::blue); for (int i = 0; i < N; i++) { painter.drawLine(i * IMAGE_WIDTH / N, IMAGE_HEIGHT / 2 + in[i][0] * IMAGE_HEIGHT / 2, (i + 1) * IMAGE_WIDTH / N, IMAGE_HEIGHT / 2 + in[(i + 1) % N][0] * IMAGE_HEIGHT / 2); } // 绘制频谱图 painter.setPen(Qt::red); for (int i = 0; i < N / 2; i++) { double freq = (double)i / N; double mag = sqrt(out[i][0] * out[i][0] + out[i][1] * out[i][1]); painter.drawLine(i * 2 * IMAGE_WIDTH / N, IMAGE_HEIGHT - mag * IMAGE_HEIGHT, (i + 1) * 2 * IMAGE_WIDTH / N, IMAGE_HEIGHT - mag * IMAGE_HEIGHT); } // 保存图像 image.save("fft.png"); // 释放资源 fftw_destroy_plan(plan); fftw_free(in); fftw_free(out); return 0; } ``` 该示例代码使用FFTW库计算FFT,并将计算结果绘制波形图和频谱图。波形图使用蓝色绘制输入信号,在图像中间绘制。频谱图使用红色绘制FFT的幅度谱,纵坐标表示幅度,横坐标表示频率。最后将图像保存为fft.png。 运行示例代码后,将生成fft.png文件,其中包含波形图和频谱图。 ![FFT图像](https://img-blog.csdnimg.cn/20211020101708201.png)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值