bmp, jpg, png格式圖標互轉

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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章