簡體   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