#概要
いつも御世話になっております。Windows10 で Visual Studio 2019 の C++ を用いて、デクストップ・アプリを作りたいと考えています。以下に引用するようなコードで、次のような作業を行っています。
- PNGファイルを裏画面に Load する
- 裏画面に、正方形を作図する
- 裏画面を、表画面に表示する
このようにして表示した画面を、ふたたびPNGファイルに保存しようと考えています。「BMP画像をPNG画像に変換する」等の情報を参考にして、いろいろと考えているのですが、どうにもうまくいきません。
#現在のコード
C++
1 2LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 3{ 4 switch (message) 5 { 6 case WM_COMMAND: 7 { 8 int wmId = LOWORD(wParam); 9 switch (wmId) 10 { 11 case IDM_ABOUT: 12 DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); 13 break; 14 15 case IDM_SAVE: 16 // ここで画面を保存したい 17 break; 18 19 case IDM_EXIT: 20 DestroyWindow(hWnd); 21 break; 22 default: 23 return DefWindowProc(hWnd, message, wParam, lParam); 24 } 25 } 26 break; 27 case WM_PAINT: 28 { 29 RECT recDisp; 30 GetClientRect(hWnd, &recDisp); // クライアントを取得 31 int cx = recDisp.right; // クライアントのヨコ 32 int cy = recDisp.bottom; // クライアントのタテ 33 34 // PNGファイルを読み込む 35 CString filePath; 36 CImage* img = new CImage(); 37 filePath = L"sample.png"; 38 img->Load(filePath); 39 int width = img->GetWidth(); 40 int height = img->GetHeight(); 41 42 // ここから実際の描写 43 HDC hdc = GetDC(hWnd); 44 HDC mem = CreateCompatibleDC(hdc); //HDCを取得 45 HBITMAP bmp = CreateCompatibleBitmap(hdc, cx, cy); //HBITMAPを取得 46 HBITMAP obmp = (HBITMAP)SelectObject(mem, bmp); //HBITMAPを関連付ける 47 48 HPEN hpen = CreatePen(PS_SOLID, 5, RGB(0x00, 0x7f, 0xff)); 49 50 // 裏画面に描写する 51 FillRect(mem, &recDisp, br); 52 img->Draw(mem, 0, 0, cx, ( cx * height ) / width, 0, 0, width, height); 53 54 HPEN ohpen = (HPEN)SelectObject(mem, hpen); 55 56 MoveToEx(mem, 50, 50,NULL); 57 LineTo(mem, 150, 50); 58 LineTo(mem, 150, 150); 59 LineTo(mem, 50, 150); 60 LineTo(mem, 50, 50); 61 SelectObject(mem, ohpen); 62 DeleteObject(hpen); 63 64 TextOut(mem, 10, 10, wss.c_str(), (int)wss.length()); 65 66 // 表画面にコピー 67 PAINTSTRUCT ps; 68 BeginPaint(hWnd, &ps); 69 BitBlt(hdc, 0, 0, cx, cy, mem, 0, 0, SRCCOPY); 70 EndPaint(hWnd, &ps); 71 72 // あれこれ削除する。 73 SelectObject(mem, obmp); 74 DeleteObject(bmp); 75 DeleteDC(mem); 76 } 77 break; 78 79 case WM_DESTROY: 80 PostQuitMessage(0); 81 break; 82 83 default: 84 return DefWindowProc(hWnd, message, wParam, lParam); 85 } 86 return 0; 87} 88 89 90
#エラー表示
上のコードの状態では、エラーは表示されません。しかし、「BMP画像をPNG画像に変換する」に掲載されている次のコード
C++
1CLSID encoderClsid; 2Status stat; 3GetEncoderClsid(L"image/png", &encoderClsid); 4stat = image->Save(L"sample2.png", &encoderClsid, NULL);
を、冒頭の「// ここで画面を保存したい」の所に挿入すると、次のようなエラーが表示されます。
error C2065: 'Status': 定義されていない識別子です。
error C2146: 構文エラー: ';' が、識別子 'stat' の前に必要です。
warning C4551: 関数呼び出しに引数リストがありません。
error C3861: 'GetEncoderClsid': 識別子が見つかりませんでした
error C2065: 'image': 定義されていない識別子です。
#お願い
case IDM_SAVE:
// ここで画面を保存したい
break;
のところで、画像を保存するには、どのようにすればよろしいでしょうか。なお、そもそも、WM_PAINT でない場所で「画像を保存する」ということは可能なのだろうか、という疑問もあります。よろしく御回答くださいますよう、お願い申し上げます。
#追加
一番最後の「疑問」についてですが、
0. 画面に表示させたら、その内容を Bitmap 領域に保存しておく
(単なるコピー)。
0. 必要な場合に、そのBitmapをPNGに変換して保存する
という方法で可能かな、と思いました。
#追加その2
CImage で、あれこれ作業するよりも、openCV を使って作業した方が楽なのかなという気がしてきました。(しかし、OpenCV は、まだまったく使ったことがありません)。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/14 08:07