页面载入中....

页面载入中....

公告

页面载入中....

文章

评论

留言

连接

信息

登陆

搜索

2007-10-12 17:39:00
用多维灰度矩阵生成多波段栅格图像[AO]

这是CWzjAoRasterOp类中一个方法,只要有了各个波段的灰度矩阵的值,就可以生成ArcGIS支持的多波段栅格图像,如IMG,GRID,TIFF等。
//生成多波段栅格图像
void CWzjAoRasterOp::WriteRaster(CString szPath, CString szFile, RasterInfo rstInfo, LPBYTE* ppData, CString szRasFormat /*= "IMAGINE Image"*/, BYTE bNoDataValue /*= 256*/)
{
 IWorkspacePtr ipWS;
 IWorkspaceFactoryPtr ipWSF(CLSID_RasterWorkspaceFactory);
 //If Not pWSF.IsWorkspace(sPath) Then Exit Sub 
 ipWSF->OpenFromFile(CComBSTR(szPath), 0, &ipWS);
 IRasterWorkspace2Ptr ipRWS(ipWS);
 IRasterDatasetPtr ipRasterDS;//szRasFormat),
 ipRWS->CreateRasterDataset(CComBSTR(szFile), CComBSTR(szRasFormat),  rstInfo.ipOrigin, rstInfo.lColCount,
  rstInfo.lRowCount, rstInfo.dCellSizeX, rstInfo.dCellSizeY, rstInfo.lNumbands, rstInfo.rstTy, rstInfo.ipSpaRef, TRUE, &ipRasterDS);
 
 IRasterPtr ipRaster;
 ipRasterDS->CreateDefaultRaster(&ipRaster); 
 IRasterPropsPtr ipRasProps =  ipRaster; 
 // Get RasterBand from the raster
 IRasterBandPtr* ippBand = new IRasterBandPtr[rstInfo.lNumbands];
 IRasterBandCollectionPtr ipBandCol(ipRaster);
 for (int i = 0; i < rstInfo.lNumbands; i++){ 
  //ipBandCol->Item(0, &ippBand[0]);
  ipBandCol->Item(i, &ippBand[i]);
 }
 
 //目前这个设置透明色值不管用,不知道正确的方法是怎么样
 /*if (bNoDataValue > 0 || bNoDataValue < 256) {
  VARIANT vVal;
  vVal.vt = VT_UI1;
  vVal.cVal = bNoDataValue;
 // ipRasProps->put_NoDataValue(vVal);
  ipRasProps->put_NoDataValue(CComVariant(bNoDataValue));
 } 
 */// QI RawPixel interface
 IRawPixelsPtr* ippRawPixel = new IRawPixelsPtr[rstInfo.lNumbands];
 for (i = 0; i < rstInfo.lNumbands; i++){
  ippRawPixel[i] = ippBand[i];
 }
 ipRasProps =  ipRaster;
 // Create a DblPnt to hold the PixelBlock size
 IPntPtr ipSize(CLSID_DblPnt);
 long lWidth, lHeight;
 ipRasProps->get_Width(&lWidth);
 ipRasProps->get_Height(&lHeight);
 ipSize->SetCoords(lWidth, lHeight); 
 // Create PixelBlock with defined size
 IPntPtr ipPnt(CLSID_DblPnt);  
 ipPnt->SetCoords(0,0); 
 
 IPixelBlockPtr* ippBlock = new IPixelBlockPtr[rstInfo.lNumbands];
 for (i = 0; i < rstInfo.lNumbands; i++){
  ippRawPixel[i]->CreatePixelBlock(ipSize, &ippBlock[i]); 
 }
 VARIANT* pvarChunk= new VARIANT[rstInfo.lNumbands];
 SAFEARRAY** ppsa = new SAFEARRAY*[rstInfo.lNumbands];
 
 SAFEARRAYBOUND rgsabound[2];
 rgsabound[0].cElements = lWidth;
 rgsabound[0].lLbound = 0;
 rgsabound[1].cElements = lHeight;
 rgsabound[1].lLbound = 0;
 LPBYTE* ppD = new LPBYTE[rstInfo.lNumbands];
 for (i = 0; i < rstInfo.lNumbands; i++){ 
  ppsa[i] = SafeArrayCreate(VT_UI1,2,rgsabound);
  SafeArrayAccessData(ppsa[i], (void**)&ppD[i]);
 } 
// pD = pData; 事实证明,直接这样不行,必须要经过下面赋值过程
 long index;
 CProDlg* pProDlg = new CProDlg();
 pProDlg->Create(IDD_DLG_PRO);
 pProDlg->SetWindowText("正在生成图像文件");
 pProDlg->ShowWindow(SW_SHOW);
 pProDlg->m_pro.SetRange(0, lWidth * lHeight-1);
 for (int k = 0; k < rstInfo.lNumbands; k++){ 
  for(i=0;i<lWidth;i++)         
  {
   for (long j = 0; j < lHeight; j++)
   {    
     index = i*lHeight + j;  
     ppD[k][index] =ppData[k][index];//i+j;
   }
   pProDlg->m_pro.SetPos(i*lHeight+j);
  }
 }
 delete pProDlg;
 pProDlg = NULL;
 for (i = 0; i < rstInfo.lNumbands; i++){ 
  pvarChunk[i].vt = VT_ARRAY|VT_UI1;
  pvarChunk[i].parray = ppsa[i]; 
  SafeArrayUnaccessData(ppsa[i]); 
  ippBlock[i]->put_SafeArray(0, pvarChunk[i]);  
  ipPnt->SetCoords(0,0); 
  // Write the PixelBlock to raster band
  ippRawPixel[i]->Write(ipPnt, ippBlock[i]);
 }
}

