如何根据GeoTIFF数据创建QImage(或正确解释)

时间:2018-12-18 13:27:54

标签: c++ tiff gdal qimage

我需要创建一个QImage或可以从geotiff图像绘制到屏幕上的东西。不幸的是,QT的内置TIFF支持Geotiff结构上的扼流圈...因此,为了实现这一点,我使用了以下代码(或多或少来自gdal“教程”页面(https://gdal.org/gdal_tutorial.html)的复制粘贴,图像创建部分):

GDALRasterBand  *poBand;
int             nBlockXSize, nBlockYSize;
int             bGotMin, bGotMax;
double          adfMinMax[2];
poBand = poDataset->GetRasterBand( 1 );
poBand->GetBlockSize( &nBlockXSize, &nBlockYSize );
adfMinMax[0] = poBand->GetMinimum( &bGotMin );
adfMinMax[1] = poBand->GetMaximum( &bGotMax );
if( ! (bGotMin && bGotMax) )
    GDALComputeRasterMinMax((GDALRasterBandH)poBand, TRUE, adfMinMax);


float *pafScanline;
int   nXSize = poBand->GetXSize();
int   nYSize = poBand->GetYSize();
pafScanline = (float *) CPLMalloc(sizeof(float)*nXSize * nYSize);
poBand->RasterIO( GF_Read, 0, 0, nXSize, nYSize, 
                  pafScanline, nXSize, nYSize, GDT_Float32, 0, 0 );

QImage* image = new QImage((unsigned char*)pafScanline, 
                          nXSize, nYSize,
                          QImage::Format_RGB32);

image->save("blaa.jpg");

现在,我尝试加载的图像在左侧,显示的图像(并由Qt保存)在右侧。

问题:鉴于我进入浮点数,如何从tiff数据中创建适当颜色的图像,而且我不知道如何从一堆浮点数中创建QImage数据

Side by side

1 个答案:

答案 0 :(得分:0)

您输入的GeoTIFF可能没有单个浮点带,而是3(或4)个8位带。

GeoTIFF中的波段基本上是图像通道。与其他图像格式不同,这些通道还可以具有浮点值。

您可以查看GDAL文档here,以了解有关允许的格式的更多信息。

因此,您的文件可能只是RGBA GeoTIFF(尽管我无法百分百确定),因此具有4个UNIT8频段。

因此,您对RasterIO的呼叫完全错误。您应该遍历4个波段,并遵循波段顺序将RasterIO的RasterIO复制到QImage内存缓冲区。

类似的东西:

int nBands = poDataset->GetRasterCount();

for(int b=0; b < nBands; b++)
{
    GDALRasterBand *band = poDataset->GetRasterBand(b);
    if(band != nullptr)
    {
        CPLErr error = band->RasterIO(GF_Write, 0, 0, image.width(), image.height(), image.bits() + b, image.width(), image.height(), GDT_Byte, nBands, 0);
        if(error != CE_None)
        {
            // REPORT ERROR
        }
    }
}

请注意,上面的代码缺少所有必需的检查(确保频段类型为Byte等),并且根据文件的不同,频段顺序可能会有所不同(BGRA,RGBA,ecc)。