想用CImage类HRESULT Load(
IStream* pStream
) throw();函数,将内存中的数据直接存为JPG格式图像。
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, 1); byte* pData = (byte*)GlobalLock(hGlobal);
memcpy(pData, pMemData, 1);
IStream * pStream = NULL;
if (CreateStreamOnHGlobal(hGlobal, FALSE, & pStream) == S_OK)
{
CImage image = new CImage;
if (SUCCEEDED(image.Load(pStream)))
{ // ..
}
pStream -> Release();
}
GlobalFree(hGlobal);image load失败,为啥呢?
IStream* pStream
) throw();函数,将内存中的数据直接存为JPG格式图像。
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, 1); byte* pData = (byte*)GlobalLock(hGlobal);
memcpy(pData, pMemData, 1);
IStream * pStream = NULL;
if (CreateStreamOnHGlobal(hGlobal, FALSE, & pStream) == S_OK)
{
CImage image = new CImage;
if (SUCCEEDED(image.Load(pStream)))
{ // ..
}
pStream -> Release();
}
GlobalFree(hGlobal);image load失败,为啥呢?
或者更酷的CxFile之类的
if (FAILED(hr)) _com_issue_error(hr);
DWORD cbWritten;
pStm->Write(pSourceBuf, nSourceStreamLen, &cbWritten);
LARGE_INTEGER l;
l.QuadPart = 0;
pStm->Seek(l,STREAM_SEEK_SET,NULL);
pSourceBuf, nSourceStreamLen是源和长度
继续求教。。
将一个BYTE*转为一个IStream*就行了。。
谢谢。。
HGLOBAL hMem = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_NODISCARD,nSize);
IStream *pStream = NULL;
CreateStreamOnHGlobal(hMem,TRUE,&pStream);
pStream->Write(pMemData,nSize,NULL);ULARGE_INTEGER pos;
LARGE_INTEGER iMove;
iMove.QuadPart = 0;
pStream->Seek(iMove,STREAM_SEEK_SET,&pos);
int nSize = ...; //BYTE*指向的数据的长度
HGLOBAL hMem = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_NODISCARD,nSize);
IStream *pStream = NULL;
CreateStreamOnHGlobal(hMem,TRUE,&pStream);
pStream->Write(pMemData,nSize,NULL);
我运行到最后一步的时候就出错了。。pMemData = new byte(width*512*Num);我是这么定义这个指针的int nSize = width*512*Num;
这样不对吗?
注意看MSDN中 Res 部分。
pMemData = new byte[width*512*Num];
int nSize = width*512*Num;
int width = 10;
int Num = 1;
int nSize = width*512*Num; //BYTE*指向的数据的长度
BYTE* pMemData = new BYTE[nSize];
HGLOBAL hMem = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_NODISCARD,nSize);
IStream *pStream = NULL;
CreateStreamOnHGlobal(hMem,TRUE,&pStream);
pStream->Write(pMemData, nSize, NULL);
ULARGE_INTEGER pos;
LARGE_INTEGER iMove;
iMove.QuadPart = 0;
pStream->Seek(iMove,STREAM_SEEK_SET,&pos);
看来你的内存还是没申请对,访问0内存了。试了一下,下面的代码执行没问题,你再检查一下吧。
C/C++ code int width = 10;
int Num = 1;
int nSize = width*512*Num; //BYTE*指向的数据的长度
BYTE* pMemData = new BYTE[nSize];
……
这部分代码没有问题,不过在使用CIMAGE::load的时候返回还是E_FAIL
那当然了,你直接load我创建的stream,里面都是一些乱七八糟的数据,肯定失败。还是要根据你的数据创建。即然后面的那段代码没问题,说明是你的pMemData数据有问题,比如说width或Num不对,调试一下吧。
这个函数不一定能用的了,MSDN中说是“Shlwapi.dll (version 5.0 or later)”中定义,但我的XP中该dll版本是6.0.2900.3562,竟然没有导出该函数。
嗯, 是没看仔细, vista之前的版本可以用序号12。
如果你的内存中只是像素数据肯定是不行的,你可以搜一下CSDN,把这些像素转成bmp文件格式的数据,应该就行了(不过要转成bmp文件格式,还不如转成HBITMAP,直接在GDI中显示呢)。