GDALDataset *poDataset; //GDAL数据集
GDALAllRegister();
poDataset = (GDALDataset *) GDALOpen("E:/地形/T1/Z_57_7.TIF", GA_ReadOnly );
GDALDataType dataType = poDataset->GetRasterBand(1)->GetRasterDataType();
//将读取的内容更新到该文件的缓存中,便于查询高度
BYTE *pafScanblockHeight;//h
BYTE *pafScanblock1;//r
BYTE *pafScanblock2;//g
BYTE *pafScanblock3;//b
int nBufferSizeX = PixsWidth;//528;//
int nBufferSizeY = PixsHeight;//520;//
int X = PixsWidth;//527;//
int Y = PixsHeight;//517;//
pafScanblockHeight = (BYTE *) CPLMalloc(sizeof(dataType)*(nBufferSizeX)*(nBufferSizeY));//高度
pafScanblock1 = (BYTE *) CPLMalloc(sizeof(BYTE)*(nBufferSizeX)*(nBufferSizeY));//r
pafScanblock2 = (BYTE *) CPLMalloc(sizeof(BYTE)*(nBufferSizeX)*(nBufferSizeY));//g
pafScanblock3 = (BYTE *) CPLMalloc(sizeof(BYTE)*(nBufferSizeX)*(nBufferSizeY));//b
//读取高程数据
poDataset->GetRasterBand(1)->RasterIO( GF_Read, 0, 0,X,Y,
pafScanblockHeight,nBufferSizeX,nBufferSizeY, dataType,0, 0 );
pwHeight = (short* ) pafScanblockHeight;
BYTE* pwH = (BYTE* ) pafScanblock1;
BYTE* pwG = (BYTE* ) pafScanblock2;
BYTE* pwB = (BYTE* ) pafScanblock3;
/////????
int maxheight=0;//读取图像最高值
for (int i=0;i!=(PixsHeight-1)*(PixsWidth-1);i++)
{
if (pwHeight[i]>maxheight)
{
maxheight=pwHeight[i];
}
}
int minheight=maxheight;//读取图像最低值
for (int i=0;i!=(PixsHeight-1)*(PixsWidth-1);i++)
{
if (pwHeight[i]<minheight)
{
minheight=pwHeight[i];
}
}
//更改高度颜色
int m_iTotalMinHeight = minheight;
int m_iTotalMaxHeight = maxheight;//500;
int m_iColorHighR =0;//255;
int m_iColorHighG=0;//255;
int m_iColorHighB=0;//255;
int m_iColorLowR=0;
int m_iColorLowG=0;
int m_iColorLowB=0;
for (int iLoop = 0; iLoop < PixsHeight; iLoop++)
{
for (int jLoop = 0; jLoop < PixsWidth; jLoop++)
{
int iEndColorR = m_iColorHighR;
int iEndColorG = m_iColorHighG;
int iEndColorB = m_iColorHighB;
int iOrigColorR = m_iColorLowR;
int iOrigColorG = m_iColorLowG;
int iOrigColorB = m_iColorLowB;
int iColorDistanceR = 512 - iOrigColorR - iEndColorR;
int iColorDistanceG = 512 - iOrigColorG - iEndColorG;
int iColorDistanceB = 512 - iOrigColorB - iEndColorB;
int dScale = iColorDistanceR + iColorDistanceG + iColorDistanceB;
double das = (double)(pwHeight[iLoop*PixsWidth + jLoop]-m_iTotalMinHeight)/(m_iTotalMaxHeight-m_iTotalMinHeight);//
int iCurHeight = (int)(das * dScale);
//int iAlpha = 255;
int currentPoint = iLoop*PixsWidth + jLoop;
if ((iCurHeight + iOrigColorB) < 256)
{
pwH[currentPoint] = (BYTE)iOrigColorR; //r
pwG[currentPoint] = (BYTE)iOrigColorG; //g
pwB[currentPoint] = (BYTE)(iCurHeight + iOrigColorB); //b
}
else if ((iCurHeight + iOrigColorB + iOrigColorG) < 512)
{
pwH[currentPoint] = (BYTE)(iOrigColorR); //r
pwG[currentPoint] = (BYTE)(iCurHeight + iOrigColorB + iOrigColorG - 256); //g
pwB[currentPoint] = 0xFF;//255; //b
}
else if ((iCurHeight + iOrigColorB + iOrigColorG + iEndColorB) < 768)
{
pwH[currentPoint] = (BYTE)iOrigColorR; //r
pwG[currentPoint] = 0xFF;//255; //g
pwB[currentPoint] = (BYTE)(768-1 - (iCurHeight + iOrigColorB + iOrigColorG)); //b
}
else if ((iCurHeight + iOrigColorB + iOrigColorG + iEndColorB + iOrigColorR) < 1024)
{
pwH[currentPoint] = (BYTE)(iOrigColorR +(iCurHeight + iOrigColorB + iOrigColorG + iEndColorB -768)); //r
pwG[currentPoint] = 0xFF;//255; //g
pwB[currentPoint] = (BYTE)(iEndColorB); //b
}
else if ((iCurHeight + iOrigColorB + iOrigColorG + iEndColorB + iOrigColorR + iEndColorG) < 1280)
{
pwH[currentPoint] = 0xFF;//255; //r
pwG[currentPoint] = (BYTE)(1280-1 - (iCurHeight + iOrigColorB + iOrigColorG + iEndColorB + iOrigColorR)); //g
pwB[currentPoint] = (BYTE)iEndColorB; //b
}
else if ((iCurHeight + iOrigColorB + iOrigColorG + iEndColorB + iOrigColorR + iEndColorG + iEndColorR) <= 1536)
{
pwH[currentPoint] = (BYTE)(1536-1 - (iCurHeight + iOrigColorB + iOrigColorG + iEndColorB + iOrigColorR + iEndColorG)); //r
pwG[currentPoint] = (BYTE)iEndColorG; //g
pwB[currentPoint] = (BYTE)iEndColorB; //b
}
else //应该进不来
{
return;
}
}
}
//更改高度颜色
// Create colour lookup
// Create colour lookup BYTE->uint32
for(unsigned int col=0; col<PixsWidth; col++)
for(unsigned int row = 0;row < PixsHeight;row++)
{
//ColourValue c;
//c = HSVtoRGB((1.0f-col/1024.0f)*90.0f+225.0f, 0.9f, 0.75f+0.25f*(1.0f-col/1024.0f));
//c.a = 1.0f - col/1024.0f;
BYTE dn1=*pafScanblock1;
BYTE dn2=*pafScanblock2;
BYTE dn3=*pafScanblock3;
PixelUtil::packColour(dn1,dn2,dn3,255, PF_A8R8G8B8, &clut[col][row]);
pafScanblock1++;
pafScanblock2++;
pafScanblock3++;
}