[英]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.