GDALDataset* pDataSource = (GDALDataset*) GDALOpen(sFileName.c_str(),
(GDALAccess) 0);
if (!pDataSource)
return AtlReportError(GetObjectCLSID(), _T((TCHAR*)
CPLGetLastErrorMsg()));
int nBandCount = pDataSource->GetRasterCount();
int nWidth = pDataSource->GetRasterXSize();
int nHeight = pDataSource->GetRasterYSize();
GDALDataType eBandType = pDataSource->GetRasterBand(1)->GetRasterDataType();
GDALDriver* pMemDriver = GetGDALDriverManager()->GetDriverByName("MEM");
if (!pMemDriver)
return AtlReportError(GetObjectCLSID(), _T((TCHAR*)
CPLGetLastErrorMsg()));
GDALDataset* pMemDataset = pMemDriver->Create(sStreamId.str().c_str(),
nWidth, nHeight, nBandCount, eBandType, NULL);
if (!pMemDataset)
return AtlReportError(GetObjectCLSID(), _T((TCHAR*)
CPLGetLastErrorMsg()));
for (int i = 0; i < nBandCount; i++ )
{
GDALRasterBand* pMemBand = pMemDataset->GetRasterBand(i + 1);
GDALRasterBand* pRasterBand = pDataSource->GetRasterBand(i + 1);
pMemBand->SetColorInterpretation(pRasterBand->GetColorInterpretation());
pMemBand->SetOffset(pRasterBand->GetOffset());
pMemBand->SetScale(pRasterBand->GetScale());
pMemBand->SetUnitType(pRasterBand->GetUnitType());
BOOL bSuccess = FALSE;
double nNullValue = pRasterBand->GetNoDataValue(&bSuccess);
if (bSuccess == TRUE)
{
GDALColorTable* pColorTable = pRasterBand->GetColorTable();
if (pColorTable != NULL)
{
GDALColorEntry colorEntry;
pColorTable->GetColorEntryAsRGB((int) nNullValue,
&colorEntry);
hr = pMemBand->SetNoDataValue((double)
colorEntry.c4);
if (FAILED(hr)) return hr;
}
else
{
hr = pMemBand->SetNoDataValue((double) nNullValue);
if (FAILED(hr)) return hr;
}
}
if (!pMemBand->GetColorTable())
{
GDALColorTable* pColorTable = pRasterBand->GetColorTable();
pMemBand->SetColorTable(pColorTable != NULL ?
pColorTable->Clone() : NULL);
}
unsigned char* pBytes = (unsigned char*) malloc(sizeof(unsigned
char) * nWidth * nHeight);
memset(pBytes, 0, nWidth * nHeight);
CPLErr err = pRasterBand->RasterIO(GF_Read, 0, 0, nWidth, nHeight,
pBytes, nWidth, nHeight, eBandType, 0, 0);
if (err != CE_None)
return AtlReportError(GetObjectCLSID(), _T((TCHAR*)
CPLGetLastErrorMsg()));
err = pMemBand->RasterIO(GF_Write, 0, 0, nWidth, nHeight, pBytes,
nWidth, nHeight, eBandType, 0, 0);
if (err != CE_None)
return AtlReportError(GetObjectCLSID(), _T((TCHAR*)
CPLGetLastErrorMsg()));
if (pBytes) delete [] pBytes;
}
if (pDataSource)
GDALClose(pDataSource);
pDataSource = NULL;
if (m_pMemDataset)
GDALClose(m_pMemDataset);
m_pMemDataset = pMemDataset;
|