BOOL 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 = NULL; imImage = Image::FromStream(pStmBmp, FALSE); if (imImage == NULL) { GlobalUnlock(hMemBmp); GlobalFree(hMemBmp); return FALSE; } USES_CONVERSION; CLSID clImageClsid; GetImageCLSID(A2W("image/"+strType.GetBuffer(0)), &clImageClsid); HGLOBAL hMemImage = GlobalAlloc(GMEM_MOVEABLE, 0); if (hMemImage == NULL) { pStmBmp->Release(); GlobalUnlock(hMemBmp); GlobalFree(hMemBmp); if (imImage != NULL) delete imImage; return FALSE; } IStream* pStmImage = NULL; CreateStreamOnHGlobal(hMemImage, TRUE, &pStmImage); if (pStmImage == NULL) { pStmBmp->Release(); GlobalUnlock(hMemBmp); GlobalFree(hMemBmp); GlobalFree(hMemImage); if (imImage != NULL) delete imImage return FALSE; } imImage->Save(pStmImage, &clJpgClsid); if (pStmImage == NULL) { pStmBmp->Release(); pStmImage>Release(); GlobalUnlock(hMemBmp); GlobalFree(hMemBmp); GlobalFree(hMemImage; if (imImage != NULL) delete imImage; return FALSE; } LARGE_INTEGER liBegin = {0}; pStmImage->Seek(liBegin, STREAM_SEEK_SET, NULL); BYTE* pbyImage = (BYTE *)GlobalLock(hMemImage); cbfImage.SeekToBegin(); cbfImage.Write(pbyImage, GlobalSize(hMemImage)); if (imImage != NULL) delete imImage; pStmBmp->Release(); pStmImage->Release(); GlobalUnlock(hMemBmp); GlobalUnlock(hMemImage); GlobalFree(hMemBmp); GlobalFree(hMemImage); return TRUE; } |