GDAL库 读取高程图 根据颜色立方体的边 设置工程图高度渐变色

5 篇文章 0 订阅

 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++;
   }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值