void CTestDlg::OnButton1() 
{
CDC *pDC; pDC = CDC::FromHandle(::GetDC(NULL)); int Width = GetSystemMetrics(SM_CXSCREEN);
int Height = GetSystemMetrics(SM_CYSCREEN); CDC memDC;
memDC.CreateCompatibleDC(pDC); CBitmap memBitMap,*oldMemBitMap; memBitMap.CreateCompatibleBitmap(pDC, Width, Height); oldMemBitMap = memDC.SelectObject(&memBitMap); memDC.BitBlt(0,0,Width,Height,pDC,0,0,SRCCOPY); DWORD dwCount = 1280*800*4; BYTE *pBitMapBits = new BYTE[1280*800*4]; ZeroMemory(pBitMapBits,dwCount);

DWORD dwTemp = memBitMap.GetBitmapBits(dwCount,(LPVOID)pBitMapBits);

CMemFile mfBitMap(pBitMapBits,(UINT)dwCount,0);
CMemFile mfNewBitMap;

MBmpToMImage(mfBitMap,mfNewBitMap); CBitmap bpNewBitMap;
}BOOL CTestDlg:: MBmpToMImage(CMemFile& cbfBmp, CMemFile& cbfImage/*, CString strType*/)
{
int iBmpSize = cbfBmp.GetLength();
HGLOBAL hMemBmp = GlobalAlloc(GMEM_FIXED, iBmpSize);
if (hMemBmp == NULL) return FALSE;
IStream* pStmBmp = NULL;
CreateStreamOnHGlobal(hMemBmp, FALSE, &pStmBmp);
if (pStmBmp == NULL) 
{
GlobalFree(hMemBmp);
return FALSE;
}
BYTE* pbyBmp = (BYTE *)GlobalLock(hMemBmp);
cbfBmp.SeekToBegin();
cbfBmp.Read(pbyBmp, iBmpSize);


Image imImage(pStmBmp,TRUE);
CLSID clImageClsid;
int i;
i = GetEncoderClsid(L"image/jpeg", &clImageClsid); int j = imImage.Save(L"C:\\x.jpg",&clImageClsid); if (1 != j)
{
MessageBox("错误2");
}
return TRUE;
}
最后save一直有错误,不知道怎么回事 ,望各位大侠解答!!!ps:GetEncoderClsid函数没错

解决方案 »

  1.   

    应该是DWORD dwTemp = memBitMap.GetBitmapBits(dwCount,(LPVOID)pBitMapBits);这步错误
    GetBitmap获得的应该只是图像像素数据,所以不行。
      

  2.   

    发错了,重发。GetBitmapBits获得的应该只是图像像素数据,所以不行
      

  3.   

    除了图像数据,再把BITMAPINFOHEADER补上应该就可以了。
    就是说,你的内存里的图像数据:应该是BITMAPINFOHEADER + 图像像素数据。