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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值