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