teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

前回質問を続行します。

2021/05/04 05:56

投稿

dendenmushi
dendenmushi

スコア98

title CHANGED
File without changes
body CHANGED
@@ -1,145 +1,1 @@
1
- ### 前提・実現したいこと
2
- デスクトップ画像保存するC言語プログラムにおいて、BitBltからポインタを利用しRGB色情報を取得する方法を知りたいです。
3
-
4
- ### 該当のソースコード
5
-
6
- desktop_save.c
7
- ```c
8
- #include <windows.h>
9
- #include <stdio.h>
10
- void DrawCursor(HDC hdc);
11
- BOOL WriteBitmap(LPTSTR lpszFileName, int nWidth, int nHeight, LPVOID lpBits);
12
- HBITMAP CreateBackbuffer(int nWidth, int nHeight);
13
-
14
- int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
15
- {
16
- HDC hdc;
17
- HWND hwndDesk;
18
- RECT rc;
19
- BITMAP bm;
20
- HBITMAP hbmp;
21
- HBITMAP hbmpPrev;
22
-
23
- hwndDesk = GetDesktopWindow();
24
- GetWindowRect(hwndDesk, &rc);
25
-
26
- hdc = CreateCompatibleDC(NULL);
27
-
28
- // CreateDIBSectionで作成したビットマップは直接ピクセルデータにアクセス出来るポインタが使用出来る
29
- hbmp = CreateBackbuffer(rc.right, rc.bottom);
30
-
31
- BITMAP i;
32
- hbmpPrev = (HBITMAP)SelectObject(hdc, hbmp);
33
- // printf("%d\n", hbmpPrev[0]);
34
-
35
-
36
- // ピクセルデータを取得したいイメージをBitBltで転送して取り出せばよい
37
- BitBlt(hdc, 0, 0, rc.right, rc.bottom, GetWindowDC(hwndDesk), 0, 0, SRCCOPY);
38
- DrawCursor(hdc);
39
-
40
- GetObject(hbmp, sizeof(BITMAP), &bm);
41
- if (WriteBitmap(TEXT("capture.bmp"), rc.right, rc.bottom, bm.bmBits))
42
- MessageBox(NULL, TEXT("ファイルを作成しました。"), TEXT("OK"), MB_OK);
43
- else
44
- MessageBox(NULL, TEXT("ファイルの作成に失敗しました。"), NULL, MB_ICONWARNING);
45
- // DIBセクションのHBITMAPをSelectObjectしたメモリDCを転送先にしてBitBltしたら、作成時に受け取ったポインタにピクセルデータが格納
46
- SelectObject(hdc, hbmpPrev);
47
- DeleteObject(hbmp);
48
- DeleteDC(hdc);
49
-
50
- return 0;
51
- }
52
-
53
- void DrawCursor(HDC hdc)
54
- {
55
- int x, y;
56
- CURSORINFO cursorInfo;
57
- ICONINFO iconInfo;
58
-
59
- cursorInfo.cbSize = sizeof(CURSORINFO);
60
- GetCursorInfo(&cursorInfo);
61
-
62
- GetIconInfo(cursorInfo.hCursor, &iconInfo);
63
-
64
- x = cursorInfo.ptScreenPos.x - iconInfo.xHotspot;
65
- y = cursorInfo.ptScreenPos.y - iconInfo.yHotspot;
66
- DrawIcon(hdc, x, y, cursorInfo.hCursor);
67
- }
68
-
69
- BOOL WriteBitmap(LPTSTR lpszFileName, int nWidth, int nHeight, LPVOID lpBits)
70
- {
71
- HANDLE hFile;
72
- DWORD dwResult;
73
- DWORD dwSizeImage;
74
- BITMAPFILEHEADER bmfHeader;
75
- BITMAPINFOHEADER bmiHeader;
76
-
77
- hFile = CreateFile(lpszFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
78
- if (hFile == INVALID_HANDLE_VALUE)
79
- return FALSE;
80
-
81
- dwSizeImage = nHeight * ((3 * nWidth + 3) / 4) * 4;
82
-
83
- ZeroMemory(&bmfHeader, sizeof(BITMAPFILEHEADER));
84
- bmfHeader.bfType = *(LPWORD)"BM";
85
- bmfHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwSizeImage;
86
- bmfHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
87
-
88
- WriteFile(hFile, &bmfHeader, sizeof(BITMAPFILEHEADER), &dwResult, NULL);
89
-
90
- ZeroMemory(&bmiHeader, sizeof(BITMAPINFOHEADER));
91
- bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
92
- bmiHeader.biWidth = nWidth;
93
- bmiHeader.biHeight = nHeight;
94
- bmiHeader.biPlanes = 1;
95
- bmiHeader.biBitCount = 24;
96
- bmiHeader.biSizeImage = dwSizeImage;
97
- bmiHeader.biCompression = BI_RGB;
98
-
99
- WriteFile(hFile, &bmiHeader, sizeof(BITMAPINFOHEADER), &dwResult, NULL);
100
-
101
- WriteFile(hFile, lpBits, dwSizeImage, &dwResult, NULL);
102
-
103
- CloseHandle(hFile);
104
-
105
- return TRUE;
106
- }
107
-
108
- HBITMAP CreateBackbuffer(int nWidth, int nHeight)
109
- {
110
- LPVOID lp;
111
- BITMAPINFO bmi;
112
- BITMAPINFOHEADER bmiHeader;
113
-
114
- ZeroMemory(&bmiHeader, sizeof(BITMAPINFOHEADER));
115
- bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
116
- bmiHeader.biWidth = nWidth;
117
- bmiHeader.biHeight = nHeight;
118
- bmiHeader.biPlanes = 1;
119
- bmiHeader.biBitCount = 24;
120
-
121
- bmi.bmiHeader = bmiHeader;
122
-
123
- return CreateDIBSection(NULL, (LPBITMAPINFO)&bmi, DIB_RGB_COLORS, &lp, NULL, 0);
124
- }
125
- ```
126
-
127
-
128
-
129
- ### 発生している問題・エラーメッセージ
130
-
131
- 下記記載しますと画像作成でいたらずSTOPてしいました
1
+ ※前回質問続行します。間違えて立ててしためこち削除しま
132
- ```c
133
- printf("%d\n", hbmpPrev[0]);
134
- ```
135
- BitBltの転送先の
136
-
137
-
138
- ### 補足情報(FW/ツールのバージョンなど)
139
- 言語:C
140
- コンパイラ:gcc
141
- OS:Windows10
142
-
143
-
144
- ### 試したこと
145
- hdcからデータ取得なども試みましたが、具体的にポインタ情報などどのように取得できればよいか見つからず、[以前質問](https://teratail.com/questions/336358)からのより細かいデータ取得方法になるため別質問を立てました。アドバイス何か頂けないでしょうか。よろしくお願い致します。