本例子将800*600的double类型的数据先进行归一化成0-255的quint8类型的数据,然后将归一化后的数据生成一个QImage,这个QImage的格式一定要是
QImage::Format_Indexed8 这是为了方便使用自定义的颜色表,然后将qimage放到qlabel中显示,效果如下:
主要代码如下:
头文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void initRGBTable();
void findMaxMin(QVector<double> vData, double &fMax, double &fMin);
QVector<QRgb> m_vecGrayTable;//灰度图颜色表
QVector<QRgb> m_vecColorTable;//彩色图颜色表
QVector<double> m_vData;
int m_nWidth;
int m_nHeight;
private slots:
void on_pushButton_2_clicked();
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
源文件:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_nWidth = 800;
m_nHeight = 600;
m_vData.resize(800*600);
for(int i = 0;i<m_nHeight;i++)
{
for(int j = 0;j<m_nWidth;j++)
{
m_vData[i*m_nWidth+j]=j+0.5;
}
}
initRGBTable();//初始化颜色表
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_2_clicked()//show gray img
{
double fMax=0.0;
double fMin=0.0;
findMaxMin(m_vData,fMax,fMin);
double fDifference = fMax - fMin;
QVector<quint8> vnData;
vnData.resize(m_vData.size());
if(fDifference != 0)
{
for(int i = 0;i<m_nHeight;i++)
{
for(int j = 0;j<m_nWidth;j++)
{
vnData[i*m_nWidth+j] = static_cast<int>((m_vData.value(i*m_nWidth+j)-fMin)*1.0f/fDifference*255);
}
}
}
QImage img((uchar*)(&vnData[0]),m_nWidth,m_nHeight,QImage::Format_Indexed8);
img.setColorTable(m_vecGrayTable);
QPixmap qPix = QPixmap::fromImage(img);
qPix.scaled(ui->label->size(), Qt::KeepAspectRatio);
ui->label->setPixmap(qPix);
}
void MainWindow::findMaxMin(QVector<double> vData, double &fMax, double &fMin)
{
if(vData.size()>1)
{
fMax = vData.value(0);
fMin = fMax;
for(int i=1;i<vData.size();i++)
{
if(fMax<vData.value(i))
{
fMax = vData.value(i);
}
if(fMin>vData.value(i))
{
fMin = vData.value(i);
}
}
}
}
void MainWindow::initRGBTable()
{
//核心代码,请联系博主获取
}
void MainWindow::on_pushButton_clicked()
{
double fMax=0.0;
double fMin=0.0;
findMaxMin(m_vData,fMax,fMin);
double fDifference = fMax - fMin;
QVector<quint8> vnData;
vnData.resize(m_vData.size());
if(fDifference != 0)
{
for(int i = 0;i<m_nHeight;i++)
{
for(int j = 0;j<m_nWidth;j++)
{
vnData[i*m_nWidth+j] = static_cast<int>((m_vData.value(i*m_nWidth+j)-fMin)*1.0f/fDifference*255);
}
}
}
QImage img((uchar*)(&vnData[0]),m_nWidth,m_nHeight,QImage::Format_Indexed8);
img.setColorTable(m_vecColorTable);
QPixmap qPix = QPixmap::fromImage(img);
qPix.scaled(ui->label->size(), Qt::KeepAspectRatio);
ui->label->setPixmap(qPix);
}
这个功能的核心就是编辑自己的颜色表,这部分代码可以加我WX获取:13382893223