Save HBITMAP to *.bmp file using only Win32

前端 未结 5 1290
醉酒成梦
醉酒成梦 2020-11-29 05:25

I have a HBITMAP in my pure Win32 project (no external libraries are used). Can I export it to a *.bmp file using only Winapi and/or CRT functions so I don\'t incur any extr

5条回答
  •  清酒与你
    2020-11-29 06:05

    Yet another minimalistic option is to use OLE's IPicture. It's always been around, still a part of Win32 API:

    #define _S(exp) (([](HRESULT hr) { if (FAILED(hr)) _com_raise_error(hr); return hr; })(exp));
    
    PICTDESC pictdesc = {};
    pictdesc.cbSizeofstruct = sizeof(pictdesc);
    pictdesc.picType = PICTYPE_BITMAP;
    pictdesc.bmp.hbitmap = hBitmap;
    
    CComPtr picture;
    _S( OleCreatePictureIndirect(&pictdesc, __uuidof(IPicture), FALSE, (LPVOID*)&picture) );
    
    // Save to a stream
    
    CComPtr stream;
    _S( CreateStreamOnHGlobal(NULL, TRUE, &stream) );
    LONG cbSize = 0;
    _S( picture->SaveAsFile(stream, TRUE, &cbSize) );
    
    // Or save to a file
    
    CComPtr disp;
    _S( picture->QueryInterface(&disp) );
    _S( OleSavePictureFile(disp, CComBSTR("C:\\Temp\\File.bmp")) );
    

提交回复
热议问题