现在的位置: 首页 > 综合 > 正文

HBITMAP另存为JPEG/PNG/TIFF/GIF/BMP

2019年03月19日 ⁄ 综合 ⁄ 共 1336字 ⁄ 字号 评论关闭
   BOOL GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
    {
        UINT num = 0;
        UINT size = 0;

        GetImageEncodersSize(&num, &size);

        if(size == 0)
            return FALSE;

        ImageCodecInfo* pImageCodecInfo = (ImageCodecInfo*)new BYTE[size];
        if(pImageCodecInfo == NULL)
            return FALSE;

        GetImageEncoders(num, size, pImageCodecInfo);
        for(UINT j = 0; j < num; ++j)
        {
            if(wcscmp(pImageCodecInfo[j].MimeType, format) == 0)
            {
                *pClsid = pImageCodecInfo[j].Clsid;
                delete pImageCodecInfo;
                return TRUE;
            }
        }

        delete pImageCodecInfo;
        return FALSE;
    }

    BOOL GetEncoderClsName(LPCTSTR lpszFileName, LPTSTR lpszBuf, DWORD dwBufSize)
    {
        TCHAR* pFileExt = StrRChrW(lpszFileName, NULL, _T('.'));
        if(NULL == pFileExt)
            return FALSE;

        _stprintf_s(lpszBuf, dwBufSize, _T("image/%s"), pFileExt + 1);
        return TRUE;
    }

    // 支持的保存格式:BMP/TIFF/GIF/JPEG/PNG
    BOOL SaveBmpToJpeg(HBITMAP hBmp, LPCTSTR lpszJpegFileName, ULONG quality = 100)
    {
        TCHAR sEncoderClsName[50] = {0};
        if(!GetEncoderClsName(lpszJpegFileName, sEncoderClsName, 50))
            return FALSE;

        CLSID jpgClsid;
        if(!GetEncoderClsid(sEncoderClsName, &jpgClsid))
            return FALSE;

        EncoderParameters encoderParameters;
        encoderParameters.Count = 1;
        encoderParameters.Parameter[0].Guid = EncoderQuality;
        encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
        encoderParameters.Parameter[0].NumberOfValues = 1;
        encoderParameters.Parameter[0].Value = &quality;

        Gdiplus::Bitmap bmp(hBmp, NULL);
        Status status = bmp.Save(lpszJpegFileName, &jpgClsid, &encoderParameters);

        return (status != Ok);
    }

抱歉!评论已关闭.