我的应用场景是这样的。
我有些位图,存入数据库中(将原始的文件读出)。在需要的时候从数据库中读出位图数据(这些数据就是原始的位图文件的数据)。我的意识是,从位图文件直接读出的数据,直接放入内存中,并依据该块建立IStream。然后由CImage加载。但是,CImage加载IStream时,便出错了。我想会不会是,位图文件的数据存放形式,与内存不一样。从而导致CImage加载时无法解析正确的位图格式。下面是我的实现,我不了解图形、图像方面的编程,请大家指教。 unsigned char* p; // 位图数据
int len; // 位图数据长度 // 这里申请一块内存用
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, len);
void * pData = GlobalLock(hGlobal);
memcpy(pData, p, len); // 拷贝位图数据进去
GlobalUnlock(hGlobal); // 创建IStream
IStream * pStream = NULL;
if (CreateStreamOnHGlobal(hGlobal, TRUE, &pStream) != S_OK)
return NULL; if ( !pStream )
return NULL; // 使用CImage加载位图内存
CImage img;
if ( SUCCEEDED( img.Load( pStream ) ) ) // 这里出错,不知道为啥。
{
pStream -> Release();
return CBitmap::FromHandle( img );
}
else
{
pStream -> Release();
return NULL;
}
我有些位图,存入数据库中(将原始的文件读出)。在需要的时候从数据库中读出位图数据(这些数据就是原始的位图文件的数据)。我的意识是,从位图文件直接读出的数据,直接放入内存中,并依据该块建立IStream。然后由CImage加载。但是,CImage加载IStream时,便出错了。我想会不会是,位图文件的数据存放形式,与内存不一样。从而导致CImage加载时无法解析正确的位图格式。下面是我的实现,我不了解图形、图像方面的编程,请大家指教。 unsigned char* p; // 位图数据
int len; // 位图数据长度 // 这里申请一块内存用
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, len);
void * pData = GlobalLock(hGlobal);
memcpy(pData, p, len); // 拷贝位图数据进去
GlobalUnlock(hGlobal); // 创建IStream
IStream * pStream = NULL;
if (CreateStreamOnHGlobal(hGlobal, TRUE, &pStream) != S_OK)
return NULL; if ( !pStream )
return NULL; // 使用CImage加载位图内存
CImage img;
if ( SUCCEEDED( img.Load( pStream ) ) ) // 这里出错,不知道为啥。
{
pStream -> Release();
return CBitmap::FromHandle( img );
}
else
{
pStream -> Release();
return NULL;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货