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+を使うのが王道だ。
コメント