在使用QT进行图像显示时,对于如jpg和png等图片格式的实现可以借助QT很方便的就实现,但是使用QT显示Raw数据时,则相对麻烦一点,主要的原因在于Raw格式的图片不包含关于图片的高度、宽度和数据类型等信息,因此需要在进行图像显示时将上述信息进行指定。
在使用QT进行Raw数据显示时,本文推荐使用QLable进行。首先,在ui界面上绘制一个控件Label。其次,绘制一个按钮PushButton。
在PushButton的槽函数内编写下面的代码段,即可显示数据格式为Raw的lena图像,此处lena图像的数据类型为ushort,大小为512×512。
在使用QLabel进行Raw图像显示时有以下注意事项:
1. 需要将读取到的Raw文件内数据映射到0-255,然后转化为uchar格式。
2.使用image.scaled方法可以将图像的大小根据所设置Label的尺寸进行缩放。
3.记得对所开辟内存空间的及时销毁。
void MainWindow::on_pushButton_clicked()
{
// 定义Raw数据的宽度和高度
int w = 512;
int h = 512;
// 读取Raw文件的数据
FILE *pImage = NULL;
QString filename = "E:\\lena.raw";
pImage = fopen(filename.toLocal8Bit(), "rb");
ushort* pData16 = new ushort[w * h];
fread(pData16, sizeof(unsigned short), h * w, pImage);
// 将Raw文件的数据映射到0-255,并转化为uchar类型
int Ii,Ixn;
int Imax = pData16[0], Imin = pData16[0];
for (int i = 0; i < h * w; i++)
{
Ii = pData16[i];
if (Ii > Imax)
Imax = Ii;
if (Ii < Imin)
Imin = Ii;
}
Ixn = Imax - Imin;
uchar* pData8 = new uchar[w * h];
for(int i = 0; i < w * h; i++)
{
pData8[i] = ((pData16[i] - Imin) * 255 / Ixn);
}
QImage image = QImage(pData8, h, w, h, QImage::Format_Indexed8); //封装QImage
QImage result =image.scaled(ui->label->width(), ui->label->height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
ui->label->setPixmap(QPixmap::fromImage(result));
ui->label->repaint();
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
fclose(pImage);
delete[]pData16;
delete[]pData8;
}