繁体   English   中英

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

[英]How to create a QImage from GeoTIFF data (or just interpret it correctly)

我需要创建一个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数据。

并排

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

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

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

因此,您的文件很可能是RGBA GeoTIFF,尽管我不能100%地确定它,但是它具有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)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM