開発備忘録:OleLoadPictureで画像を読み込む

当サイトではアフィリエイト広告を利用しております。

開発

C++/Win32でoleaut32!OleLoadPicture関数を使って外部の画像ファイルをHBITMAPとして読み込むコードは以下の通り。

#include <windows.h>
#include <olectl.h>
#include <shlwapi.h>
#include <stdio.h>

#pragma comment(lib, "oleaut32.lib")
#pragma comment(lib, "shlwapi.lib")
#pragma comment(lib, "uuid.lib")

HBITMAP doLoadImageToHBITMAP(LPCWSTR filename)
{
    IStream *pStream;
    HRESULT hr = SHCreateStreamOnFileW(filename, STGM_READ | STGM_SHARE_DENY_WRITE, &pStream);
    if (FAILED(hr))
        return NULL;

    HBITMAP hBitmap = NULL;
    IPicture *pPicture;
    hr = OleLoadPicture(pStream, 0, FALSE, IID_IPicture, (void**)&pPicture);
    if (SUCCEEDED(hr))
    {
        OLE_HANDLE hPic = NULL;
        pPicture->get_Handle(&hPic);
        hBitmap = (HBITMAP)CopyImage((HBITMAP)hPic, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG);
        pPicture->Release();
    }

    pStream->Release();
    return hBitmap;
}

int main()
{
    HBITMAP hbm = doLoadImageToHBITMAP(L"image.jpg");
    printf("hbm: %p\n", hbm);
    if (hbm)
    {
        // Do something on hbm...

        DeleteObject(hbm);
    }
    return 0;
}

shlwapi!SHCreateStreamOnFileW関数は、ファイルからIStreamを作成する関数である。

oleaut32!OleLoadPicture関数は、JPEG、BMP、GIFなどの画像ファイルを一部、読み込めるが、比較的新しい画像形式やPNG画像などは読み込めないので注意する。PNGも読み込みたいならGDI+を使うのが王道だ。

コメント

タイトルとURLをコピーしました