下面应用这个函数生成一个三波段图像
void CMainFrame::OnCreate3bimg()
{
 OnShptoras();
 return;
// iniInfo.DeletFile("E:\\尺度转换_灰色预测
\\DataTemp\\Vector\\prerslt.img");
 CString path = iniInfo.GetProfileInfo("System", "VectorWorkPath");
 path.TrimLeft();
 path.TrimRight();
 //CString path = "E:\\尺度转换_灰色预测
\\DataTemp\\Vector";
 CString str = path + "
\\prerslt.img";
 DeleteFile(str);
 return;
 if (TRUE == iniInfo.IsFileValid("E:\\考研资s料")) {
  MessageBox("文件合法");
 } 
 return;
 // TODO: Add your command handler code here
 CFileDialog fDlg(FALSE, "bmp", "", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  "BMP(*bmp)|*bmp|IMAGENE_Image(*.img)|*.img|TIFF(*.tif)|*.tif|GRID||");
 if (fDlg.DoModal() == IDCANCEL) {
  return;
 }
 CString sRasPath = fDlg.GetPathName();//"F:\\尺度转换_灰色预测
\\PredictGIS_改模型2\\test0.bmp";
// CString sFieldName = "STATE_ID";
 CString sRasFileName = fDlg.GetFileName();
 int nIndex = sRasPath.ReverseFind('\\');
 sRasPath = sRasPath.Left(nIndex);
 
 CWzjAoRasterOp rstOp;
 RasterInfo rstInfo;
 IPointPtr ipOrg(CLSID_Point);
 ipOrg->PutCoords(1200,1500);
 rstInfo.RasterFormat(ipOrg, 100,100,30,30,3, PT_UCHAR, NULL);
 LPBYTE ppData[3];
 ppData[0] = new BYTE[100*100];
 ppData[1] = new BYTE[100*100];
 ppData[2] = new BYTE[100*100];
 for (int i = 0; i < 100; i++){
  for (int j = 0; j < 100; j++){   
   if (i <= 50 && j <= 50) {
    ppData[0][i * 100 + j] = 255;
    ppData[1][i * 100 + j] = 0;
    ppData[2][i * 100 + j] = 0;
   }
   else if (i > 50 && j <= 50) {
    ppData[0][i * 100 + j] = 0;
    ppData[1][i * 100 + j] = 255;
    ppData[2][i * 100 + j] = 0;
   }
   else if (i <= 50 && j > 50) {
    ppData[0][i * 100 + j] = 0;
    ppData[1][i * 100 + j] = 0;
    ppData[2][i * 100 + j] = 255;
   }
   else{
    ppData[0][i * 100 + j] = 255;
    ppData[1][i * 100 + j] = 255;
    ppData[2][i * 100 + j] = 0;
   }
  }
 }
 rstOp.WriteRaster(sRasPath, sRasFileName, rstInfo, ppData, "IMAGINE Image", 0);
}


  • 标签:多波段图像 AO 
  • 发表评论:

      大名:
      密码: (游客无须输入密码)
      主页:
      标题:
      页面载入中....
    Powered by Oblog.