首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 平面设计 > 图形图像 >

用ecw库读取ecw,jp2格式图片做opengl纹理的有关问题

2013-07-16 
用ecw库读取ecw,jp2格式图片做opengl纹理的问题用erdas的sdk4.1读取ecw图片,然后获取到数据作为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);


if (eReadStatus!=NCSECW_READ_OK)
{
ReportError("Could not read line data");
NCScbmCloseFileView(pNCSFileView);
free(pBandList);
NCSecwShutdown();
return false;
}
pReadBuffer += nLineSize;
}
// opengl纹理
glGenTextures(1, &m_nTextureID);
glBindTexture(GL_TEXTURE_2D, m_nTextureID);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, nViewSizeX-1, nViewSizeY-10, //?
0, GL_RGB, GL_UNSIGNED_BYTE, pReadBuffer);
// Close file view
NCScbmCloseFileView(pNCSFileView);
free(pBandList);

// Shutdown library resources
NCSecwShutdown();

return true;
}
[解决办法]
,申请的存储空间就要成以3  这句话是不对的。并不一定是乘以3.

热点排行