用多维灰度矩阵生成多波段栅格图像[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);
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;
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;
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 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;
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);
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]);
}
}
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];
{
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);
}
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);
}
