ico文件不能转,因为ico文件比较特殊,他可以一个文件里存放多个不同尺寸的文件。目前只有decoder没有encoder所以只能读不能写。
int CResourceCreator::GetImageCLSID(const WCHAR* format, CLSID* pCLSID)
{
//得到格式为format的图像文件的编码值,访问该格式图像的COM组件的GUID值保存在pCLSID中
UINT num = 0;
UINT size = 0;
Gdiplus::ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num, &size);
if(size == 0)
return FALSE; // 编码信息不可用
//分配内存
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return FALSE; // 分配失败
//获得系统中可用的编码方式的所有信息
GetImageEncoders(num, size, pImageCodecInfo);
//在可用编码信息中查找format格式是否被支持
for(UINT i = 0; i < num; ++i)
{
//MimeType:编码方式的具体描述
if(wcscmp(pImageCodecInfo[i].MimeType, format) == 0)
{
*pCLSID = pImageCodecInfo[i].Clsid;
free(pImageCodecInfo);
return TRUE;
}
}
free(pImageCodecInfo);
return FALSE;
}
BOOL CResourceCreator::MBmpToMImage(char* strBmpFile, char* strIconFile)
{
FILE* cbfBmp = fopen( strBmpFile, "rb" );
FILE* cbfImage = fopen( strIconFile, "wb" );
fseek( cbfBmp, 0, SEEK_END );
int iBmpSize = ftell( cbfBmp );
fseek( cbfBmp, 0, SEEK_SET );
HGLOBAL hMemBmp = GlobalAlloc(GMEM_FIXED, iBmpSize);
if (hMemBmp == NULL)
return FALSE;
IStream* pStmBmp = NULL;
CreateStreamOnHGlobal(hMemBmp, FALSE, &pStmBmp);
if (pStmBmp == NULL)
{
GlobalFree(hMemBmp);
fclose( cbfBmp );
fclose( cbfImage );
return FALSE;
}
BYTE* pbyBmp = (BYTE *)GlobalLock(hMemBmp);
fread( pbyBmp, iBmpSize, 1, cbfBmp );
Image* imImage = NULL;
imImage = Image::FromStream(pStmBmp, FALSE);
if (imImage == NULL)
{
GlobalUnlock(hMemBmp);
GlobalFree(hMemBmp);
fclose( cbfBmp );
fclose( cbfImage );
return FALSE;
}
USES_CONVERSION;
CLSID clImageClsid;
GetImageCLSID(A2W("image/jpeg"), &clImageClsid); //要转成什么格式,就写相应的:image/png, image/bmp
HGLOBAL hMemImage = GlobalAlloc(GMEM_MOVEABLE, 0);
if (hMemImage == NULL)
{
pStmBmp->Release();
GlobalUnlock(hMemBmp);
GlobalFree(hMemBmp);
if (imImage != NULL)
delete imImage;
fclose( cbfBmp );
fclose( cbfImage );
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;
fclose( cbfBmp );
fclose( cbfImage );
return FALSE;
}
imImage->Save(pStmImage, &clImageClsid);
if (pStmImage == NULL)
{
pStmBmp->Release();
pStmImage->Release();
GlobalUnlock(hMemBmp);
GlobalFree(hMemBmp);
GlobalFree(hMemImage);
if (imImage != NULL)
delete imImage;
fclose( cbfBmp );
fclose( cbfImage );
return FALSE;
}
LARGE_INTEGER liBegin = {0};
pStmImage->Seek(liBegin, STREAM_SEEK_SET, NULL);
BYTE* pbyImage = (BYTE *)GlobalLock(hMemImage);
fwrite( pbyImage, GlobalSize(hMemImage), 1, cbfImage );
if (imImage != NULL) delete imImage;
pStmBmp->Release();
pStmImage->Release();
GlobalUnlock(hMemBmp);
GlobalUnlock(hMemImage);
GlobalFree(hMemBmp);
GlobalFree(hMemImage);
fclose( cbfBmp );
fclose( cbfImage );
return TRUE;
}