用ecw库读取ecw,jp2格式图片做opengl纹理的有关问题
用ecw库读取ecw,jp2格式图片做opengl纹理的问题
用erdas的sdk4.1读取ecw图片,然后获取到数据作为OpenGL的纹理,但是有问题:ecw获取数据是按照波段获取的,比如一幅RGB的图像,获取到的数据是按照RGB分别获取的,申请的存储空间就要成以3,再用到OpenGL里面之后就不对了。详细代码如下:请教各位高手有用过的,帮帮忙,谢谢了!
// 打开文件
bool CECWLib::openFile(char* strFileName)
{
// 初始化SDK
NCSecwInit();
// 打开文件,并打开一个视图
NCSFileView *pNCSFileView = NULL;
NCSError eError = NCScbmOpenFileView(strFileName, &pNCSFileView, NULL);
if (eError != NCS_SUCCESS)
{
ReportError("Could not open view for file:%s, Error = %s",
strFileName, NCSGetErrorText(eError));
return false;
}
// 获取文件信息
NCSFileViewFileInfo *pNCSFileInfo = NULL;
eError = NCScbmGetViewFileInfo(pNCSFileView, &pNCSFileInfo);
if (eError != NCS_SUCCESS)
{
ReportError("Could not get file information for file:%s, Error = %s",
strFileName, NCSGetErrorText(eError));
return false;
}
UINT32 nViewSizeX = pNCSFileInfo->nSizeX;
UINT32 nViewSizeY = pNCSFileInfo->nSizeY;
// 获取图像颜色成分:RGB 或者 BGR
UINT32 *pBandList = (UINT32 *)malloc(sizeof(UINT32) * pNCSFileInfo->nBands);
if (pBandList == NULL)
{
ReportError("Unable to malloc band list.");
}
INT32 nBand = 0;
for (nBand=0; nBand<pNCSFileInfo->nBands; nBand++)
{
pBandList[nBand] = nBand;
}
// 分配存储数据的内存
long nLineSize = (nViewSizeX-1)*nBand;
long nSize = nLineSize*nViewSizeY;
UINT8 *pReadBuffer = (UINT8*)malloc(nSize); if (pReadBuffer==NULL)
{
ReportError("Could not malloc read buffer");
return false;
}
memset(pReadBuffer, 0, nSize);
// 设置要显示的视图(这里是整个视图)
eError = NCScbmSetFileView(pNCSFileView,
pNCSFileInfo->nBands, pBandList,
0, 0,
nViewSizeX-1, nViewSizeY-1,
nViewSizeX, nViewSizeY);
if (eError != NCS_SUCCESS)
{
ReportError("Error setting file view: %s", NCSGetErrorText(eError));
return false;
}
// 读取数据
NCSEcwReadStatus eReadStatus = NCSECW_READ_OK;
int nIndex = 0;
for (nIndex=0; nIndex<nViewSizeY-2; nIndex++)
{
// 获取数据
eReadStatus = NCScbmReadViewLineRGB(pNCSFileView, pReadBuffer);
用erdas的sdk4.1读取ecw图片,然后获取到数据作为OpenGL的纹理,但是有问题:ecw获取数据是按照波段获取的,比如一幅RGB的图像,获取到的数据是按照RGB分别获取的,申请的存储空间就要成以3,再用到OpenGL里面之后就不对了。详细代码如下:请教各位高手有用过的,帮帮忙,谢谢了!
// 打开文件
bool CECWLib::openFile(char* strFileName)
{
// 初始化SDK
NCSecwInit();
// 打开文件,并打开一个视图
NCSFileView *pNCSFileView = NULL;
NCSError eError = NCScbmOpenFileView(strFileName, &pNCSFileView, NULL);
if (eError != NCS_SUCCESS)
{
ReportError("Could not open view for file:%s, Error = %s",
strFileName, NCSGetErrorText(eError));
return false;
}
// 获取文件信息
NCSFileViewFileInfo *pNCSFileInfo = NULL;
eError = NCScbmGetViewFileInfo(pNCSFileView, &pNCSFileInfo);
if (eError != NCS_SUCCESS)
{
ReportError("Could not get file information for file:%s, Error = %s",
strFileName, NCSGetErrorText(eError));
return false;
}
UINT32 nViewSizeX = pNCSFileInfo->nSizeX;
UINT32 nViewSizeY = pNCSFileInfo->nSizeY;
// 获取图像颜色成分:RGB 或者 BGR
UINT32 *pBandList = (UINT32 *)malloc(sizeof(UINT32) * pNCSFileInfo->nBands);
if (pBandList == NULL)
{
ReportError("Unable to malloc band list.");
}
INT32 nBand = 0;
for (nBand=0; nBand<pNCSFileInfo->nBands; nBand++)
{
pBandList[nBand] = nBand;
}
// 分配存储数据的内存
long nLineSize = (nViewSizeX-1)*nBand;
long nSize = nLineSize*nViewSizeY;
UINT8 *pReadBuffer = (UINT8*)malloc(nSize); if (pReadBuffer==NULL)
{
ReportError("Could not malloc read buffer");
return false;
}
memset(pReadBuffer, 0, nSize);
// 设置要显示的视图(这里是整个视图)
eError = NCScbmSetFileView(pNCSFileView,
pNCSFileInfo->nBands, pBandList,
0, 0,
nViewSizeX-1, nViewSizeY-1,
nViewSizeX, nViewSizeY);
if (eError != NCS_SUCCESS)
{
ReportError("Error setting file view: %s", NCSGetErrorText(eError));
return false;
}
// 读取数据
NCSEcwReadStatus eReadStatus = NCSECW_READ_OK;
int nIndex = 0;
for (nIndex=0; nIndex<nViewSizeY-2; nIndex++)
{
// 获取数据
eReadStatus = NCScbmReadViewLineRGB(pNCSFileView, pReadBuffer);