『公告』 预祝您龙年大吉,万事如意, 过节期间, 大家如需数据服务,请拨打400 或直接添加客服微信,再祝大家龙年,心想事成。
关注我们 新浪 腾讯

用多维灰度矩阵生成多波段栅格图像

用多维灰度矩阵生成多波段栅格图像
这是CWzjAoRasterOp类中一个方法,只要有了各个波段的灰度矩阵的值,就可以生成ArcGIS支持的多波段栅格图像,如IMG,GRID,TIFF等。

       这是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);

}

      京ICP备2025132830号-1 京公网安备 号