//从内存中创建图片对象
Gdiplus::Image* LoadImageFromMemory( LPVOID pBuf,size_t dwSize )
{
HGLOBAL hMem = ::GlobalAlloc(GMEM_FIXED, dwSize);
BYTE* pMem = (BYTE*)::GlobalLock(hMem);
memcpy(pMem, pBuf, dwSize);
IStream* pStm = NULL;
::CreateStreamOnHGlobal(hMem, TRUE, &pStm);
Gdiplus::Image *pImg = Gdiplus::Image::FromStream(pStm);
if(!pImg || pImg->GetLastStatus() != Gdiplus::Ok)
{
pStm->Release();
::GlobalUnlock(hMem);
return 0;
}
return pImg;
}
//读取文件,并根据文件内存创建图片对象
Gdiplus::Image * LoadImageFromFile( LPCTSTR pszFileName ){
LPBYTE pData = NULL;
DWORD dwSize = 0;
HANDLE hFile = ::CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, \
FILE_ATTRIBUTE_NORMAL, NULL);
if( hFile == INVALID_HANDLE_VALUE ) return NULL;
dwSize = ::GetFileSize(hFile, NULL);
if( dwSize == 0 ) return NULL;
DWORD dwRead = 0;
pData = new BYTE[ dwSize ];
::ReadFile( hFile, pData, dwSize, &dwRead, NULL );
::CloseHandle( hFile );
if( dwRead != dwSize ) {
delete[] pData;
pData = NULL;
return NULL;
}
if (!pData) return NULL;
Gdiplus::Image* pImage = LoadImageFromMemory(pData, dwSize);
delete []pData;
return pImage;
}
//根据制定的文件类型获取CLSID
CLSID GetEncoderClsidByExtension(const WCHAR * lpExtension)
{
CLSID clsid = CLSID_NULL;
if (NULL == lpExtension)
return clsid;
UINT numEncoders = 0, size = 0;
Gdiplus::Status status = Gdiplus::GetImageEncodersSize(&numEncoders, &size);
if (status != Gdiplus::Ok)
return clsid;
Gdiplus::ImageCodecInfo* lpEncoders = (Gdiplus::ImageCodecInfo*)(malloc(size));
if (NULL == lpEncoders)
return clsid;
status = Gdiplus::GetImageEncoders(numEncoders, size, lpEncoders);
if (Gdiplus::Ok == status)
{
for (UINT i = 0; i < numEncoders; i++)
{
BOOL bFind = FALSE;
const WCHAR * pStart = lpEncoders[i].FilenameExtension;
const WCHAR * pEnd = wcschr(pStart, L';');
do
{
if (NULL == pEnd)
{
LPCWSTR lpExt = ::wcsrchr(pStart, L'.');
if ((lpExt != NULL) && (wcsicmp(lpExt, lpExtension) == 0))
{
clsid = lpEncoders[i].Clsid;
bFind = TRUE;
}
break;
}
int nLen = pEnd-pStart;
if (nLen < MAX_PATH)
{
WCHAR cBuf[MAX_PATH] = {0};
wcsncpy(cBuf, pStart, nLen);
LPCWSTR lpExt = ::wcsrchr(cBuf, L'.');
if ((lpExt != NULL) && (wcsicmp(lpExt, lpExtension) == 0))
{
clsid = lpEncoders[i].Clsid;
bFind = TRUE;
break;
}
}
pStart = pEnd+1;
if (L'\0' == *pStart)
break;
pEnd = wcschr(pStart, L';');
} while (1);
if (bFind)
break;
}
}
free(lpEncoders);
return clsid;
}