Qt 内存图像数组封装成QImage

如何将内存图像数据封装成QImage

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

首先看代码部分:

//BufferToQImage.h

    /*  
    * Copyright (c) 2013,中科院苏州医工所  
    * All rights reserved.  
    *   
    * 文件名称:BufferToQImage.h  
    * 文件标识:见配置管理计划书  
    * 摘    要:将内存数据封装成QImage。 
    *   
    * 当前版本:1.0  
    * 作    者:LYC 
    * 完成日期:2013年6月27日  
    */  
      
    #ifndef BUFFERTOQIMAGE_H  
    #define BUFFERTOQIMAGE_H  
      
    #include <QImage>  
    #include <Windows.h>  
    #include <assert.h>  
    #include <QVector>  
      
    class BufferToQImage  
    {  
    public:  
        BufferToQImage(void);  
        ~BufferToQImage(void);  
      
    public:  
        QImage Pk8bitGrayToQIm(const BYTE *pBuffer, const int &bufWidth, const int &bufHight); //将8bit灰度数据封装成QImage  
      
    private:  
        QVector<QRgb> vcolorTable; //生成灰度颜色表  
      
    };  
      
    #endif  

//BufferToQImage.cpp
    /*  
    * Copyright (c) 2013,中科院苏州医工所  
    * All rights reserved.  
    *   
    * 文件名称:BufferToQImage.h  
    * 文件标识:见配置管理计划书  
    * 摘    要:将内存数据封装成QImage。 
    *   
    * 当前版本:1.0  
    * 作    者:LYC 
    * 完成日期:2013年6月27日  
    */  
      
    #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 BYTE *pBuffer, const int &bufWidth, const int &bufHight)  
    {  
        //对参数的有效性进行检查  
        assert((pBuffer != NULL) && (bufWidth>0) && (bufHight>0));  
      
        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  
        {  
            BYTE *qImageBuffer = new BYTE[lineByte * bufHight]; //分配内存空间  
            uchar *QImagePtr = qImageBuffer;  
      
            for (int i = 0; i < bufHight; i++) //Copy line by line  
            {  
                memcpy(QImagePtr, pBuffer, bufWidth);  
                QImagePtr += lineByte;  
                pBuffer += bufWidth;  
            }    
      
            QImage qImage = QImage(qImageBuffer, bufWidth, bufHight, QImage::Format_Indexed8);  //封装QImage  
            qImage.setColorTable(vcolorTable); //设置颜色表  
              
            return qImage;  
        }  
    }  

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值