/* OleLoadPictureによるJpeg画像データの読み込み 2011/07/10 宍戸 輝光 */ #include #include LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LPVOID loadImage(char *); HINSTANCE g_hInstance; HWND g_hwMain; LPVOID g_lpBmp; LPBITMAPINFO g_bmiImage; LPVOID g_lpPixels; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ MSG msg; WNDCLASS wndclass; g_hInstance = hInstance; /* 画像ファイルからDIBを作成 */ g_lpBmp = loadImage("D:/test.jpg"); if (g_lpBmp != NULL) { /* DIBのヘッダポインタを設定 */ g_bmiImage = (LPBITMAPINFO)g_lpBmp; /* DIBのピクセル列ポインタを設定 */ g_lpPixels = (LPBYTE)g_lpBmp + sizeof(BITMAPINFO); } /* ウインドウクラス設定 */ wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "OLELOADTEST"; RegisterClass(&wndclass); /* メインウインドウ作成 */ g_hwMain = CreateWindow("OLELOADTEST", "OleLoadPictureによるJpeg画像データの読み込み", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 720, 520, NULL, NULL, hInstance, NULL); ShowWindow(g_hwMain, iCmdShow); while (GetMessage(&msg, NULL, 0, 0)) { /* メッセージループ */ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; switch (iMsg) { case WM_PAINT: hdc = BeginPaint(hwnd, &ps); /* 画像を読み込んだDIBがあれば表示 */ if (g_lpBmp != NULL) { SetDIBitsToDevice(hdc, 0, 0, g_bmiImage->bmiHeader.biWidth, g_bmiImage->bmiHeader.biHeight, 0, 0, 0, g_bmiImage->bmiHeader.biHeight, g_lpPixels, g_bmiImage, DIB_RGB_COLORS); } EndPaint(hwnd, &ps); return 0; case WM_DESTROY : /* DIBを解放 */ if (g_lpBmp != NULL) { GlobalFree(g_lpBmp); g_lpBmp = NULL; } PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, iMsg, wParam, lParam); } LPVOID loadImage(char * lpszPath) { IStream * isImage; IPicture * ipicImage; HANDLE hFile; HGLOBAL hBuf; LPVOID lpBuf; OLE_HANDLE hObj; HBITMAP hBmp; BITMAP bmpInfo; LPBITMAPINFO lpbiBmp; LPBYTE lpBmp; DWORD dwFileSize, dwLoadSize; /* 画像ファイルオープン */ hFile = CreateFile(lpszPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); /* ファイルサイズ取得 */ dwFileSize = GetFileSize(hFile, NULL); /* 画像ファイルデータ格納用メモリブロック確保 */ hBuf = GlobalAlloc(GMEM_MOVEABLE, dwFileSize); /* メモリブロックをロックしアドレスを取得 */ lpBuf = GlobalLock(hBuf); /* 画像ファイルのデータをメモリブロックに読み込む */ ReadFile(hFile, lpBuf, GetFileSize(hFile, NULL), &dwLoadSize, NULL); CloseHandle(hFile); /* メモリブロックのロック解除 */ GlobalUnlock(hBuf); /* メモリブロックからIStreamを作成 */ CreateStreamOnHGlobal(hBuf, TRUE, &isImage); /* 画像ファイルのストリームから画像オブジェクトを作成 */ OleLoadPicture(isImage, dwFileSize, FALSE, &IID_IPicture, (LPVOID*)&ipicImage); /* ストリーム解放 */ isImage->lpVtbl->Release(isImage); /* メモリブロック解放 */ GlobalFree(hBuf); /* 画像オブジェクトのハンドルを取得 */ ipicImage->lpVtbl->get_Handle(ipicImage, &hObj); hBmp = (HBITMAP)hObj; /* BITMAP情報を取得 */ GetObject(hBmp, sizeof(BITMAP), &bmpInfo); /* DIB用メモリ確保 */ lpBmp = (LPBYTE)GlobalAlloc(GPTR, sizeof(BITMAPINFO) + (bmpInfo.bmWidth * bmpInfo.bmWidth * 4)); /* 32ビットDIB用BITMAPINFO構造体設定 */ lpbiBmp = (LPBITMAPINFO)lpBmp; lpbiBmp->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); lpbiBmp->bmiHeader.biWidth = bmpInfo.bmWidth; lpbiBmp->bmiHeader.biHeight = bmpInfo.bmHeight; lpbiBmp->bmiHeader.biPlanes = 1; lpbiBmp->bmiHeader.biBitCount = 32; /* DIBピクセル列を取得 */ GetDIBits(GetDC(0), hBmp, 0, bmpInfo.bmHeight, lpBmp + sizeof(BITMAPINFO), lpbiBmp, DIB_RGB_COLORS); ipicImage->lpVtbl->Release(ipicImage); return lpBmp; }